Autor Tema: problema de tiempos  (Leído 1400 veces)

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

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
problema de tiempos
« 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

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: problema de tiempos
« Respuesta #1 en: 25 de Abril de 2008, 09:23:27 »
¿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.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
Re: problema de tiempos
« Respuesta #2 en: 28 de Abril de 2008, 04:15:08 »
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