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.
-
la lógica para el control del TEMPORIZADOR es verificar el indicador de desbordamiento.
-
la lógica para Keyboard Rx es verificar si hay un indicador RX.
La lógica -
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 */