Realizar diferentes acciones en el mismo temporizador

0

Estoy trabajando con MC9S08AW60 en el Board-DEMO9S08AW60E. He escrito el siguiente código para realizar la comunicación en serie, la secuencia de LED y el teclado Tx-RX.

for(;;)
{  
    int i =0;  
    if(TPM1SC_TOF == 1) 
    {
        // this part shows the percentage of the voltage regulator on Hterm 
        bob = ADC1RL;               /*ADC*/

        if((SCI1S1 & (1<<7)))
        { 
            SCI1D = ((bob*100)/255);
        }

        if(SCI1S1_RDRF == 1 )  /*KEYBOARD RX- lights up a specific LED*/
        {
            bob = SCI1S1;
            if(SCI1D_R7_T7 == 1) PTFD_PTFD7 =1;
            else PTFD_PTFD7 = 0;            
        }

        // the following LED sequence is the PROBLEM-A-      
        /*for (i=1;i<=8;i++) 
        {
            if (i==8) i = 1;       
            if (i==1) PTFD_PTFD0 = 0;else PTFD_PTFD0 = 1;    
            if (i==2) PTFD_PTFD1 = 0;else PTFD_PTFD1 = 1;
            if (i==3) PTFD_PTFD2 = 0;else PTFD_PTFD2 = 1;    
            if (i==4) PTFD_PTFD3 = 0;else PTFD_PTFD3 = 1;    
            if (i==5) PTFD_PTFD4 = 0;else PTFD_PTFD4 = 1;    
            if (i==6) PTFD_PTFD5 = 0;else PTFD_PTFD5 = 1;    
            if (i==7) PTFD_PTFD6 = 0;else PTFD_PTFD6 = 1;
        }*/

        TPM1SC_TOF = 0;
    }
}

Ahora, la placa realiza las 2 acciones realmente bien: el RX del teclado y el regulador de voltaje para conversión porcentual. Pero tan pronto como traigo la parte de secuencia de LED, deja de funcionar en otros dos.

  1. la lógica para el control del TEMPORIZADOR es verificar el indicador de desbordamiento.

  2. la lógica para Keyboard Rx es verificar si hay un indicador RX.

  3. La lógica
  4. para ADC es verificar el registro de datos ADC.

No sé cómo hacer esta pregunta con mayor precisión. Si hay alguna ambigüedad, por favor hágamelo saber.

EDITAR: la conversión porcentual de Keboard RX y ADC se produce una vez por segundo, mientras que quiero que la secuencia de LED se produzca a una velocidad de 250 ms, es decir, una vez cada 250 ms, el estado de los cambios de led (1 a 0 y 0 a 1).

Enlaces:

Código más reciente con respecto a las sugerencias de Oli Glaser

for(;;)
{
    if(TPM1SC_TOF < 1)
    {
        bob = ADC1RL;               /*ADC*/

        if((SCI1S1 & (1<<7)))
        { 
            SCI1D = ((bob*100)/255);
        }

        if(SCI1S1_RDRF == 1 )  /*KEYBOARD RX*/
        {
            bob = SCI1S1;
            if(SCI1D_R7_T7 == 1) PTFD_PTFD7 =1;
            else PTFD_PTFD7 = 0;            
        }

        TPM1C1SC_CH1IE = 0; // channel interrupt flag is reset     
        TPM1SC_TOF = 0; //timer overflow flag is reset
    }
}

void ledseq()
{
    for (i=1;i<=8;i++)
    {
        if (i==8) i = 1;       
        if (i==1) PTFD_PTFD0 = 0;else PTFD_PTFD0 = 1;    
        if (i==2) PTFD_PTFD1 = 0;else PTFD_PTFD1 = 1;
        if (i==3) PTFD_PTFD2 = 0;else PTFD_PTFD2 = 1;    
        if (i==4) PTFD_PTFD3 = 0;else PTFD_PTFD3 = 1;    
        if (i==5) PTFD_PTFD4 = 0;else PTFD_PTFD4 = 1;    
        if (i==6) PTFD_PTFD5 = 0;else PTFD_PTFD5 = 1;    
        if (i==7) PTFD_PTFD6 = 0;else PTFD_PTFD6 = 1;
    }
}

ISR

__interrupt void isrVtpm1ch1(void)
{
    void ledseq();
    /* Write your interrupt code here ... */
}
/* end of isrVtpm1ch1 */
    
pregunta sheetansh

1 respuesta

1

Yo pondría el código LED en una rutina de interrupción y utilizaría un temporizador, si desea una sincronización precisa con una perturbación mínima del código principal.
No sé nada sobre el micro que está utilizando, pero supongo que tiene un par de temporizadores, así que use uno de estos para activar la interrupción para incrementar el LED. Puede poner todo el código en la rutina, o establecer un bit de bandera en la rutina de interrupción que active una función de incremento de LED en el código principal, que luego borra la bandera (generalmente desea mantener su código de interrupción lo más corto posible)

También puede utilizar una interrupción para la recepción de UART, por lo que no tiene que sondear continuamente para obtener una respuesta de teclado.

Alternativamente, si desea usar el mismo temporizador pero tiene diferentes temporizaciones, puede tener dos bucles, uno rápido y otro interno que verifica, por ejemplo, cada cuarto bucle para dividir el tiempo entre 4 (entonces podría tener su bucle externo funcionando a 250 ms, y su bucle interno ejecutándose a intervalos de 1 segundo)

Su verificación de código podría usar el símbolo de módulo , por ejemplo. if(i % 4 == 0) , entonces puede dejar i incrementando sin necesidad de reiniciarlo.

    
respondido por el Oli Glaser

Lea otras preguntas en las etiquetas