¿Cómo reducir el error del temporizador del microchip Atmel 89S51?

2

Escribí un código simple que cuenta 30 segundos utilizando el temporizador 0 (Modo 0, es un contador de 13 bits) de Atmel 89S51, y utilicé Proteus para simular. Después de 30 segundos, la luz LED debe estar encendida.

Encontré que la luz LED se encendería a aproximadamente 31 segundos, que parece ser un error de 1 segundo. Creo que este error no es aceptable ya que solo cuento 30 segundos.

En esta imagen puede ver el resultado de la simulación:

Aquí está el código:

#include <reg51.h>
long i=0;

main()
{   
  EA=1;       //Enable EA bit
  ET0=1;      //Enable Timer 0
  TMOD=0x00;  //Use Timer 0, Mode 0

  TH0=(8192-1000)/32;  //Count 1ms
  TL0=(8192-1000)%32;
  TR0=1;      //Start Timer 0

  while(1);
} 

void T0_int(void) interrupt 1
{
  TH0=(8192-1000)/32;
  TL0=(8192-1000)%32;
  //if i==30000,30000*1ms=30s
  if(++i==30000)  
   {
      P1=~0x01;
   }
}

¿Perdí algo o hay alguna forma de reducir este error?

    
pregunta Po-Jen Lai

2 respuestas

4

No soy un experto en este chip. Aún así, veo una fuente común de inexactitud en su programa: cuando el contador se agota, la interrupción se activa, y después de eso configura el TL0, lo que hace que el contador comience a contar nuevamente sus 1 ms. Por lo tanto, hay un tiempo muerto entre cada intervalo de 1 ms que se 'pierde'. No estoy seguro de que esto sea suficiente para explicar su desviación, pero podría ser.

Hay varias formas de reducir este tiempo 'perdido':

  • experimente, mida y adapte el valor que asigne a TH0 en consecuencia (estilo de desarrollo de cinta adhesiva)
  • intercambiar las asignaciones de TL0 y TH0 (el efecto será pequeño)
  • (suponiendo que el contador siga funcionando) en lugar de asignar un nuevo valor a TL0, puede actualizarlo (manteniendo los conteos que ya ha acumulado): TL0 = TL0 - ((8192 - 1000)% 32);

Pero la única solución real es mantener el temporizador funcionando libremente y ser más inteligente con el conteo de los tiempos de espera.

    
respondido por el Wouter van Ooijen
0

++ i y i ++ son diferentes.

  • i ++ devolverá el valor de i y luego lo incrementará
  • ++ i primero incrementará el valor almacenado en i y luego devolverá su valor
respondido por el saafir01

Lea otras preguntas en las etiquetas