Tengo problemas para leer un array char dentro de un ISR. Estoy usando el PIC18F4680 y el compilador C18 versión 3.41.
La matriz tiene varios elementos que se rellenan a partir de los datos leídos de un RTC y que posteriormente se utilizarán para generar datos en otra matriz que posteriormente se utilizará para manejar una pantalla de 5x7.
Mi problema es que cuando leo los elementos del array, obtengo un conjunto de valores en el ISR y otro fuera del ISR.
Aquí está la salida de lo que estoy recibiendo:
1 1
0 0
0 0
1 1
0 0
0 0
1 1
0 0
0 0
*******************
1 7
0 0
0 0
*******************
1 1
0 0
0 0
1 1
0 0
0 0
1 1
0 0
0 0
La línea superior son los segundos, la segunda línea son los minutos y la tercera línea son las horas desde que se inició el sistema. Las tres líneas con estrellas encima y debajo fueron enviadas desde el ISR. Como podemos ver, el valor de los segundos era 11 antes del ISR, 17 en el ISR y 11 después del ISR. También he notado que esto nunca ocurre durante los primeros 10 segundos después del inicio de un minuto o durante los últimos 10 segundos de un minuto. En otros momentos los cambios parecen ocurrir al azar.
Aquí está el código correspondiente:
k=0;//this is a sort of critical section
data[0]=from_seconds (data[0]);
data[1]=from_minutes (data[1]);
data[2]=from_hours (data[2]).time;
k=1;//if it's zero, ISR won't read the data
for (i=0;i<3;i++)
//I made sure here that the counter variable isn't used anywhere else
{
WriteUSART ( (data[i]/10)+48 );//Converting decimal into ASCII
putrsUSART (" ");
WriteUSART ( (data[i]%10)+48 );
putrsUSART ("\r\n");
}
putrsUSART ("\r\n");
putrsUSART ("\r\n");
putrsUSART ("\r\n");
putrsUSART ("\r\n");
Aquí está el ISR:
if (INTCON3bits.INT1IF)
{
if(k)//I know that I'll miss the interrupt if the k is zero, but I'll fix that later
{
fill_matrix (data[2],data[1], data[0]);
putrsUSART ("\r\n");
putrsUSART ("\r\n");
putrsUSART ("*******************");
putrsUSART ("\r\n");
for (j=0;j<3;j++)
{
WriteUSART ( (data[j]/10)+48 );
putrsUSART (" ");
WriteUSART ( (data[j]%10)+48 );
putrsUSART ("\r\n");
}
putrsUSART ("\r\n");
putrsUSART ("\r\n");
putrsUSART ("\r\n");
putrsUSART ("*******************");
putrsUSART ("\r\n");
}
INTCON3bits.INT1IF=0;
}
¿Alguna idea de lo que puede estar pasando aquí?
ACTUALIZACIÓN:
Sobre el comentario de tcrosley: La parte separada por signos de exclamación es leída por el ISR de lectura y la parte separada por estrellas es hecha por el ISR de escritura.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
!!!!!!!!!!!!!!!!!!!!!!!!
*******************
1 [ _ [ 1
t @ 4 0 [
„ 0 4 1 Z
t 1 _ 1 Z
t 0 5 0 Z
t 0 5 0 Z
0 t _ Z 0
*******************
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1 [ _ [ 1
t @ 4 0 [
„ 0 4 1 Z
t 1 _ 1 Z
t 0 5 0 Z
t 0 5 0 Z
0 t _ Z 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1 [ _ [ 1
t @ 4 0 [
„ 0 4 1 Z
t 1 _ 1 Z
t 0 5 0 Z
t 0 5 0 Z
0 t _ Z 0
!!!!!!!!!!!!!!!!!!!!!!!!
*******************
Q › › Q
t @ 0 ›
„ 0 Q
t 1 Q
t 0 0
t 0 0
0 t 0
*******************
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Q › › Q
t @ 0 ›
„ 0 Q
t 1 Q
t 0 0
t 0 0
0 t 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Q › › Q
t @ 0 ›
„ 0 Q
t 1 Q
t 0 0
t 0 0
0 t 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Q › › Q
t @ 0 ›
„ 0 Q
t 1 Q
t 0 0
t 0 0
0 t 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Q › › Q
t @ 0 ›
„ 0 Q
t 1 Q
t 0 0
t 0 0
0 t 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Q › › Q
t @ 0 ›
„ 0 Q
t 1 Q
t 0 0
t 0 0
0 t 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Q › › Q
t @ 0 ›
„ 0 Q
t 1 Q
t 0 0
t 0 0
0 t 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Q › › Q
t @ 0 ›
„ 0 Q
t 1 Q
t 0 0
t 0 0
0 t 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Q › › Q
t @ 0 ›
„ 0 Q
t 1 Q
t 0 0
t 0 0
0 t 0
!!!!!!!!!!!!!!!!!!!!!!!!
*******************
P P
„ 1 ± 0
… 0 ± P
„ 0 P
„ 0 0
„ 0 0
0 „ 0
*******************
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
P P
„ 1 ± 0
… 0 ± P
„ 0 P
„ 0 0
„ 0 0
0 „ 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
P P
„ 1 ± 0
… 0 ± P
„ 0 P
„ 0 0
„ 0 0
0 „ 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
P P
„ 1 ± 0
… 0 ± P
„ 0 P
„ 0 0
„ 0 0
0 „ 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
P P
„ 1 ± 0
… 0 ± P
„ 0 P
„ 0 0
„ 0 0
0 „ 0
!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
P P
„ 1 ± 0
… 0 ± P
„ 0 P
„ 0 0
„ 0 0
0 „ 0
!!!!!!!!!!!!!!!!!!!!!!!!
Por lo que veo, el ISR de lectura siempre obtiene los datos correctos de la matriz, incluso después de varias decenas de segundos.