4 votos

La lectura de una matriz de caracteres proporciona resultados diferentes dentro y fuera del ISR

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.

4voto

Duncan Smart Puntos 9195
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

¿De dónde obtiene data[0] su valor inicial? Los comentarios del OP implican que primero se carga con los datos del RTC, y luego se convierte aquí a un formato diferente. Pero, ¿dónde se cargan los datos del RTC?

Para poder reutilizar la matriz, tanto la carga de los datos RTC como la conversión deben ocurrir dentro de la "sección crítica". De lo contrario, sería posible que el ISR se disparara entre la carga de los datos RTC y la conversión. En general, desapruebo la reutilización de matrices de datos como esa, especialmente con ISRs porque un ISR hará todo lo posible para disparar en el peor momento posible.

En su lugar, debería funcionar más con una filosofía de apretón de manos. Primero, cargar un array no utilizado con los datos del RTC. Luego, hacer la conversión dentro de la sección crítica. Esto asegura que en todos y cada uno de los momentos posibles en los que el ISR podría dispararse, los valores en el array de datos serán siempre correctos.

Como extra, yo recomendaría no hacer este tipo de planteamiento de sección crítica. En su lugar, si necesita este tipo de funcionalidad, establezca INTCON3bits.INT1IE = 0 para que sólo se enmascare esta interrupción. La bandera de interrupción seguirá estando activada, y cuando establezcas INTCON3bits.INT1IE = 1 más adelante, la interrupción se disparará como se esperaba.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X