configurar while loop para ejecutarse por un tiempo específico

-4

¿Cómo hacer que un bucle while se ejecute durante un tiempo específico (digamos 5 segundos)?

while(1)
  {
   int time=0,timeinsec=5;
    while(timeinsec>=time)
    {
    ADMUX = 0xC1;
    ADCSRA = 0xE7;           // wait until conversion starts
    while((ADCSRA & (1<ADIF))==0);    // wait for convarsion to be finish

    lcd_out(1,1,"Current");
    lcd_out(2,1,"temp. is");
    Delay_ms(10);
    a = ADCL;
    b = ADCH;
    a=(a*2.56/1024)*100;
    inttostr(a,disp);
    if (a>=35 && a<40)
    {

      lcd_out(3,1,disp);
      delay_ms(200);
      Lcd_Cmd(_LCD_CLEAR);

    }
    else if(a>40)
    {
    Lcd_Cmd(_LCD_CLEAR);

    lcd_out(2,1,disp);
    lcd_out(3,1,"High Temp.:");

     lcd_out(4,1,"Sending Msg.");
    delay_ms(200);
    }
    else{
    Lcd_Cmd(_LCD_CLEAR);

    lcd_out(3,1,"normal");
    delay_ms(200);
   // UART1_Write(disp);
    }
    //lcd_out(3,1,disp);
   }
    // UART1_Init(9600);
    while(timeinsec>=time)
    {
    ADMUX = 0xC0;
    ADCSRA = 0xE7;           // wait until conversion starts
    while((ADCSRA & (1<ADIF))==0);    // wait for convarsion to be finish

    lcd_out(1,1,"Current");
    lcd_out(2,1,"Press. is");
    Delay_ms(10);
    a = ADCL;
    b = ADCH;
    a=(a*2.56/1024)*100;
    inttostr(a,disp);
    if (a>=35 && a<40)
    {

      lcd_out(3,1,disp);
      delay_ms(200);
      Lcd_Cmd(_LCD_CLEAR);

    }
    else if(a>40)
    {
    Lcd_Cmd(_LCD_CLEAR);

    lcd_out(2,1,disp);
    lcd_out(3,1,"High Pres.:");

     lcd_out(4,1,"Sending Msg.");
    delay_ms(200);
    }
    else{
    Lcd_Cmd(_LCD_CLEAR);

    lcd_out(3,1,"normal Pres");
    delay_ms(200);
   // UART1_Write(disp);
    }
    //lcd_out(3,1,disp);
   }
   }  //UART1_Write(disp);        // and send data via UART

}

el bucle while externo se está ejecutando infinitos veces & Quiero hacer el primer ciclo interno mientras que el bucle debe ejecutarse durante 5 segundos y amp; luego el segundo interior mientras que el bucle para 5 segundos y amp; esto debería ocurrir infinitas veces (mientras que (1)) ...

entonces, ¿cómo es posible ????

    
pregunta user2727383

3 respuestas

1

Lo que quieres hacer es

  • Configure un temporizador de acuerdo con la frecuencia de oscilación del microcontrolador.
  • Configurar una interrupción de temporizador

Combinación de interrupción y temporizador hará el truco.

No puedo ayudarte mucho más sin conocer el modelo del microcontrolador, pero aquí hay un ejemplo de lo que quiero decir

    
respondido por el Iancovici
1

Con Arduino (o AVR en general) a veces tienes la necesidad de ejecutar algún código a intervalos regulares. Una rutina de interrupción programada es la solución adecuada. Esto puede ser bastante complicado para aquellos que no están familiarizados con la programación directa del hardware.

Creé un simple prueba de concepto que se ejecuta en Arduino's ( y se transporta fácilmente al AVR simple) y utiliza una interrupción temporizada para medir el tiempo exacto 1 ms, según el reloj del sistema de 16MHz. Por lo tanto, 1000 cuentas equivalen a 1 segundo con la misma precisión que el reloj del sistema. Como prueba, el LED estándar en el pin 13 comenzará a parpadear a un ritmo de 0.5Hz, un segundo encendido, un segundo apagado.

Timer0 y Timer1 se usan comúnmente para las bibliotecas de Arduino y de terceros, por lo que nos deja con Timer2. El reloj del sistema de Arduino funciona a 16MHz. El temporizador 2 se registra a través de un preescalador, esto básicamente significa que el reloj del sistema se divide primero antes de que se alimente al temporizador / contador. Seleccioné un prescaler 128 configurando TCCR2B. Esto significa que el temporizador / contador está cronometrado a 16MHz / 128 = 125kHz.

A continuación, decidí hacer que el Temporizador / Contador2 se comparara con un valor establecido de 125 estableciendo OCR2A en 125 y configurando el bit 'Borrar Temporizador en Comparación' en TCCR2A. Esto resulta en una interrupción exacta de 1kHz. TIMSK2 está configurado para habilitar la interrupción del temporizador / contador2 CompararA. Luego, todo lo que queda es adjuntar la interrupción a algún código, que se realiza con el comando ISR (TIMER2_COMPA_vect). La rutina de servicio de interrupciones cuenta hasta 1000 y, por lo tanto, llegamos a los tics de 1 segundo que se pueden usar en el bucle principal para hacer que el LED parpadee.

Enlace al artículo original

    
respondido por el jippie
0

Si necesita precisión, obtenga información sobre los temporizadores en su plataforma de microcontroladores.

Pero si no lo haces, deberás saber aproximadamente cuántas interacciones necesitas en el ciclo para llegar a los 5 segundos,

puedes usar while loop o un bucle for como este

int i;
for(i=0;i<20;i++){ //I choose 20interactions in first try
// your code
}

Luego mida los segundos para hacer estas 20 interacciones, finalmente haga un cálculo

(20interacciones * 5s) / Segundos medidos = cuántas interacciones necesita para alcanzar 5 segundos

    
respondido por el André Müller Pereira

Lea otras preguntas en las etiquetas