Boa Noite sou iniciante na área comprei dois livros do Fábio Pereira: HCS08 E HC908Q estou começando a fazer os exercício do livro HCS08. Tenho um módulo da Freescale com o microcontrolador mc9s08qe8 e utilizo o CodeWarrior, quero programar para este módulo, estou fazendo este exercício e não está executando como pretendido, ele esta entrando no loop e não chamando a função de interrupção:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
unsigned int segundos, minutos, horas;
//Tratamento da interrupção RTCSC (RTI)
void interrupt 25 trata_rcsc()//Esta função é chamada uma vez a cada segundo
{
RTCSC_RTCLKS1 = 1; //Limpa o flag RTIF
PTCD_PTCD0 = !PTCD_PTCD0; //Inverte o estado do LED
segundos++; //Incrementa os segundos
if(segundos>59) //Se for maior que 59
{
segundos = 0; //Zera os segundos
minutos++; //Incrementa os minutos
if(minutos>59)
{
minutos = 0;//Se for maior que 59
horas++; //Incrementa as horas
if(horas>23) horas=0;
}
}
}
void main(void) {
SOPT1 = 0x00;//Desativa o COP e o BKGDPE
ICSC1 = 0x80;//Seleção do clock externo
ICSC2 = 0X00;//Seleção do fator de divisão por 1
ICSSC = 0x0a;//Indicador da fonte de clock externa e oscilador operante
RTCSC = 0x37;//RTIE(habilita interrupção + RTCLKS0 (seleciona clock externo) + div32768
PTCDD_PTCDD0 = 1;//Configura o pino PTC0 como saída
PTCD_PTCD0 = 1;//Liga o LED
horas = minutos = segundos = 0;//Zera variáveis
EnableInterrupts; /* enable interrupts */
/* include your code here */
for(;;) {
__RESET_WATCHDOG(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
Fiz várias modificações do exemplo do livro, pois vário registrador tem nome diferente da biblioteca que quero programar (MC9S08QE8.h), algumas dúvidas que ficou foi:
1º No livro utiliza o RTI (Interrupção de Tempo Real), não consegui achar na biblioteca este registrador, mas encontrei um parecido não se é o mesmo com o outro nome: RTCSC será que é o mesmo? E se a interrupção tem o mesmo número (25)?
2º Desativei o COP no começo da main, devo utilizar o __RESET_WATCHDOG(), para continuar desativando ou não há a necessidade?
3º Para configurar o oscilador no livro é utilizado o registrador ICG, também não consegui encontrar este registrador, encontrei outro para configuração do oscilador o ICS nele configurei para clock do oscilador externo, não sei o clock desse oscilador acredito que é 32768Hz assim tendo interrupção a cada 1 segundo, neste módulo quanto que vale este oscilador?
4º Devo ter um loop infinito continuar executando o programa para sempre e dar interrupção a cada segundo ou não há necessidade?
5º Na função de interrupção é necessário ter um return para sair da função ou não?
Caso tenho colocado alguma coisa errado me corrige, obrigado pela ajuda!