Aula_1 - demic
Transcrição
Aula_1 - demic
MSP430 • • Revisão da linguagem C. Estrutura de entrada e saída digital do MSP430 Estrutura básica de um programa Todo programa em consiste de uma ou mais funções; Todo programa deve conter pelo menos a função primária “main”: <declaração de variáveis globais> int main(void) { <declaração de variáveis locais>; <instruções>; return 0; } Exemplo 1 float req; float resistencia_equivalente(float r1, float r2) { return (r1*r2)/(r1+r2); } int main(void) { req = resistencia_equivalente(100,10); return 0; } Exercícios Cada grupo de entregar os exercícios no e-mail [email protected]. Até as 12h00 do dia 03/10. Basta entregar o arquivo principal e os headers se necessário; Nomeie o arquivo principal no formato: GRUPO_(número do grupo)_EX_(número do exercício).c Exemplo: GRUPO_02_EX_4.c (exercício 4 do grupo 2) Obs: coloque como assunto do e-mail o nome do arquivo. Exercício 1 Faça um programa que tire a média de dois números. Tipos de Dados Os dados podem assumir cinco tipos básicos em C que são: char: Caracter: O valor armazenado é um caractere. Caracateres geralmente são armazenados em códigos (usualmente o código ASCII). int: Número inteiro é o tipo padrão e o tamanho do conjunto que pode ser representado normalmente depende da máquina em que o programa está rodando. float: Número em ponto flutuante de precisão simples. São conhecidos normalmente como números reais. double: Número em ponto flutuante de precisão dupla void: Este tipo serve para indicar que um resultado não tem um tipo definido. Uma das aplicações deste tipo em C é criar um tipo vazio que pode posteriormente ser modificado para um dos tipos anteriores. Modificadores dos Tipos Básicos: Modificadores podem ser aplicados a estes tipos. Estes modificadores são palavras que alteram o tamanho do conjunto de valores que o tipo pode representar. long: permite que possam ser armazenados números inteiros maiores. unsigned: só números sem sinal possam ser armazenados pela variável. short: permite que possam ser armazenados números inteiros menores. signed: a variável reserva o bit de sinal. Tipos de variáveis com modificadores Tabela: Todos os Tipos de dados definidos para o MSP430 Tipo Tamanho em Bytes Faixa Mínima char 1 -127 a 127 unsigned char 1 0 a 255 signed char 1 -127 a 127 int 2 -32.768a 32.767 unsigned int 2 0 a 65.536 signed int 2 -32.768a 32.767 short int 1 -127 a 127 unsigned short int 1 0 a 255 signed short int 1 -127 a 127 long int 4 -2.147.483.648 a 2.147.483.647 signed long int 4 -2.147.483.648 a 2.147.483.647 unsigned long int 4 0 a 4.294.967.295 float 4 Seis digitos de precisão double 8 Dez digitos de precisão long double 10 Dez digitos de precisão Controle de Fluxo Os comandos de controle de fluxo podem ser divididos em dois grupos: Instruções condicionais; estrutura de repetição. If e else if (condição 1) { instrução para condição 1; } else if (condição 2) { instrução para condição 2; } . . . else { instrução para nenhuma condição verdadeira; } Switch switch(expressão) { case constante1: seqüência de comandos break; case constante2: seqüência de comandos break; case constante3: seqüência de comandos break; . . . default: seqüência de comandos } for for(inicialização; condição ; incremento) { comando; } Exemplo: #include<io430.h> int main(void) { int n; for(n=1; n<=10; n++) { P1OUT ^= 0xff; } } While while (condição) { Instrução; } Exemplo: #include<io430.h> int main(void) { int n = 0; while(n <=255) { P1OUT = n; n = n+1; } } do-while Do{ Instrução; }while(condição) Exemplo: #include<io430.h> int main(void) { int n = 255; Do{ P1OUT = n; }while(n>0) } MSP430G2553 • Estrutura de entrada e saída digital do MSP430 Digital I/O O MSP430 possui até oito portas digitais (P1 a P8); Cada porta com até oito pinos de I/O; Cada pino pode ser individualmente programado como entrada ou saída; Apenas as portas P1 e P2 possuem capacidade de interrupção. As interrupções podem ser programa em cada pino individualmente tanto na borda de subida ou na borda de descida. O MSP430G2553 possui apenas a P1 e P2 Direction Registers PxDIR Cada bit em cada registrador PxDIR seleciona a direção do correspondente pino de I/O; Bit = 0: O pino é selecionado como entrada Bit = 1: O pino é selecionado como saída Exemplo de código C: P1DIR = 0x01; //O bit 0 da P1 é selecionado como saída, //os outros bits são entrada P1DIR = P1DIR|0x01; //O bit 0 da P1 é selecionado como saída, //os outros bits continuam como estavam /*A linha de código acima também pode ser escrita como:*/ P1DIR |= 0x01; Input Register PxIN É um registrador de apenas leitura! Cada bit em cada registrador PxIN reflete o valor do sinal digital de entrada. Bit = 0: A entrada é baixa; Bit = 1: A entrada é alta. Exemplo de código C: int x = P1IN; //Todo o byte é escrito na variável x. x = P1IN & 0x01; //A penas o bit 0 é selecionado Output Registers PxOUT Cada bit em cada registrador PxOUT seleciona o valor de saída do correspondente pino de I/O; Bit = 0: O pino é baixo Bit = 1: O pino é alto Exemplo de código C: P1OUT = 0x01; //O pino 0 da P1 é alto, //os outros bits são baixo P1OUT = P1OUT|0x01; //O pino 0 da P1 é alto, //os outros pinos continuam como estavam /*A linha de código acima também pode ser escrita como:*/ P1OUT |= 0x01; Pullup/Pulldown Resistor Enable Registers PxREN Cada bit em cada registrador PxREN habilita ou desabilita os resistores de pullup/pulldown do correspondente pino de I/O; Bit = 0: Desabilita os resistores; Bit = 1: Habilita os resistores; Exemplo de código C: P1REN = 0x01; //Habilita os resistores do pino 0 da P1 //desabilitando os resistores dos outros //pinos P1REN = P1REN|0x01; //Habilita os resistores do pino 0 da P1, //os outros pinos continuam como estavam. /*A linha de código acima também pode ser escrita como:*/ P1REN |= 0x01; Function Select Registers PxSEL and PxSEL2 Habilitam ou desabilitam o uso de outros periféricos no pino selecionado; O datasheet deve ser consultado! Funções alternativas dos pinos Exercício 2 Com base no que foi explicado até agora crie um programa que pisque o led vermelho (P1.0) 3 vezes e depois pisque o led verde (P1.6) 3 vezes continuamente após pressionar o botão (P1.3). Faça comentários quando necessário. Interrupções da P1 e P2 Cada pino das portas P1 e P2 tem capacidade de interrupção. Todos os pinos da P1 interrompem para o mesmo vetor de interrupção. Todos os pinos da P2 interrompem para o outro vetor de interrupção. As interrupções podem ser configuradas pelos registradores: PxIFG, PxIE, PxIES. Obs.: Ao lidar com interrupções a flag de interrupções globais (GIE) deve ser setada. Interrupt Flag Registers P1IFG, P2IFG Cada bit desses registradores representa a uma flag de interrupção para o correspondente bit da porta. Exemplo: Se o quarto bit do registrador P1IFG tiver o valor igual a 1 significa que ocorreu uma “borda” no pino 5 da porta P1. Bit = 0: nenhuma interrupção pendente Bit = 1: interrupção pendente Interrupt Edge Select Registers P1IES, P2IES Seleciona o tipo de borda a ser detectado para o respectivo pino. Bit = 0: O PxIFG é setado na borda de subida. Bit = 1: O PxIFG é setado na borda de descida. Interrupt Enable P1IE, P2IE Habilita a interrupção no respectivo pino. Bit = 0: A interrupção é desabilitada. Bit = 1: A interrupção é habilitada. Obs.: Após a rotina de interrupção o bit do P1IFG deve ser limpado. Exemplo #include <msp430g2553.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; P1DIR |= 0x01; P1OUT |= 0x01; P1REN |= 0x08; P1IE |= 0x08; P1IES |= 0x08; P1IFG &= ~0x08; _BIS_SR(GIE); while(1); // // // // // // // Stop P1.0 P1.0 P1.3 P1.3 P1.3 P1.3 watchdog timer output set pullup interrupt enabled Hi/lo edge IFG cleared // Enter LPM4 w/interrupt } // Port 1 interrupt service routine #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) { P1OUT ^= 0x01; P1IFG &= ~0x08; } // P1.0 = toggle // P1.3 IFG cleared Exercício 3 Utilize a interrupção da P1 para fazer os leds piscarem (P1.0 e P1.6) quando o botão (P1.3) for pressionado e pararem de piscar quando o botão for pressionado novamente. Faça os comentários necessários.