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

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

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #30 en: 05 de Mayo de 2022, 13:33:06 »
yo en realidad siempre lo hago con el hardware, es por eso que estoy viendo la falla en tiempo real, pero estoy loco aquí, no se si volatile no me aplique en CCS.
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 #31 en: 05 de Mayo de 2022, 16:43:58 »
Sube un video para ver pasa cuando está depurando.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #32 en: 07 de Mayo de 2022, 12:50:27 »
¿En que quedó esto?.

  ¿Has probado al poner dos putc();?,  uno dentro de la interrupción para que te devuelva el carácter recibido en valor, y otro antes del switch para ver si se conserva o te devuelve algo al azar. 

  Otra opción es usar un puntero y mirar imprimiendo en la terminal si lo que se pierde es el dato o si se está modificando la dirección de memoria.

  Probar con una struct también sería viable.

  Actualizar a la última versión del compilador por si es un bug del mismo.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #33 en: 13 de Mayo de 2022, 11:53:49 »
¿En que quedó esto?.

  ¿Has probado al poner dos putc();?,  uno dentro de la interrupción para que te devuelva el carácter recibido en valor, y otro antes del switch para ver si se conserva o te devuelve algo al azar. 

  Otra opción es usar un puntero y mirar imprimiendo en la terminal si lo que se pierde es el dato o si se está modificando la dirección de memoria.

  Probar con una struct también sería viable.

  Actualizar a la última versión del compilador por si es un bug del mismo.
Cordial saludo, he realizado tantas pruebas que no se si realice lo  que me dices y en ese orden, lo hare y comento.
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 #34 en: 16 de Mayo de 2022, 16:12:20 »
cordial saludo, logre conseguir de nuevo el pic original 16f1936 ( se habia dañado) realice las pruebas...
Citar
  ¿Has probado al poner dos putc();?,  uno dentro de la interrupción para que te devuelva el carácter recibido en valor, y otro antes del switch para ver si se conserva o te devuelve algo al azar.

  Otra opción es usar un puntero y mirar imprimiendo en la terminal si lo que se pierde es el dato o si se está modificando la dirección de memoria.

  Probar con una struct también sería viable.

  Actualizar a la última versión del compilador por si es un bug del mismo.
