Upload
doandiep
View
244
Download
6
Embed Size (px)
Citation preview
• Revisão da linguagem C.
• Estrutura de entrada e saída digital do
MSP430
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)
}
• Estrutura de entrada e saída digital do
MSP430
MSP430G2553
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; // Stop watchdog timer P1DIR |= 0x01; // P1.0 output P1OUT |= 0x01; // P1.0 set P1REN |= 0x08; // P1.3 pullup P1IE |= 0x08; // P1.3 interrupt enabled P1IES |= 0x08; // P1.3 Hi/lo edge P1IFG &= ~0x08; // P1.3 IFG cleared _BIS_SR(GIE); // Enter LPM4 w/interrupt while(1); } // Port 1 interrupt service routine #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) { P1OUT ^= 0x01; // P1.0 = toggle P1IFG &= ~0x08; // 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.