ATmega, Serial e 74HC595 - parte 1

Já faz algum tempo que venho estudando sobre programação de AVRs, logo após mexer com Arduino despertei interesse em AVR. Tenho utilizado o micro controlador ATmega388p para meus teste, o mesmo que o Arduino usa. Minha melhor referencia foi o livro Make: AVR Programming do Elliot Williams, um livro que recomendo para todos que como eu não sabia nada de AVR. Um assunto interessante nesse livro é o tratamento da serial (USART) do ATmega, o autor criou uma biblioteca muito bacana e útil, e como ele próprio diz no livro, podemos usá-la sem restrições.




Minha ideia aqui é usar a serial para digitar no PC um numero em decimal 8 bits (0 a 255), e o micro controlador converter para um 74HC595 que irá acender oito leds (8 bits). Porque um HC595 e não diretamente nas portas do micro controlador? Já que ele possui portas suficientes. A ideia aqui é aprender a trabalhar com a serial, com o HC595 e entender um pouco mais de micro controlador. Basicamente o HC595 recebe dados de 8 bits serialmente e externa esses dados em 8 pinos de forma paralela, para isto ele precisa do pino de dados (DS) que irá trabalhar junto com o clock (SH_CP), para cada subida do clock precisa ser enviado um bit. No fim dos 8 bits é necessário um pulso latch (ST_CP).



Vou dividir esta postagens em mais de uma parte para não ficar um assunto muito grande. Eu fiz três programas, todos com o mesmo com o mesmo funcionamento, a medida que as ideias foram surgindo fui modificando de acordo com que achava mais interessante. Para a USART, usei partes da biblioteca USART.c do Williams que está disponível neste pacote AQUI. Para o lado do HC595 achei este interessante programa onde baseie o restante das minhas ideias.

No ATmega328p, na parte da USART primeiro precisamos fazer todo o setup inicial, que acontece aqui embaixo, não vou detalhar isto mas a maioria das aplicações em serial irá usar esse setup. No datasheet é possível encontrar informações sobre os registradores (bytes e respectivos bits).



As funções enviaByte e recebeByte são as principais e que irão enviar e receber dados pela serial, o funcionamento é simples e usa a macro loop_until_bit_is_set que fica em loop até o respectivo bit ser setado para 1. No caso do envio o byte UCSR0A possui o bit flag UDRE0 que quando vai para 1 carrega o dado e envia pelo byte UDR0 (UDR0 = dado). Já na recepção o bit flag RXC0 quando está em 1 indica que existe dado no buffer UDR0 para ser lido (return UDR0). As outras funções trabalham de acordo com a necessidade e sempre em conjunto com as duas enviaByte e recebeByte. Deixo os comentários dessas funções no próprio código.

No primeiro código que fiz deixei a função do HC595 que encontrei AQUI praticamente intacta e apenas conectei ela no código da serial. No código para o HC595 é interessante a parte “AND” do dado com o byte 128 (data & 0b10000000), onde será enviado para o HC595 0 ou 1 de acordo com o resultado do AND, sendo o bit mais significativo primeiro. O clock é feito dentro da mesma função e gera 0 e 1 a cada ciclo do micro controlador. No fim do “for” ocorre o latch para os dados serem “mostrados” nos pinos do HC595. Na próxima postagem irei mostrar o mesmo resultado trabalhando com timer no lugar dos atrasos (delay).



Abaixo segue o código completo e um Makefile do Willians pronto para a compilação. Para rodar o makefile abra este arquivo, comente ou retire o comentário (#) desejado na parte MAIN = Serial_HC595_v1.c, selecione a interface usada em PROGRAMER_TYPE e a porta em PROGRAMER_ARGS caso não seja um USBASP. Depois basta rodar make flash, estando tudo na mesma pasta.





Referencias:
Make: AVR Programming
http://extremeelectronics.co.in/avr-tutorials/using-shift-registers-with-avr-micro-avr-tutorial/

Comentários