Error de retardo de tiempo

0

Soy nuevo en la programación de sistemas embebidos. Estoy trabajando en el reloj usando el temporizador 8051 y la interrupción. El retraso es perfectamente de 1 s, pero cuando ejecuto mi reloj con el reloj de la computadora, pierdo 3-5 s en 10 minutos. Intento muchos valores de interrupción pero no tengo éxito. Por favor, ayuda ...

retraso ();

void delay(int a)
{

for (i=0;i<a;i++){
        TH1 = 0XA5;
        TL1 = 0XFE;
        TR1 = 1;
        while(TF1==0);
        TR1 = 0;
        TF1 = 0;
}


}

interrumpir;

void timer(void) interrupt 1        //interrupt no. 1 for Timer 0
{

TH0 = 0xF6;
TL0 = 0x36;
P2=0xFF;
dig_1 = dig_2 = dig_3 = dig_4 =dig_5 = dig_6 =0;

dig++;
dig=dig%6;

switch(dig)
{
    case 0:
    P2=digit[sec1];
    dig_1 = 1;
    break;

    case 1:
    P2= digit[sec2];
    dig_2 = 1;
    break; 

    case 2:
    P2=digit[min1];
    dig_3 = 1;
    break;

    case 3:
    P2= digit[min2];
    dig_4 = 1;
    break;

    case 4:
    P2=digit[hr1];
    dig_5 = 1;
    break;

    case 5:
    P2= digit[hr2];
    dig_6 = 1;
    break;

}


}

main ();

{
j=0;


TMOD = 0x11;        // mode1 of Timer0
//2720us

TH0 = 0xF6;
TL0 = 0x36;
ET0=1;              // enable timer0 interrupt 
EA=1;               // enable interrupts 
TR0 = 1;        //start timer


while(1)        // Forward counting
    {
    hr1=hr2=min2=min1=sec2=sec1=0;
    for(hr2=0;hr2<3;hr2++){
        if(hr2 == 0 || hr2 ==1){
            l = 10;
        }
        if(hr2 == 2){
            l = 4;
        }
            for(hr1=0;hr1<l;hr1++){  

              for(min2=0;min2<6;min2++){
                for(min1=0;min1<10;min1++){
                  for(sec2=0;sec2<6;sec2++){
                    for(sec1=0;sec1<10;sec1++){
                        delay(40);
                        if(ctrl_1 ==0){
                            setting();
                        }

                    }
                  }
                }
              }
            }
        }

    }   
}
    
pregunta Mohit

1 respuesta

1

La interrupción no es mágica: cuando se produce una interrupción, el bucle de retardo se detiene momentáneamente mientras el procesador roba ciclos para multiplexar la rutina de visualización, y luego se reanuda, por lo que la rutina de demora tarda más de lo esperado en completarse (y tiembla un poco) ), por lo tanto su reloj corre lento. Puede ajustar la rutina de retraso, pero no sugiero que (podría haber problemas). El tiempo entre las llamadas de demora también debe tenerse en cuenta.

Ignorando los detalles sangrientos de los temporizadores 8051, en general, en esta situación, debe hacer la sincronización importante utilizando interrupciones de temporizador de un temporizador de carrera libre , no un retraso lazo. Puede contar en su rutina de interrupción y establecer un indicador cada xx milisegundos para que la multiplexación se realice en su rutina principal (). Main solo espera una bandera y luego hace el siguiente dígito múltiplex. De esa manera, su reloj puede mantener el mejor momento que el cristal (lo cual puede no ser bueno, pero debería ser mucho mejor). También puede hacer la visualización mux en el ISR si el tiempo se agota, lo que reduciría la fluctuación de la pantalla.

En general, nunca use un retardo en bucle () para cualquier cosa donde el tiempo exacto sea importante (está bien para generar un mínimo retardo), de hecho, es mejor (nunca) usarlo en absoluto una vez que llegue más allá del "hola, mundo", el tipo de LED parpadea.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas