Beruflich Dokumente
Kultur Dokumente
funes; Todo programa deve conter pelo menos a funo primria main:
<declarao de variveis globais> int main(void) { <declarao de variveis locais>; <instrues>; 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; }
Exerccios
Cada grupo de entregar os exerccios no e-mail
fpfrimer@gmail.com. At as 12h00 do dia 03/10. Basta entregar o arquivo principal e os headers se necessrio; Nomeie o arquivo principal no formato:
GRUPO_(nmero do grupo)_EX_(nmero do exerccio).c
Exemplo: GRUPO_02_EX_4.c (exerccio 4 do grupo 2) Obs: coloque como assunto do e-mail o nome do arquivo.
Exerccio 1
nmeros.
Tipos de Dados
Os dados podem assumir cinco tipos bsicos em C que
so:
char: Caracter: O valor armazenado um caractere. Caracateres geralmente
so armazenados em cdigos (usualmente o cdigo ASCII). int: Nmero inteiro o tipo padro e o tamanho do conjunto que pode ser representado normalmente depende da mquina em que o programa est rodando. float: Nmero em ponto flutuante de preciso simples. So conhecidos normalmente como nmeros reais. double: Nmero em ponto flutuante de preciso dupla void: Este tipo serve para indicar que um resultado no tem um tipo definido. Uma das aplicaes deste tipo em C criar um tipo vazio que pode posteriormente ser modificado para um dos tipos anteriores.
Estes modificadores so palavras que alteram o tamanho do conjunto de valores que o tipo pode representar.
long: permite que possam ser armazenados nmeros inteiros
maiores. unsigned: s nmeros sem sinal possam ser armazenados pela varivel. short: permite que possam ser armazenados nmeros inteiros menores. signed: a varivel reserva o bit de sinal.
unsigned int
signed int short int
2
2 1
0 a 65.536
-32.768a 32.767 -127 a 127
1
1 4 4 4 4 8 10
0 a 255
-127 a 127 -2.147.483.648 a 2.147.483.647 -2.147.483.648 a 2.147.483.647 0 a 4.294.967.295 Seis digitos de preciso Dez digitos de preciso Dez digitos de preciso
Controle de Fluxo
Os comandos de controle de fluxo podem ser
If e else
if (condio 1) { instruo para condio 1; } else if (condio 2) { instruo para condio 2; } . . . else { instruo para nenhuma condio verdadeira; }
Switch
switch(expresso) { case constante1: seqncia de comandos break; case constante2: seqncia de comandos break; case constante3: seqncia de comandos break;
. . . default: seqncia de comandos }
for
for(inicializao; condio ; incremento) { comando; } Exemplo: #include<io430.h> int main(void) { int n; for(n=1; n<=10; n++) { P1OUT ^= 0xff; } }
While
while (condio) { Instruo; } Exemplo: #include<io430.h> int main(void) { int n = 0; while(n <=255) { P1OUT = n; n = n+1; } }
do-while
Do{
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 sada; Apenas as portas P1 e P2 possuem capacidade de interrupo. As interrupes podem ser programa em cada pino individualmente tanto na borda de subida ou na borda de descida.
Exemplo de cdigo C:
P1DIR = 0x01; //O bit 0 da P1 selecionado como sada, //os outros bits so entrada
P1DIR = P1DIR|0x01; //O bit 0 da P1 selecionado como sada, //os outros bits continuam como estavam /*A linha de cdigo acima tambm pode ser escrita como:*/ P1DIR |= 0x01;
Exemplo de cdigo C:
P1OUT = 0x01; //O pino 0 da P1 alto, //os outros bits so baixo
P1OUT = P1OUT|0x01; //O pino 0 da P1 alto, //os outros pinos continuam como estavam /*A linha de cdigo acima tambm pode ser escrita como:*/ P1OUT |= 0x01;
P1REN = P1REN|0x01; //Habilita os resistores do pino 0 da P1, //os outros pinos continuam como estavam. /*A linha de cdigo acima tambm pode ser escrita como:*/ P1REN |= 0x01;
Exerccio 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 aps pressionar o boto (P1.3). Faa comentrios quando necessrio.
Interrupes da P1 e P2
Cada pino das portas P1 e P2 tem capacidade de
interrupo. Todos os pinos da P1 interrompem para o mesmo vetor de interrupo. Todos os pinos da P2 interrompem para o outro vetor de interrupo. As interrupes podem ser configuradas pelos registradores: PxIFG, PxIE, PxIES.
Obs.: Ao lidar com interrupes a flag de interrupes globais (GIE) deve ser setada.
flag de interrupo 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 interrupo pendente
Bit = 1: interrupo pendente
respectivo pino. Bit = 0: O PxIFG setado na borda de subida. Bit = 1: O PxIFG setado na borda de descida.
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); } // Port 1 interrupt service routine #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) { P1OUT ^= 0x01; P1IFG &= ~0x08; }
// // // // // // //
watchdog timer output set pullup interrupt enabled Hi/lo edge IFG cleared
Exerccio 3
Utilize a interrupo da P1 para fazer os leds
piscarem (P1.0 e P1.6) quando o boto (P1.3) for pressionado e pararem de piscar quando o boto for pressionado novamente. Faa os comentrios necessrios.