Buenas,
Estoy configurando mi dsp30f6014A para que cada 1ms me salte la interrupción.
He inicializado el timer de la siguiente forma:
void ZigInit (void){
//78 = 0x4E --> 65458 = 0xFFB2
TRISGbits.TRISG12 = 0; //poso el RG12 com a sortida. //
LED = 0;
// s'incrementa TMRx cada n cicles d'instrucció (amb preescalat de 1:n). Quan TMRx = PRx es genera una interrupció Tx - Timer x. automaticament TMRx es posa a 0.
TMR1 = 0x0000; //contador de 16 bits
PR1 = 0x004E; // //període per temporització de 16 bits
// Per PR1 = 0x85ED --> preescaler 256, 14segons.
//IFS0bits.T1IF: Timer1 Interrupt Flag Status bit
//1 = Interrupt request has occurred
//0 = Interrupt request has not occurred
IFS0bits.T1IF = 0;
T1CONbits.TON = 1;
T1CONbits.TSIDL = 0;
T1CONbits.TGATE = 0;
T1CONbits.TCKPS = 3; // 11 prescaler 256
T1CONbits.TCS = 0; // external clock =0b1000000000000000; //0x8030
IEC0bits.T1IE = 1;
ms = 0;
segons = 0;
minuts = 0;
}
y en la rutina de interrupción tengo:
void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt(void)
{
LED = 1;
IFS0bits.T1IF = 0; //baixo el flag de l'interrupcó del Timer1
ms = ms +1;
return;
}
Luego, en el main llamo a una función que me controla el tiempo pasado:
void ZigControlTime (){
LED = 0;
if (ms == 1000){
segons = segons +1;
sprintf(sTxt, "\r\n segons: %d ",segons);
putsUART1((unsigned int *)sTxt);
ms = 0;
}
if (segons >= 60 ){
minuts = minuts + 1;
sprintf(sTxt, "\r\n minuts: %d ",minuts);
putsUART1((unsigned int *)sTxt);
segons = 0;
}
if (minuts == 5){
minuts = 0;
//envia dades pel zigbee
}
}
Como podeis ver, muestro al hyperterminal por la UART1 los segundos, perfecto hasta el valor 23.... Me muestra esto:
segons: 1
segons: 2
segons: 3
segons: 4
segons: 5
segons: 6
segons: 7
segons: 8
segons: 9
segons: 10
segons: 11
segons: 12
segons: 13
segons: 14
segons: 15
segons: 16
segons: 17
segons: 18
segons: 19
segons: 20
segons: 21
segons: 22
segons: 23
segons: 55
segons: 5555
segons: 5555555
segons: 555555555
segons: 55555555555
segons: 5555555555555
¿Porqué me canvia el valor si es un simple integer?
En este momento tengo comentado la interrupción del ADC, pero si la activo, cuando llego al "segons: 9", al "segon: 16", al "segon: 23" también me salta la otra interrupción, dandome un valor del ADC incorrecto.
Alguien puede ayudarme?