Atividade 3: Implementando um " relógio de parede" através de interrupções
- Deseja-se interromper a CPU de um ATmega88 de 1 Mhz (default de uma CPU
sem relógio externo e sem programação de fusível) uma vez por segundo utilizando
interrupções do Timer/Counter 0 a fim de atualizar um "relógio de parede" conforme
especificação a seguir. Verifique através do datasheet (p. 103) que mesmo com o
valor máximo do pre-scaler (1024) isto não é possível.
Para resolver este problema, escreva uma rotina de interrupção
count1sec acionada pelo Timer/Counter 0 que através de um contador global
atualizado pela rotina de interrupção invoca a subrotina clock
que atualizará o relógio de parede uma vez por segundo. Para testar o seu programa,
a subrotina clock deve simplesmente incrementar um contador binário de segundos e retonar.
Teste o seu programa com o simulador disparando o seu programa via F5 e interrompendo-o
n segundos depois (ajuste n pois o simulador é pelo menos 20 vezes mais lento que um sistema real)
- Escreva um programa que inicializa o timer0 para interromper a CPU a cada tick do relógio
em vez de a cada segundo conforme colocado no item anterior. Razão: Você vai usar
o recurso de "auto step" do simulador para depurar e ele é muito lento e sem correlação com
o tempo real das interrupções. Escreva uma rotina de interrupção que essencialmente
implementa o "relógio de parede" abaixo especificado. Você deve
vizualizar a atualização do "relógio de parede" usando o recurso de "Auto Step"
do simulador. Após as devidas inicializações seu programa deverá "ficar dormindo" num laço
usando a técnica de sleep explicada em aula
Sugestão: para depurar o seu programa diminuia o tempo da simulação
alterando durante a simulação
"passo a passo" o valor inicial do relógio na própria memória RAM. Por exemplo, se Você
colocar como valor inicial 23h 59min 00 segs (em hexadecimal teriamos 3233 3539 3030)
e disparar a simulação com o "Auto Step" (ALT-F5) Você deverá ver o relógio passar
para 23h 59min 59s e depois para 24h 00min 00 seg e imediatamente para 00h 00min 00 segs.
Opcional: utilize o HAPSIM para exibir o relógio de parede no simulador de display LCD.
- Escreva inteiramente na linguagem C o programa do item 2 acima.
Especificação do relógio de parede
Escreva uma subrotina clock que toma como entrada um apontador no par X
para uma área de memória com 6 bytes onde é mantido um contador de tempo em ASCII no formato
hhmmss ( horas minutos segundos), onde os bytes do contador conterão os
seguintes valores máximos (em ASCII): 59hs, 59 mins, 59 segs.
O contador deve ser inicializado com os valores ASCII
00, 00, 00 (em hexadecimal: 3030, 3030, 3030). Cada chamada à subrotina deve somar 1
segundo ao contador e os seus dígitos devem ser atualizados de forma apropriada.
Depure a sua subrotina com o recurso de "Auto Step" do simulador.
Sugestão: na entrada da subrotina some 6 ao par X (alternativamente Você pode chamar
a subrotina passando em X o endereço inicial do relógio na RAM +6) e utilize o recurso
de endereçamento com predecrementação de X para varrer e atualizar os dígitos do contador
da "direita para a esquerda"; se escrita com cuidado sua subrotina conterá apenas 15
instruções e poderia ser usada, por exemplo, para manter um "relógio de parede"
acionado a cada segundo por uma rotina de interrupção, tópico deste laboratório.
A subrotina deverá também zerar o contador quando o mesmo atingir
o valor 24:00:00 hs. Sugestão: para este fim escreva uma subrotina
chk24h e chame-a imediatamente antes de retornar da subrotina clock
(chk24h pode ser escrita com apenas 9 instruções).
Alternativamente Você pode colocar o código de chk24h diretamente
no final da subrotina clock.