y dendro del switch "valor" copio este mismo a la variable guardar( esto para hacerlo en la eeprom) y ya no se esta perdiendo el dato, el problema que tengo es que la variable flag la tenia " int flag =0;" y trabaja erroneamente al hacer comparaciones en los if, si la coloco "int1" trabaja bien y si la coloco "int8 tampoco trabaja, por que puede suceder esto, se supone que en el transcurso del programa yo la estoy actualizando no deberia trabajar tambien como "int8" ?
Código: C++
  1. #define izq    pin_c0 // naranja
  2.    #define medias pin_c1 // gris
  3.    #define acc    pin_c2 // amarillo
  4.    #define der    pin_c3 // blanco
  5.    #define stop   pin_c4 // azul
  6.    
  7.   // #define speed50  delay_ms(50)
  8.    //#define speed100 delay_ms(100)
  9.   // #define speed200 delay_ms(200)
  10.  //  #define speed300 delay_ms(300)
  11.   // #define speed400 delay_ms(400)
  12.  
  13.  // #byte valor=0
  14.  
  15.   // typedef volatile char valor;
  16.  
  17.  
  18.  
  19.  
  20.      
  21.  //secuencia 9
  22.  byte const s1d7[]={0b00000001,0b00000010,0b00000100,0b00001001,0b00010010,0b00100100,0b01001001,0b10010010
  23.                     0b00100100,0b01001000,0b10010000,0b00100000,0b01000000,0b10000000,0b00000000};//0-14
  24.                          
  25.     //    byte const s2d7[]={0,50,100,150,200,255};//0-14
  26.      //   byte const s3d7[]={255,200,150,100,50,0};//0-14      
  27.        
  28.      // secuencia10
  29.      byte const s2d7[]={0,127,255};//0-14
  30.      byte const s3d7[]={255,127,0};//0-14
  31.                            
  32.      // byte const valor;        
  33.                          
  34.                
  35.                          
  36.                          
  37.    //   *******************************************************************                      
  38.  
  39.    // variables para pwm
  40.      signed int16 pwmh =0;
  41.      signed int16 pwml =0;  
  42.    //*********************
  43.  
  44.    int1  doble=0x01;         // en 0 solo ascendente en 1 asciende y regresa
  45.    signed  int8 i=0;        // variable para las secuencias  
  46.    signed  int8 j=0;       // variable para las secuencias  
  47.    signed  int8 k=0;      // variable para las secuencias  
  48.    signed  int8 m=0;     // variable para numero de salidas //  para secuencia 9
  49.    signed  int8 n=7;    // numero de salidas
  50.   // int n=num;        // numero de salidas que se van a utilizar
  51.    int8 mezcla =0;    // alberga la info del puerto para luego pasarla a los puertos a y b
  52.    signed int16 s;   // tiempo de retardo
  53.    signed int8 puerto =1;   // 0 a y b / 1 a / 2 el b elige  el puerto
  54.    //int puerto1 =1; // 0 a y b / 1 a / 2 el b elige  el puerto
  55.    signed  int16 f=0; // para secuencia10 pwm
  56.            int g=0;   // para secuencia10 pwm
  57.    signed int intensidad=0;
  58.    signed int8 valor=0;
  59.  
  60.  int1 flag=0;
  61.    int1 flag2=0;
  62.    signed int8 guardar;
  63.   // char rol=0;
  64.    
  65.  
  66.      // static int valor;
  67.    
  68.    
  69.    // declaracion funciones
  70.       void ret1        (); // retardo general secuencias
  71.       void secuencia1  ();
  72.       void secuencia2  ();
  73.       void secuencia3  ();
  74.       void secuencia4  ();    
  75.       void secuencia5  ();
  76.       void secuencia6  ();
  77.       void secuencia7  ();
  78.       void secuencia8  ();
  79.       void secuencia9  ();
  80.       void secuencia10 ();
  81.       void secuencia11 ();
  82.       void salida      (); // funcion para mostrar los efectos
  83.       void dimmer      ();
  84.       void suiche();
  85.    //*******************
  86.       void freno();
  87.       void frenoflash();
  88.  
  89.    #int_RDA
  90.    void RDA_isr(void)
  91.    {
  92.  
  93.     //valor=0;
  94.   if(kbhit())//verifico si el dato ya esta disponible
  95.  {
  96.   //valor=0;
  97.     valor=getc();//adquiero el dato
  98.  
  99.     flag=1;
  100.     puerto=0;
  101.  
  102.  }
  103.  
  104.  
  105.   //  valor=getc(); //Captura el dato recibido del PIC 1
  106.  //  guardar=getc();
  107.  // flag=1;
  108.     //guardar =valor;
  109.      //putc(valor);
  110.    
  111.      
  112.      
  113.    }
  114.    
  115.    
  116.    
  117.  
  118.  
  119.  
  120.    // EEPROM DISTRIBUCION //
  121.    /*
  122.    0 u  pwmh
  123.    1 t  pwml
  124.    2 v SECUENCIA DIRECCIONALES
  125.    3 w SECUENCIA ESTACIONARIAS
  126.    4 x SECUENCIA FRENO
  127.    5 y SECUENCIA MEDIAS
  128.    6 z SECUENCIA SALUDO
  129.  
  130.    */
  131.  
  132.  
  133.  
  134.    // VOID MAIN //
  135.    void main()
  136.    {
  137.    SET_TRIS_a(0B00000000);
  138.    SET_TRIS_b(0B00000000);
  139.    SET_TRIS_c(0B10011111);
  140.    SET_TRIS_e(0B1);
  141.    setup_adc_ports(NO_ANALOGS);
  142.    setup_comparator(NC_NC_NC_NC);
  143.    portA=0x00;
  144.    portB=0x00;
  145.    //delay_ms(4000);
  146.  
  147.    enable_interrupts(INT_RDA); //HAbilita interrupcion por puerto serial
  148.    enable_interrupts(GLOBAL);  // Habilita las interrupcciones globales
  149.  
  150.    s=80;
  151.  
  152.  
  153.    while(TRUE)
  154.    {
  155.     // configura # de salidas
  156.    //***********************
  157.    //num = sizeof(s4d7);
  158.    // porta=tama;
  159. // num=num -1;
  160.  // num=8;
  161.  
  162.              
  163.   //****************************                  
  164.  
  165.     //  Reset_cpu();
  166.    
  167.    
  168.     // SALIDAS TRIS //  
  169.     if (n>=7)               // selecciono las salidas que necesito para que por error no se prendan los que no necesito
  170.        SET_TRIS_a(0B00000000);
  171.         if (n==6)
  172.            SET_TRIS_a(0B10000000);
  173.                if (n==5)
  174.                SET_TRIS_a(0B11000000);
  175.                    if (n==4)
  176.                    SET_TRIS_a(0B11100000);      
  177.                       if (n==3)          
  178.                       SET_TRIS_a(0B11110000);        
  179.                         if (n<=2)
  180.                           SET_TRIS_a(0B11111000);              
  181.  
  182.    //*********************************
  183.  
  184.    if (!input_state(acc))
  185.       {
  186.       ret1();
  187.       flag2=0;
  188.       }
  189.    if ((input_state(acc))&&(flag2==0))
  190.     {
  191.       flag2=1;
  192.       puerto=0;
  193.       secuencia3();
  194.       secuencia3();
  195.     }
  196.  
  197.  
  198.  
  199.  
  200.    // VALOR INTERUPCION /
  201.    if (flag==1)
  202.       {
  203.         //putc(valor);
  204.        //putc(guardar);
  205.         switch(valor)// aqui se pierde el contenido de valor
  206.          {      
  207.          case 'a':  
  208.          guardar=valor;  
  209.          //puerto=0;
  210.          secuencia1();                  
  211.          break;  
  212.          case 'b':
  213.          guardar=valor;
  214.          secuencia2();
  215.          break;
  216.          case 'c':
  217.          guardar=valor;
  218.          secuencia3();
  219.          break;
  220.          case 'd':
  221.          guardar=valor;
  222.          secuencia4();
  223.          break;
  224.          case 'e':  
  225.          guardar=valor;
  226.          secuencia5();                  
  227.          break;  
  228.          case 'f':
  229.          guardar=valor;
  230.          secuencia6();
  231.          break;
  232.          case 'g':
  233.          guardar=valor;
  234.          secuencia7();
  235.          break;
  236.          case 'h':
  237.          guardar=valor;
  238.          secuencia8();
  239.          break;
  240.          case 'i':
  241.          guardar=valor;
  242.          secuencia9();
  243.          break;
  244.          case 'j':
  245.          guardar=valor;
  246.          secuencia10();
  247.          break;
  248.          case 'k':
  249.          guardar=valor;
  250.          secuencia11();
  251.          break;
  252.  
  253.          // EEPROM //
  254.          case 't': // pwmh
  255.         // write_eeprom(0,guardar);
  256.          case 'u': // pwml
  257.         // write_eeprom(1,guardar);
  258.          case 'v': //DIRECCIONALES
  259.          write_eeprom(2,guardar);
  260.          break;
  261.          case 'w': // ESTACIONARIAS
  262.          write_eeprom(3,guardar);
  263.          break;
  264.          case 'x': // FRENO
  265.         // write_eeprom(4,guardar);
  266.          break;
  267.          case 'y': // MEDIAS
  268.         // write_eeprom(5,guardar);
  269.          break;
  270.          case 'z': // SALUDO
  271.          //write_eeprom(6,guardar);
  272.          break;
  273.          // default:
  274.          }
  275.          //putc(guardar);
  276.     mezcla=0x00;// LIMPIO EL PUERTO LUEGO DE VISUALIZAR LA FUNCION QUE QUIERO
  277.     salida();
  278.     flag=0;
  279.     valor=0;
  280.      // guardar =valor;
  281.     }
  282.  /* if (input_state(der))
  283.     {
  284.     putc(guardar);
  285.     valor=read_eeprom(0);
  286.     flag=1;
  287.    
  288.     }
  289.    
  290.  */    
  291.  
  292.     // DISRIMINA EL ESTADO STOP DIRECIONALES O MEDIAS //
  293.     //************************************************//
  294.     // puerto==0  solo las 2 direccionales1
  295.     // puerto==1  stop izquierdo y direccional derecha
  296.     // puerto==2  stop derecho y direccional izquierda
  297.     // puerto==3  solo direccional derecha
  298.     // puerto==4  solo direccional izquierda
  299.     if ((!input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(!input_state(medias)))// todo apagado
  300.     {
  301.     porta=0x00;
  302.     portb=0x00;
  303.  
  304.     }
  305.        if ((input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(!input_state(medias)))// solo freno
  306.        {
  307.        puerto=0;
  308.        frenoflash();
  309.        }
  310.        if ((input_state(stop))&&(input_state(izq))&&(input_state(der))&&(!input_state(medias)))// ambas direccionales activas
  311.        {
  312.        puerto=0;
  313.        secuencia1();
  314.    
  315.        }
  316.           if ((input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(!input_state(medias)))//freno izquierdo activo - direccional derecha activa
  317.           {
  318.           puerto=1;
  319.           valor=read_eeprom(3);
  320.            flag=1;
  321.  
  322.           }
  323.              if ((input_state(stop))&&(input_state(izq))&&(!input_state(der))&&(!input_state(medias))) // freno derecho activo - direccional izquierda activa
  324.              {
  325.               puerto =2;
  326.               //secuencia1();
  327.  
  328.              }
  329.                 if ((!input_state(stop))&&(input_state(izq))&&(input_state(der))&&(!input_state(medias))) //ambas direccionales estacionarias
  330.                 {
  331.                 puerto=0;
  332.                 secuencia1();
  333.  
  334.                 }
  335.                    if ((!input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(!input_state(medias)))//solo direccional derecha activa
  336.                    {
  337.                    puerto=3;// solo direccional derecha
  338.                    valor=read_eeprom(3);
  339.                    flag=1;
  340.                    }                  
  341.                       if  ((!input_state(stop))&&(input_state(izq))&&(!input_state(der))&&(!input_state(medias)))//solo direccional izquierda activa
  342.                       {
  343.                       puerto=4;
  344.                        secuencia1();
  345.                       }                    
  346.                          if ((!input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(input_state(medias)))//solo medias
  347.                          {
  348.                          puerto=0;
  349.                          secuencia10();// medias solo
  350.                          }
  351.                             if ((!input_state(stop))&&(input_state(izq))&&(input_state(der))&&(input_state(medias)))//solo direccionales estacionarias
  352.                             {
  353.                             puerto =0;
  354.                             secuencia1();
  355.                             }
  356.                                if ((!input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(input_state(medias))) //media izquierda activa dirrecional derecha activa
  357.                                {
  358.                                puerto=1;
  359.                                 secuencia1();
  360.                                }  
  361.                                   if ((!input_state(stop))&&(input_state(izq))&&(!input_state(der))&&(input_state(medias)))// media derecha activa direccional izquierda aciva
  362.                                   {
  363.                                   puerto=2;
  364.                                   secuencia1();
  365.                                   }
  366.                                       if ((input_state(stop))&&(input_state(izq))&&(input_state(der))&&(input_state(medias)))// todo activado da solo direccionals
  367.                                      {
  368.                                      puerto =0;
  369.                                      secuencia1();
  370.                                      }
  371.                                         if ((input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(input_state(medias)))// todo activado da solo direccionals
  372.                                         {
  373.                                         frenoflash();
  374.                                         }
  375.  
  376.      
  377.  
  378.      
  379.    }
  380.    }
« Última modificación: 16 de Mayo de 2022, 17:38:09 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 #35 en: 16 de Mayo de 2022, 16:24:09 »
cordial saludo, logre conseguir de nuevo el pic original 16f1936 ( se habia dañado) realice las pruebas y dendro del switch "valor" copio este mismo a la variable guardar( esto para hacerlo en la eeprom) y ya no se esta perdiendo el dato, el problema que tengo es que la variable flag la tenia " int flag =0;" y trabaja erroneamente al hacer comparaciones en los if, si la coloco "int1" trabaja bien y si la coloco "int8 tampoco trabaja, por que puede suceder esto, se supone que en el transcurso del programa yo la estoy actualizando no deberia trabajar tambien como "int8" ?
Código: C++
  1. #define izq    pin_c0 // naranja
  2.    #define medias pin_c1 // gris
  3.    #define acc    pin_c2 // amarillo
  4.    #define der    pin_c3 // blanco
  5.    #define stop   pin_c4 // azul
  6.    
  7.   // #define speed50  delay_ms(50)
  8.    //#define speed100 delay_ms(100)
  9.   // #define speed200 delay_ms(200)
  10.  //  #define speed300 delay_ms(300)
  11.   // #define speed400 delay_ms(400)
  12.  
  13.  // #byte valor=0
  14.  
  15.   // typedef volatile char valor;
  16.  
  17.  
  18.  
  19.  
  20.      
  21.  //secuencia 9
  22.  byte const s1d7[]={0b00000001,0b00000010,0b00000100,0b00001001,0b00010010,0b00100100,0b01001001,0b10010010
  23.                     0b00100100,0b01001000,0b10010000,0b00100000,0b01000000,0b10000000,0b00000000};//0-14
  24.                          
  25.     //    byte const s2d7[]={0,50,100,150,200,255};//0-14
  26.      //   byte const s3d7[]={255,200,150,100,50,0};//0-14      
  27.        
  28.      // secuencia10
  29.      byte const s2d7[]={0,127,255};//0-14
  30.      byte const s3d7[]={255,127,0};//0-14
  31.                            
  32.      // byte const valor;        
  33.                          
  34.                
  35.                          
  36.                          
  37.    //   *******************************************************************                      
  38.  
  39.    // variables para pwm
  40.      signed int16 pwmh =0;
  41.      signed int16 pwml =0;  
  42.    //*********************
  43.  
  44.    int1  doble=0x01;         // en 0 solo ascendente en 1 asciende y regresa
  45.    signed  int8 i=0;        // variable para las secuencias  
  46.    signed  int8 j=0;       // variable para las secuencias  
  47.    signed  int8 k=0;      // variable para las secuencias  
  48.    signed  int8 m=0;     // variable para numero de salidas //  para secuencia 9
  49.    signed  int8 n=7;    // numero de salidas
  50.   // int n=num;        // numero de salidas que se van a utilizar
  51.    int8 mezcla =0;    // alberga la info del puerto para luego pasarla a los puertos a y b
  52.    signed int16 s;   // tiempo de retardo
  53.    signed int8 puerto =1;   // 0 a y b / 1 a / 2 el b elige  el puerto
  54.    //int puerto1 =1; // 0 a y b / 1 a / 2 el b elige  el puerto
  55.    signed  int16 f=0; // para secuencia10 pwm
  56.            int g=0;   // para secuencia10 pwm
  57.    signed int intensidad=0;
  58.    signed int8 valor=0;
  59.  
  60.  int1 flag=0;
  61.    int1 flag2=0;
  62.    signed int8 guardar;
  63.   // char rol=0;
  64.    
  65.  
  66.      // static int valor;
  67.    
  68.    
  69.    // declaracion funciones
  70.       void ret1        (); // retardo general secuencias
  71.       void secuencia1  ();
  72.       void secuencia2  ();
  73.       void secuencia3  ();
  74.       void secuencia4  ();    
  75.       void secuencia5  ();
  76.       void secuencia6  ();
  77.       void secuencia7  ();
  78.       void secuencia8  ();
  79.       void secuencia9  ();
  80.       void secuencia10 ();
  81.       void secuencia11 ();
  82.       void salida      (); // funcion para mostrar los efectos
  83.       void dimmer      ();
  84.       void suiche();
  85.    //*******************
  86.       void freno();
  87.       void frenoflash();
  88.  
  89.    #int_RDA
  90.    void RDA_isr(void)
  91.    {
  92.  
  93.     //valor=0;
  94.   if(kbhit())//verifico si el dato ya esta disponible
  95.  {
  96.   //valor=0;
  97.     valor=getc();//adquiero el dato
  98.  
  99.     flag=1;
  100.     puerto=0;
  101.  
  102.  }
  103.  
  104.  
  105.   //  valor=getc(); //Captura el dato recibido del PIC 1
  106.  //  guardar=getc();
  107.  // flag=1;
  108.     //guardar =valor;
  109.      //putc(valor);
  110.    
  111.      
  112.      
  113.    }
  114.    
  115.    
  116.    
  117.  
  118.  
  119.  
  120.    // EEPROM DISTRIBUCION //
  121.    /*
  122.    0 u  pwmh
  123.    1 t  pwml
  124.    2 v SECUENCIA DIRECCIONALES
  125.    3 w SECUENCIA ESTACIONARIAS
  126.    4 x SECUENCIA FRENO
  127.    5 y SECUENCIA MEDIAS
  128.    6 z SECUENCIA SALUDO
  129.  
  130.    */
  131.  
  132.  
  133.  
  134.    // VOID MAIN //
  135.    void main()
  136.    {
  137.    SET_TRIS_a(0B00000000);
  138.    SET_TRIS_b(0B00000000);
  139.    SET_TRIS_c(0B10011111);
  140.    SET_TRIS_e(0B1);
  141.    setup_adc_ports(NO_ANALOGS);
  142.    setup_comparator(NC_NC_NC_NC);
  143.    portA=0x00;
  144.    portB=0x00;
  145.    //delay_ms(4000);
  146.  
  147.    enable_interrupts(INT_RDA); //HAbilita interrupcion por puerto serial
  148.    enable_interrupts(GLOBAL);  // Habilita las interrupcciones globales
  149.  
  150.    s=80;
  151.  
  152.  
  153.    while(TRUE)
  154.    {
  155.     // configura # de salidas
  156.    //***********************
  157.    //num = sizeof(s4d7);
  158.    // porta=tama;
  159. // num=num -1;
  160.  // num=8;
  161.  
  162.              
  163.   //****************************                  
  164.  
  165.     //  Reset_cpu();
  166.    
  167.    
  168.     // SALIDAS TRIS //  
  169.     if (n>=7)               // selecciono las salidas que necesito para que por error no se prendan los que no necesito
  170.        SET_TRIS_a(0B00000000);
  171.         if (n==6)
  172.            SET_TRIS_a(0B10000000);
  173.                if (n==5)
  174.                SET_TRIS_a(0B11000000);
  175.                    if (n==4)
  176.                    SET_TRIS_a(0B11100000);      
  177.                       if (n==3)          
  178.                       SET_TRIS_a(0B11110000);        
  179.                         if (n<=2)
  180.                           SET_TRIS_a(0B11111000);              
  181.  
  182.    //*********************************
  183.  
  184.    if (!input_state(acc))
  185.       {
  186.       ret1();
  187.       flag2=0;
  188.       }
  189.    if ((input_state(acc))&&(flag2==0))
  190.     {
  191.       flag2=1;
  192.       puerto=0;
  193.       secuencia3();
  194.       secuencia3();
  195.     }
  196.  
  197.  
  198.  
  199.  
  200.    // VALOR INTERUPCION /
  201.    if (flag==1)
  202.       {
  203.         //putc(valor);
  204.        //putc(guardar);
  205.         switch(valor)// aqui se pierde el contenido de valor
  206.          {      
  207.          case 'a':  
  208.          guardar=valor;  
  209.          //puerto=0;
  210.          secuencia1();                  
  211.          break;  
  212.          case 'b':
  213.          guardar=valor;
  214.          secuencia2();
  215.          break;
  216.          case 'c':
  217.          guardar=valor;
  218.          secuencia3();
  219.          break;
  220.          case 'd':
  221.          guardar=valor;
  222.          secuencia4();
  223.          break;
  224.          case 'e':  
  225.          guardar=valor;
  226.          secuencia5();                  
  227.          break;  
  228.          case 'f':
  229.          guardar=valor;
  230.          secuencia6();
  231.          break;
  232.          case 'g':
  233.          guardar=valor;
  234.          secuencia7();
  235.          break;
  236.          case 'h':
  237.          guardar=valor;
  238.          secuencia8();
  239.          break;
  240.          case 'i':
  241.          guardar=valor;
  242.          secuencia9();
  243.          break;
  244.          case 'j':
  245.          guardar=valor;
  246.          secuencia10();
  247.          break;
  248.          case 'k':
  249.          guardar=valor;
  250.          secuencia11();
  251.          break;
  252.  
  253.          // EEPROM //
  254.          case 't': // pwmh
  255.         // write_eeprom(0,guardar);
  256.          case 'u': // pwml
  257.         // write_eeprom(1,guardar);
  258.          case 'v': //DIRECCIONALES
  259.          write_eeprom(2,guardar);
  260.          break;
  261.          case 'w': // ESTACIONARIAS
  262.          write_eeprom(3,guardar);
  263.          break;
  264.          case 'x': // FRENO
  265.         // write_eeprom(4,guardar);
  266.          break;
  267.          case 'y': // MEDIAS
  268.         // write_eeprom(5,guardar);
  269.          break;
  270.          case 'z': // SALUDO
  271.          //write_eeprom(6,guardar);
  272.          break;
  273.          // default:
  274.          }
  275.          //putc(guardar);
  276.     mezcla=0x00;// LIMPIO EL PUERTO LUEGO DE VISUALIZAR LA FUNCION QUE QUIERO
  277.     salida();
  278.     flag=0;
  279.     valor=0;
  280.      // guardar =valor;
  281.     }
  282.  /* if (input_state(der))
  283.     {
  284.     putc(guardar);
  285.     valor=read_eeprom(0);
  286.     flag=1;
  287.    
  288.     }
  289.    
  290.  */    
  291.  
  292.     // DISRIMINA EL ESTADO STOP DIRECIONALES O MEDIAS //
  293.     //************************************************//
  294.     // puerto==0  solo las 2 direccionales1
  295.     // puerto==1  stop izquierdo y direccional derecha
  296.     // puerto==2  stop derecho y direccional izquierda
  297.     // puerto==3  solo direccional derecha
  298.     // puerto==4  solo direccional izquierda
  299.     if ((!input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(!input_state(medias)))// todo apagado
  300.     {
  301.     porta=0x00;
  302.     portb=0x00;
  303.  
  304.     }
  305.        if ((input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(!input_state(medias)))// solo freno
  306.        {
  307.        puerto=0;
  308.        frenoflash();
  309.        }
  310.        if ((input_state(stop))&&(input_state(izq))&&(input_state(der))&&(!input_state(medias)))// ambas direccionales activas
  311.        {
  312.        puerto=0;
  313.        secuencia1();
  314.    
  315.        }
  316.           if ((input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(!input_state(medias)))//freno izquierdo activo - direccional derecha activa
  317.           {
  318.           puerto=1;
  319.           valor=read_eeprom(3);
  320.            flag=1;
  321.  
  322.           }
  323.              if ((input_state(stop))&&(input_state(izq))&&(!input_state(der))&&(!input_state(medias))) // freno derecho activo - direccional izquierda activa
  324.              {
  325.               puerto =2;
  326.               //secuencia1();
  327.  
  328.              }
  329.                 if ((!input_state(stop))&&(input_state(izq))&&(input_state(der))&&(!input_state(medias))) //ambas direccionales estacionarias
  330.                 {
  331.                 puerto=0;
  332.                 secuencia1();
  333.  
  334.                 }
  335.                    if ((!input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(!input_state(medias)))//solo direccional derecha activa
  336.                    {
  337.                    puerto=3;// solo direccional derecha
  338.                    valor=read_eeprom(3);
  339.                    flag=1;
  340.                    }                  
  341.                       if  ((!input_state(stop))&&(input_state(izq))&&(!input_state(der))&&(!input_state(medias)))//solo direccional izquierda activa
  342.                       {
  343.                       puerto=4;
  344.                        secuencia1();
  345.                       }                    
  346.                          if ((!input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(input_state(medias)))//solo medias
  347.                          {
  348.                          puerto=0;
  349.                          secuencia10();// medias solo
  350.                          }
  351.                             if ((!input_state(stop))&&(input_state(izq))&&(input_state(der))&&(input_state(medias)))//solo direccionales estacionarias
  352.                             {
  353.                             puerto =0;
  354.                             secuencia1();
  355.                             }
  356.                                if ((!input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(input_state(medias))) //media izquierda activa dirrecional derecha activa
  357.                                {
  358.                                puerto=1;
  359.                                 secuencia1();
  360.                                }  
  361.                                   if ((!input_state(stop))&&(input_state(izq))&&(!input_state(der))&&(input_state(medias)))// media derecha activa direccional izquierda aciva
  362.                                   {
  363.                                   puerto=2;
  364.                                   secuencia1();
  365.                                   }
  366.                                       if ((input_state(stop))&&(input_state(izq))&&(input_state(der))&&(input_state(medias)))// todo activado da solo direccionals
  367.                                      {
  368.                                      puerto =0;
  369.                                      secuencia1();
  370.                                      }
  371.                                         if ((input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(input_state(medias)))// todo activado da solo direccionals
  372.                                         {
  373.                                         frenoflash();
  374.                                         }
  375.  
  376.      
  377.  
  378.      
  379.    }
  380.    }

¿Cómo estás trabajando el módulo RS232? ¿8 o 9 bits?

Tal vez lo que dicen en el siguiente hilo (respuesta número 7) sea el problema.

http://www.todopic.com.ar/foros/index.php?topic=15481.0
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 #36 en: 16 de Mayo de 2022, 16:54:04 »
Citar
¿Cómo estás trabajando el módulo RS232? ¿8 o 9 bits?

Tal vez lo que dicen en el siguiente hilo (respuesta número 7) sea el problema.
cordial saludo, el problema ya es en la bandera que no se si por extenso el codigo no funciona.
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.    #define izq    pin_c0 // naranja
  29.    #define medias pin_c1 // gris
  30.    #define acc    pin_c2 // amarillo
  31.    #define der    pin_c3 // blanco
  32.    #define stop   pin_c4 // azul
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 #37 en: 16 de Mayo de 2022, 17:15:13 »
ya encontre el problema, al parecer no cargaba el dato en el "flag" despues de la lectura en eeprom, al parecer hay que darle un tiempo minimo, comence con 50ms y ahora con 5ms y sigue trabajando, ademas en la recepcion serial no se han vuelto a perder los datos.
cuanto serian los tiempos minimos de escritura y lectura en ccs, lo voy a buscar en el datasheet a ver que encuentro.
Código: C++
  1. if ((input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(!input_state(medias)))//freno izquierdo activo - direccional derecha activa
  2.           {
  3.           puerto=0x01;
  4.           valor=read_eeprom(3);
  5.           delay_ms (5);
  6.            flag=1;
Si algo parece complicado... es por que esta mal explicado.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Se me pierde el dato recibido en una interrupción del puerto serie
« Respuesta #38 en: 16 de Mayo de 2022, 18:44:41 »
ya encontre el problema, al parecer no cargaba el dato en el "flag" despues de la lectura en eeprom, al parecer hay que darle un tiempo minimo, comence con 50ms y ahora con 5ms y sigue trabajando, ademas en la recepcion serial no se han vuelto a perder los datos.
cuanto serian los tiempos minimos de escritura y lectura en ccs, lo voy a buscar en el datasheet a ver que encuentro.
Código: C++
  1. if ((input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(!input_state(medias)))//freno izquierdo activo - direccional derecha activa
  2.           {
  3.           puerto=0x01;
  4.           valor=read_eeprom(3);
  5.           delay_ms (5);
  6.            flag=1;


  El tiempo hay que dárselo entre dos o más escrituras consecutivas, no en lecturas.

 10 ms suele ser lo más usual a esperar entre cada write_eeprom(data,address); consecutivo.

En lecturas no hay que esperar nada.

 


 

anything