Atividade obrigatória 4
Implementação de um relógio digital/cronômetro
Esta atividade será usada na Atividade 5, que usará o simulador jarm do Prof. Anido,
com interrupções e displays gráficos de 7 segmentos.
No entanto, o núcleo básico e mais complexo, está na atividade atual.
Suponha que na memória RAM temos uma cadeia de 8 caracteres representando o conteúdo
de um relógio digital no formato "hh:mm:ss".
Você deverá escrever uma subrotina soma1 que toma como parâmetro em r0
o endereço da cadeia; ela deve incrementar o relógio de 1 segundo a cada chamada.
A subrotina deve também ajustar de forma apropriada os outros dígitos do relógio; deve
inclusive reiniciar a contagem quando o relógio atinge 24 horas, ou seja, se o conteúdo atual
do relógio for "23:59:59", ao ser chamada a subrotina ele passa a ter "00:00:00".
(no caso de uma situação real a subrotina seria disparada através de uma interrupção
que ocorreria a cada segundo).
A fim de permitir a verificação pelo Susy as seguintes condições devem ser satisfeitas:
- o relógio deve ser inicializado em tempo de montagem com a cadeia "23:59:48";
- após cada chamada da subrotina o conteúdo da cadeia deve ser exibido via printf
usando o formato "%s\n";
- a subrotina deve ser chamada 32 vezes
A saída no vídeo deve ser, portanto,
23:59:49
23:59:50
23:59:51
23:59:52
23:59:53
23:59:54
23:59:55
23:59:56
23:59:57
23:59:58
23:59:59
00:00:00
00:00:01
00:00:02
00:00:03
00:00:04
00:00:05
00:00:06
00:00:07
00:00:08
00:00:09
00:00:10
00:00:11
00:00:12
00:00:13
00:00:14
00:00:15
00:00:16
00:00:17
00:00:18
00:00:19
00:00:20
O que se segue ilustra a situação real e está relacionado apenas com o próximo laboratório.
O seguinte pseudo-código ilustra uma solução com interrupções:
char relogio[]="23:59:48"
int flag=0
main{
while (1){ //laço infinito: incrementa o relógio 1 vez/segundo
while (flag==0){} // sairá desse laço infinito quando a interrupção mudar o valor de flag
soma1(&relógio)
print (&relogio)
flag= 0
}
}
rotina_de_interrupção{ //será executada via interrupção 1 vez por segundo
flag=1
}