Autor Tema: problema interrupción timer1  (Leído 2461 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado hibiscusblau

  • PIC10
  • *
  • Mensajes: 26
problema interrupción timer1
« en: 15 de Febrero de 2013, 08:53:27 »
Buenas,

Estoy configurando mi dsp30f6014A para que cada 1ms me salte la interrupción.

He inicializado el timer de la siguiente forma:

Código: [Seleccionar]
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:
Código: [Seleccionar]
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:
Código: [Seleccionar]
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?

Desconectado Sispic

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
Re: problema interrupción timer1
« Respuesta #1 en: 16 de Febrero de 2013, 05:19:38 »
Yo haria todos los calculos de segundos y minutos en la T1Interrupt
el return; te lo puedes ahorrar.