Autor Tema: Se me pierde el dato recibido en una interrupción del puerto serie  (Leído 8539 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
cordial saludo, una vez mas solicitando de vuestra ayuda.
tengo una interrupción para recibir un dato por el puerto serie, lo almaceno en una variable si proceso llla informacion antes de salir de la interrupcion me funciona pero si leo esta variable dentro de un switch case se pierde el dato, dejo ambos ejemplos, gracias de antemano por la ayuda.
así no funciona
Código: C
  1. int valor=0;
  2.    int flag=0;
  3.    int1 flag2=0;
  4.    char guardar;
  5.    //char rol=0;
  6.    //char cadena1[20];
  7.    // declaracion funciones
  8.       void ret1        (); // retardo general secuencias
  9.       void secuencia1  ();
  10.  
  11.    #int_RDA
  12.    void RDA_isr(void)
  13.    {
  14.  
  15.     //valor=0;
  16.   if(kbhit())//verifico si el dato ya esta disponible
  17.  {
  18.   valor=getc();//adquiero el dato
  19.    flag=1;
  20.  }
  21.      
  22.    }
  23.  
  24.   if (flag==1)
  25.       {
  26.         switch(valor)// [b]aqui se piede el contenido de valor[/b]
  27.          {  
  28.          case 'a':
  29.         secuencia1();                  
  30.          break;  
  31.          case 'b':  
  32. ...........................

así funciona
Código: C++
  1. #int_RDA
  2.    void RDA_isr(void)
  3.    {
  4.  
  5.     //valor=0;
  6.   if(kbhit())//verifico si el dato ya esta disponible
  7.  {
  8.   valor=getc();//adquiero el dato
  9.    flag=1;
  10.  }
  11.      if (valor=='a')
  12. {
  13. secuencia1();  
  14. }
  15.    }
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #1 en: 02 de Mayo de 2022, 12:20:06 »
cordial saludo, una vez mas solicitando de vuestra ayuda.
tengo una interrupción para recibir un dato por el puerto serie, lo almaceno en una variable si proceso llla informacion antes de salir de la interrupcion me funciona pero si leo esta variable dentro de un switch case se pierde el dato, dejo ambos ejemplos, gracias de antemano por la ayuda.
así no funciona
Código: C
  1. int valor=0;
  2.    int flag=0;
  3.    int1 flag2=0;
  4.    char guardar;
  5.    //char rol=0;
  6.    //char cadena1[20];
  7.    // declaracion funciones
  8.       void ret1        (); // retardo general secuencias
  9.       void secuencia1  ();
  10.  
  11.    #int_RDA
  12.    void RDA_isr(void)
  13.    {
  14.  
  15.     //valor=0;
  16.   if(kbhit())//verifico si el dato ya esta disponible
  17.  {
  18.   valor=getc();//adquiero el dato
  19.    flag=1;
  20.  }
  21.      
  22.    }
  23.  
  24.   if (flag==1)
  25.       {
  26.         switch(valor)// [b]aqui se piede el contenido de valor[/b]
  27.          {  
  28.          case 'a':
  29.         secuencia1();                  
  30.          break;  
  31.          case 'b':  
  32. ...........................

así funciona
Código: C++
  1. #int_RDA
  2.    void RDA_isr(void)
  3.    {
  4.  
  5.     //valor=0;
  6.   if(kbhit())//verifico si el dato ya esta disponible
  7.  {
  8.   valor=getc();//adquiero el dato
  9.    flag=1;
  10.  }
  11.      if (valor=='a')
  12. {
  13. secuencia1();  
  14. }
  15.    }

¿Será porque valor lo estas evaluando fuera de la función RDA_isr?

O se tal vez debe ser así:

Código: C
  1. void RDA_isr(void)
  2.  {
  3.  
  4.     //valor=0;
  5.     if(kbhit())//verifico si el dato ya esta disponible
  6.    {
  7.         valor=getc();//adquiero el dato
  8.         flag=1;
  9.     }
  10.      
  11.     //} <============= aquí estás cerrando la llave de la función y valor queda fuera de la función
  12.  
  13.     if (flag==1)
  14.     {
  15.         switch(valor)// [b]aqui se piede el contenido de valor[/b]
  16.         {  
  17.         case 'a':
  18.            secuencia1();                  
  19.           break;  
  20.          case 'b':  
  21.          .......
  22.          }
  23.  
  24. }// <=== aquí deberías cerrar la función RDA_isr
  25. ...........................
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #2 en: 02 de Mayo de 2022, 12:39:45 »
DominusDRR, cordial saludo, gracias por tu interés en ayudarme.
el switch esta muy por debajo en el programa lo que pasa es que lo coloque seguido para no colocar todo el programa que es extenso.
y no coloco el switch dentro de la interrupción ya que la idea es salir rapidito.
( la idea es saber por que se pierde el valor al llegar al switch case) de hecho trato de imprimir la variable y no sale nada, "se pierde el dato"
putc(valor);
Código: C++
  1. int valor=0;
  2.    int flag=0;
  3.    int1 flag2=0;
  4.    char guardar;
  5.    //char rol=0;
  6.    //char cadena1[20];
  7.    // declaracion funciones
  8.       void ret1        (); // retardo general secuencias
  9.       void secuencia1  ();
  10.  
  11.    #int_RDA
  12.    void RDA_isr(void)
  13.    {
  14.  
  15.     //valor=0;
  16.   if(kbhit())//verifico si el dato ya esta disponible
  17.  {
  18.   valor=getc();//adquiero el dato
  19.    
  20.    flag=1;
  21.  }
  22.  
  23.  
  24.      
  25.    }
  26.    
  27.    
  28.    
  29.  
  30.  
  31.    // VOID MAIN //
  32.    void main()
  33.    {
  34.    SET_TRIS_a(0B00000000);
  35.    SET_TRIS_b(0B00000000);
  36.    SET_TRIS_c(0B10011111);
  37.    SET_TRIS_e(0B1);
  38.    setup_adc_ports(NO_ANALOGS);
  39.    setup_comparator(NC_NC_NC_NC);
  40.    portA=0x00;
  41.    portB=0x00;
  42.  
  43.    enable_interrupts(INT_RDA); //HAbilita interrupcion por puerto serial
  44.    enable_interrupts(GLOBAL);  // Habilita las interrupcciones globales
  45.  
  46.    s=80;
  47.  
  48.  
  49.    while(TRUE)
  50.    {
  51.  
  52.  
  53.  
  54.    // VALOR INTERUPCION /
  55.   if (flag==1)
  56.       {
  57.         // if(valor=='a')
  58.        //  porta=0;
  59.         //secuencia3();
  60.         //porta=0xff;
  61.         // delay_ms(1000);
  62.         putc('m');
  63.          putc(valor);
  64.         switch(valor)// aqui se piede el contenido sde valor
  65.          {  
  66.          case 'a':  
  67.            // putc('m');
  68.         // guardar=valor;  
  69.         puerto=0;
  70.          secuencia1();                  
  71.          break;  
  72.          case 'b':  
  73.          puerto=0;
  74.          guardar=valor;
  75.          secuencia2();
  76.          break;
« Última modificación: 02 de Mayo de 2022, 12:46:29 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #3 en: 02 de Mayo de 2022, 13:07:16 »
cordial saludo, una vez mas solicitando de vuestra ayuda.
tengo una interrupción para recibir un dato por el puerto serie, lo almaceno en una variable si proceso llla informacion antes de salir de la interrupcion me funciona pero si leo esta variable dentro de un switch case se pierde el dato, dejo ambos ejemplos, gracias de antemano por la ayuda.
así no funciona
Código: C
  1. int valor=0;
  2.    int flag=0;
  3.    int1 flag2=0;
  4.    char guardar;
  5.    //char rol=0;
  6.    //char cadena1[20];
  7.    // declaracion funciones
  8.       void ret1        (); // retardo general secuencias
  9.       void secuencia1  ();
  10.  
  11.    #int_RDA
  12.    void RDA_isr(void)
  13.    {
  14.  
  15.     //valor=0;
  16.   if(kbhit())//verifico si el dato ya esta disponible
  17.  {
  18.   valor=getc();//adquiero el dato
  19.    flag=1;
  20.  }
  21.      
  22.    }
  23.  
  24.   if (flag==1)
  25.       {
  26.         switch(valor)// [b]aqui se piede el contenido de valor[/b]
  27.          {  
  28.          case 'a':
  29.         secuencia1();                  
  30.          break;  
  31.          case 'b':  
  32. ...........................

así funciona
Código: C++
  1. #int_RDA
  2.    void RDA_isr(void)
  3.    {
  4.  
  5.     //valor=0;
  6.   if(kbhit())//verifico si el dato ya esta disponible
  7.  {
  8.   valor=getc();//adquiero el dato
  9.    flag=1;
  10.  }
  11.      if (valor=='a')
  12. {
  13. secuencia1();  
  14. }
  15.    }

¿Por qué ejecutas putc antes del switch?

¿Será que esa función borra el contenido?

Código: C
  1. putc(valor);
  2. switch(valor)

¿Qué tal si al guardas en otra variable antes del putc?


Código: C
  1. valor2 = valor
  2. putc(valor);
  3. switch(valor2)
« Última modificación: 02 de Mayo de 2022, 13:12:42 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #4 en: 02 de Mayo de 2022, 13:18:08 »
saludos,
putc(valor); la coloque  para hallar el problema pero no se necesita, tambien la copie en otra variable (tal cual lo hiciste) y sigue sin trabajar.
Si algo parece complicado... es por que esta mal explicado.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #5 en: 02 de Mayo de 2022, 13:29:56 »
si coloco el switch dentro de la interrupción trabaja bien.
pero deseo saber que es lo que sucede que se pierde el contenido de la variable (valor)
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #6 en: 02 de Mayo de 2022, 14:03:49 »
si coloco el switch dentro de la interrupción trabaja bien.
pero deseo saber que es lo que sucede que se pierde el contenido de la variable (valor)

Esa clase de error y otros recuerdo que descubrí en el CCS (PICC) hace muchos años y por esa razón lo dejé para cambiarme a C18 (actual XC8).

Pero ya es muchos años de eso, es de suponer que ya no debería tener esos errores.

Tal vez deberías declararla como static

La otra opción sería seguirle el rastro en ensamblador para determinar que sucede.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #7 en: 02 de Mayo de 2022, 14:05:17 »
si coloco el switch dentro de la interrupción trabaja bien.
pero deseo saber que es lo que sucede que se pierde el contenido de la variable (valor)

Esa clase de error y otros recuerdo que descubrí en el CCS (PICC) hace muchos años y por esa razón lo dejé para cambiarme a C18 (actual XC8).

Pero ya es muchos años de eso, es de suponer que ya no debería tener esos errores.

Tal vez deberías declararla como static

La otra opción sería seguirle el rastro en ensamblador para determinar que sucede.

Tal vez deberías compartir el código del proyecto completo. Hay quienes que podrían descargarlo y determinar si les pasa lo mismo.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #8 en: 02 de Mayo de 2022, 14:17:57 »
Toda variable que se use en una interrupcion y luego en otro lado, debe ser declarada como "volatile", para evitar problemas con los optimizadores.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #9 en: 02 de Mayo de 2022, 14:58:51 »
Toda variable que se use en una interrupcion y luego en otro lado, debe ser declarada como "volatile", para evitar problemas con los optimizadores.
muchas gracias por tu respuesta.
en CCS se podria y donde se declararía?
lo hice asi y no me funciono..
volatile int valor;
Si algo parece complicado... es por que esta mal explicado.

Conectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #10 en: 02 de Mayo de 2022, 15:10:01 »
Deberías hacer caso a la última sugerencia de DominusDRR

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #11 en: 02 de Mayo de 2022, 15:25:28 »
Toda variable que se use en una interrupcion y luego en otro lado, debe ser declarada como "volatile", para evitar problemas con los optimizadores.
muchas gracias por tu respuesta.
en CCS se podria y donde se declararía?
lo hice asi y no me funciono..
volatile int valor;

Me parece que volatile int valor es lo mismo que int valor
Sólo por probar a ver que pasa, sugerí: static int valor
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #12 en: 02 de Mayo de 2022, 15:33:36 »
haciendo caso...
Código: C++
  1. #include <16F1936.h>
  2.    #include <stdio.h>
  3.    #include <stdlib.h>
  4.    #include <string.h>
  5.    #fuses noDEBUG   //  debug - in circuit debugger enabled on RB6 and RB7 - DISABLED
  6.    #fuses noLVP     //  LVP - low voltage enable - DISABLED
  7.    #fuses noFCMEN   //  Fail safe clock monitor - DISABLED
  8.    #fuses noIESO    //  IESO - internal / external switch over DISABLED
  9.    #fuses noBROWNOUT  //  Brown out reset selection bits - 11 BOR  DISABLED
  10.    #fuses CPD     //  CPD - date code protect DISABLED
  11.    #fuses PROTECT //  CP - code protect DISABLED
  12.    #fuses noMCLR      //  MCLRE - RE3 is MCLR
  13.    #fuses noPUT     //  PWRTE - power up timer enable bit DISABLED
  14.    #fuses noWDT    //  WDTE - watch dog enable bit - not enabled here, in code below
  15.    #fuses INTRC_IO   //  FOSC - oscillator - set to INTRC_IO-- defaults the clock to 4Mhz
  16.    #use delay(internal=8000000)
  17.  
  18.    #use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7,bits=8,errors)
  19.  
  20.    
  21.    #byte portA= 0x0C
  22.    #byte portB= 0x0D
  23.    #byte portC= 0x0E    
  24.    #byte portE= 0x10
  25.    # use fast_io(a)
  26.    # use fast_io(b)
  27.  
  28.                
  29.                          
  30.    //   *******************************************************************                        
  31.  
  32.  
  33.    signed  int8 i=0;        // variable para las secuencias  
  34.            int8 valor=0;
  35.            int flag=0;
  36.    
  37.    
  38.    
  39.    // declaracion funciones
  40.  
  41.       void secuencia1  ();
  42.  
  43.  
  44.    #int_RDA
  45.    void RDA_isr(void)
  46.    {
  47.        if(kbhit())//verifico si el dato ya esta disponible
  48.        {
  49.        valor=getc();//adquiero el dato
  50.        //guardar =valor;  
  51.        flag=1;
  52.        }
  53.  
  54.  
  55.      
  56.    }
  57.    
  58.  
  59.  
  60.    // VOID MAIN //
  61.    void main()
  62.    {
  63.    SET_TRIS_a(0B00000000);
  64.    SET_TRIS_b(0B00000000);
  65.    SET_TRIS_c(0B10011111);
  66.    SET_TRIS_e(0B1);
  67.    setup_adc_ports(NO_ANALOGS);
  68.    setup_comparator(NC_NC_NC_NC);
  69.    portA=0x00;
  70.    portB=0x00;
  71.  
  72.    enable_interrupts(INT_RDA); //HAbilita interrupcion por puerto serial
  73.    enable_interrupts(GLOBAL);  // Habilita las interrupcciones globales
  74.  
  75.  
  76.  
  77.  
  78.    while(TRUE)
  79.    {
  80.              
  81.   //****************************                  
  82.  
  83.     //  Reset_cpu();
  84.              
  85.  
  86.    //*********************************
  87.  
  88.  
  89.  
  90.    // VALOR INTERUPCION /
  91.    if (flag==1)
  92.       {
  93.  
  94.          switch(valor)// aqui se piede el contenido sde valor
  95.          {  
  96.          case 'a':  
  97.          secuencia1();                  
  98.          break;  
  99.          }  
  100.  
  101.      flag=0;
  102.      valor=0;
  103.    
  104.     }
  105.  
  106.  
  107.      
  108.    }// while true
  109.    }//main
  110.  
  111.  
  112.  
  113.      
  114.  
  115.     void secuencia1()
  116.      
  117.     {    
  118.          for (i=0;i<=5;i++)
  119.          {
  120.           porta=0xff;
  121.           portb=0xff;
  122.           delay_ms(50);
  123.           porta=0x00;
  124.           portb=0x00;
  125.           delay_ms(50);        
  126.          }
  127.    delay_ms(400);
  128.     }
Si algo parece complicado... es por que esta mal explicado.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #13 en: 02 de Mayo de 2022, 15:39:10 »
Me parece que volatile int valor es lo mismo que int valor
Sólo por probar a ver que pasa, sugerí: static int valor
sigue igual, no hay cambios.
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #14 en: 02 de Mayo de 2022, 15:45:23 »
Me parece que volatile int valor es lo mismo que int valor
Sólo por probar a ver que pasa, sugerí: static int valor
sigue igual, no hay cambios.

Miré el ensamblador que genera para determinar que sucede con esa variable, o espere a alguien que simule su proyecto.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything