Mini curso sobre AVR parte 4 - primeiro projeto no AVRStudio e portas

Depois de instalar o AVRStudio e o WinAVR vamos criar o primeiro projeto.

1-Vá em Project-New project wizard, selecione AVR GCC e escolhe uma pasta e nome para ele

2-Dê next, em Debug platform selecione AVR simulator e logo ao lado em device escolha o ATMEGA16


3- Clique em finish, pronto, seu projeto está criado e é só começar a fazer algum programa em C, a pasta onde se encontrará o arquivo hex para gravação é a default que se encontra na pasta onde está o arquivo de projeto.

Portas do ATMEGA16:

Esse AVR tem 4 portas, PORTA, B, C, D, cada porta têm 4 registros relacionados, são eles:

DDRx: Indica a direção do bit relativo ao PORTx, onde o respecivo bit de DDRx sendo 1 indica que o pino do PORTx correspondente será saída, para o bit DDRx como 0, o pino é entrada.

PORTx: Gravar nesse registro, caso os correspondentes DDRx sejam 1 corresponde a alterar os bits da porta x. Ler esse registro lê o conteúdo do último PORTx gravado.

PINx: ao ler esse registro, você leu o valor dos pinos na porta x de 1/2 a 1,5 clock atrasado do valor atual, lembre-se que é necessário sincronizar o dado no pino de entrada.

Bit PUD no registro SFIOR: em 1 desabilita todos os pullups.

Para entender melhor como os pullups são desativados pino a pino, quando o pino é entrada ou saída, a tabela ao lado exemplifica.

Agora tratando mais sobre o lado do AVR-GCC. ele não tem bibliotecas inúteis e criadora de falsos "entendidos" como em comipladores mikro* e outros por aí, tudo que você faz é facilmente portável a qualquer outra arquitetura, em todo o curso apenas serão usadas funções prontas básicas como delays.

Já que se o projetista não entende do seu hardware. como ele irá fazer um firmware bom?

Isso aprendi em assembly, e é base para qualquer projeto decente .

Resumindo:
1-Portabilidade
2-Entender e utilizar o seu microcontrolador sem bibliotecas prontas

O arquivo io.h contém todas as definições de nomes de registradores do seu AVR selecionado, após o io.h receber a informação de que é o ATMEGA16 que será usado, o io.h fará o incude do iom16.h, ele está dentro da pasta do WinAVR, em avr\include\avr.

Vamos pegar como exemplo o DDRD (registro de direção de dados da porta D), obtemos:

#define DDRD _SFR_IO8(0x11)
#define DDD0 0
#define DDD1 1
#define DDD2 2
#define DDD3 3
#define DDD4 4
#define DDD5 5
#define DDD6 6
#define DDD7 7

Como se observa, DDRD é o registro correspondente 0x11, e DDD0~7 são alusões aos bits de DDRD.

Como lidar individualmente com esses bits, de uma forma portável?

A maneira mais imediata é fazer DDRD |=0x80; para setar o bit 7 e DDRD &= 0x7F; para mandar o bit 7 para 0, mas outros jeitos, como por exemplo:

DDRD |= _BV(DDD7); ou DDRD &= ~_BV(DDD7);

O que o marcro _BV(a) , contido em sfr_defs.h faz é devolver 1 deslocado à esquerda de a vezes, número esse que será considerado pelo compilador como uma constante.

Para esse tipo de declaração, onde um único bit é modificado o compilador usa as instruções sbi (set bit) e cbi (clear bit), para se carregar um determinado registro com dados, pode se usar:

O código gerado fica:

85 e0 ldi r24, 0x05 ;
81 bb out 0x11, r24 ;



Observe que as chaves têm capacitores, de forma a não haver bounce nas chaves, o que torna o trabalho ainda mais fácil, serão usadas as rotinas de delay do util/delay.h ,elas exigem que o clock esteja definido por F_CPU.

Abaixo vai o programinha, testado aqui
e aplica alguns conceitos de lógica que foram relembrados nesse post.

O programinha está em jpg, pra incentivar a cópia, já que segundo um professor meu "quem copia aprende!" (clique na figura para ver melhor), na verdade o problema foi que o blogger não gostou do código C :s






Até a próxima!

1 comentários:

Jaci Gomes disse...

Parabéns pela iniciativa, estou aguardando as próximas aulas.

Postar um comentário