TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ochi en 25 de Abril de 2008, 08:38:40
-
hola, tengo un problemilla con un reloj que intento hacerme (está alto 40 microsegundos y bajo 400 ms). Lo hago utilizando interrupciones del temporizador 2.
Si me interrumpe y tiene el valor PR2 a 400 ms pues lo pongo a 40 microsegundos y al revés.
El problema es que el valor de los 400 ms lo hace bien, sin embargo el de 40 us no. Siempre me sale un nivel alto de 15 ms independientemente del valor que configure (lo estoy mirando en el osciloscopio). Si cambio el de 400 ms cambia bien el nivel bajo.
¿a qué puede deberse? (tengo un dspic30f4013).
Muchísimas gracias. Saludos
-
¿a qué puede deberse? (tengo un dspic30f4013).
ochi, evidentemente a que tu software no hace lo que pretendes hacer. Entenderás que tu pregunta es muy amplia y solo me queda pensar en que tu código está mal hecho, pero como no lo vemos no puedo decir mucho más.
-
copio el código, la parte que falla sólo. Los valores de periodo40us y periodo400ms son constantes que tengo definidas.
int main (void){
CONFIGtimers();
CONFIGinterrups();
TRISD = 0;
LATDbits.LATD2 = 1;
LATDbits.LATD3 = 1;
T2CONbits.TON = 1;
while(1){
}
return 1;
}
void __attribute__((__interrupt__)) _T2Interrupt(void) {
atiende_RX();
IFS0bits.T2IF = 0;
}
void atiende_RX (void) {
T2CONbits.TON = 0;
if(PR2 == periodo40us) {
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
TMR2 = 0;
PR2 = periodo400ms;
T2CONbits.TCKPS = 3;
} else {
LATDbits.LATD2 = 1;
LATDbits.LATD3 = 1;
TMR2 = 0;
PR2= periodo40us;
T2CONbits.TCKPS = 0;
}
T2CONbits.TON = 1;
return;
}
Muchas gracias