Mini curso sobre AVR parte 7 - Timer 0 em modo normal e Displays multiplexados


Nesse post vamos usar o display de 4 leds multiplexados que vem no kit, ou seja trabalhar para fazer o refresh nele e também vou mostar um contador de tempo como exemplo.

Tudo começa com o Timer0 novamente, fazendo o prescaler dele para 1024, e colocando o valor do contador TCNT0 para o tempo desejado, no caso 3ms isso deu 0xDD, e habilitando a máscara de interrupção, observe que esse timer 0 tem diversas fontes de interrupções, nesse caso será a de overflow, em TIMSK, o flag também é apagado, para que não ocorra uma interrupção logo ao se habilitar o timer, pode acontecer e dependendo do caso é mau negócio.

Repare que esse timer não faz a recarga do valor automaticamente ao entrar numa interrupção, então, você tem que colocar o valor certo no TCNT0 antes de retornar do ISR.

O ISR é muito simples, onde só é feita a atualização do display e o valor do timer é recolocado em TCNT0, repare que esse timer apaga seu próprio flag automaticamente ao entrar na interrupção, não é preciso se preocupar com isso.

Além disso, na rotina de inicialização do Timer0, o flag é apagado escrevendo-se 1, do mesmo modo que os uc's motorola.

Vejamos o exemplo: (clique na figura para ampliar)

Temos a função de ISR, ela é declarada como ISR pelo AVR-GCC. nada mais fácil! Repare que se você procurar mais códigos de AVR por aí, vai ver muita gente usando SIGNAL para o vetor de interrupção, mas esse tipo de de expressão já foi trocada pela nova ISR, eu mesmo tenho muitos fontes feitos com SIGNAL, agora estou mudando tudo pra ISR.

Observe que o AVR já entra nas interrupções com o flag de interrupção em clear, o que é ótimo e diminui o tamanho do seu código, mas se você quiser ter interrupções dentro da interrupção tudo bem, habilite-as, como no AVR existe stack, e é implementada decentemente (ao contrario dos pic), você pode ter muitas interrupções encadeadas caso precise.

Agora o main():


No main nenhuma novidade, só fiz esse "reloginho" para mostrar como um teste dos displays, não é nem um pouco exato, já que a base de tempo não vem de algum Timer nem eu contei os ciclos para determinar os microsegundos necessários para esse atraso.

E finalmente a última parte, aqui nenhuma novidade também, temos a inicialização do timer, como cheguei no valor de TCNT0? Com certeza não fiz essa conta, afinal isso não é prova em sala de aula, usei ao invés do papel e lápis uma calculadora pronta, que funciona direito e faz contas úteis como de baudrate, lá vai o link:

http://www.electronics-lab.com/downloads/mcu/002/index.html

Só não esqueça de escolher o valor de cristal certo! (12MHz).

É isso, o Timer0 mal tem 1/2 das funções do Timer1 e mesmo assim é muito útil, a série Timer acaba por aqui, logo mandarei mais posts.


Gostou? Comente, não custa nada nem vai gastar o dedo!!!
Não gostou? Principalmente a parte sobre pic? Aperte alt+F4 e vá pescar :P

3 comentários:

Edson Rippert disse...

Excelente tutorial.

Edson Rippert disse...

Excelente tutorial.

Edson Rippert disse...

Excelente Tutorial

Postar um comentário