TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: futurama en 06 de Febrero de 2016, 21:40:51

Título: Problema al leer una trama por RS232
Publicado por: futurama en 06 de Febrero de 2016, 21:40:51

     :-/  hola amigos   :-/

quiero preguntarles como puedo solucionar dicho problema,

estoy leyendo una trama de datos 25&52 por rs232, con un pic16f628a...pero el problema es que la lectura se queda pegada y no es capas de seguir leyendo los datos que le están llegando

nota: después de leer la trama separo los datos y los muestro en display de 4 segmentos

aquí envió el programa para que me puedan orientar con la solución;

saludos   :-/ :-/ :-/
////////////////////////////////////////////////////////////////////////////////////////////


// NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
char trama_serial[4];                   // Arreglo para recibir los datos.
int1 flag_rx = 0;                // Variable bandera de recepción.
int8  Num_1,Num_2,Num_3,Num_4;

// Servicio de interrupción por recepción de datos RS-232
#INT_RDA
void RECEPCION_RS232(void)

{
   gets(trama_serial);                  // Se recibe la cadena de datos.
   flag_rx = 1;                  // Se indica recepción completa.
}
   
   void main (void)
   {
   int tiempo = 10;
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   set_tris_a(0x00);
   set_tris_b(0x02);
     
   while (true)
   {
   
      if(flag_rx == 1)                // Si hay datos en el buffer...
      {
       //
       Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
       Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
       printf("%d%d%d%d\r",Num_1,Num_2,Num_3,Num_4);
                      // Limpiar la bandera "flag_rx"
        while (true)
      {
       output_b(0x12); output_a(Numeros[Num_1]);  delay_ms(tiempo);
       output_b(0x22); output_a(Numeros[Num_2]);  delay_ms(tiempo);
       output_b(0x42); output_a(Numeros[Num_3]);  delay_ms(tiempo);
       output_b(0x82); output_a(Numeros[Num_4]);  delay_ms(tiempo);
      }
      flag_rx = 0;   
     
   }
   }
   }
Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 06 de Febrero de 2016, 22:11:16
como sabes que no lee mas caracteres?

por que este bucle hace que se muestre siempre lo mismo en los displays

Código: C
  1. while (true)
  2.       {
  3.        output_b(0x12); output_a(Numeros[Num_1]);  delay_ms(tiempo);
  4.        output_b(0x22); output_a(Numeros[Num_2]);  delay_ms(tiempo);
  5.        output_b(0x42); output_a(Numeros[Num_3]);  delay_ms(tiempo);
  6.        output_b(0x82); output_a(Numeros[Num_4]);  delay_ms(tiempo);
  7.       }
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 06 de Febrero de 2016, 22:31:19
Agrego a lo de elgarbe

Citar
#INT_RDA
void RECEPCION_RS232(void)
{
   gets(trama_serial);
   flag_rx = 1;                  // Se indica recepción completa.
}

Otra cosa, bajo ningun motivo uses gets().
Por 2 razones:

No tiene una proteccion de bufferoverflow. Si observas no tiene un parametro que limite el tamaño, por lo cual si seguis presionando teclas y nunca presionas enter vas a sobreescribir toda la memoria RAM. Es decir por mas que tu array sea de 10 lugares, podrias terminar escribiendo 100, afectando a otras variables.

Y en la interrupcion, esa funcion se queda esperando que llegue otro caracter, por lo cual rompe el proposito de la interrupcion, que es atender los eventos lo mas rapido posible. Al quedarse ahi esperando por mas que otras interrupciones ocurran  se va a quedar ahi fijo hasta que un "enter" aparezca. Deberias usar getc(), e ir guardando letra por letra en el array. Luego cuando se completo el array ( que llegaron todos los datos ) procedes a activar una bandera como "flag_rx" y asi avisar al main() que el dato esta listo.
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 06 de Febrero de 2016, 22:34:06
y como se podría hacer eso que me comentas , no he podido mejorarlo
Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 06 de Febrero de 2016, 22:45:51
Si no entiendo mal lo de Killer sería algo así:

Código: C
  1. #INT_RDA
  2. void RECEPCION_RS232(void)
  3. {
  4.    getc(trama_serial[idx_Trama]);
  5.    idx_Trama++;
  6.    if (idx_Trama == 4){
  7.        idx_Trama = 0;
  8.        flag_rx = 1;                  // Se indica recepción completa.
  9.    }
  10. }

y necesitas una variable global volatile llama idx_Trama de tipo uint8_t

luego tu bucle principal sería:

Código: C
  1. while (true)
  2.    {
  3.    
  4.       if(flag_rx == 1)                // Si hay datos en el buffer...
  5.       {
  6.        //
  7.        Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
  8.        Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
  9.        printf("%d%d%d%d\r",Num_1,Num_2,Num_3,Num_4);
  10.                       // Limpiar la bandera "flag_rx"
  11.  
  12.        output_b(0x12); output_a(Numeros[Num_1]);  delay_ms(tiempo);
  13.        output_b(0x22); output_a(Numeros[Num_2]);  delay_ms(tiempo);
  14.        output_b(0x42); output_a(Numeros[Num_3]);  delay_ms(tiempo);
  15.        output_b(0x82); output_a(Numeros[Num_4]);  delay_ms(tiempo);
  16.  
  17.       flag_rx = 0;  
  18.      
  19.    }
  20.    }

posiblemente me olvide de algo, pero esa es la idea creo...

saludos!

Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 06 de Febrero de 2016, 22:54:21
gracias por el consejo, lo probare en seguida..tengo el simulador operativo
les comento enseguida como va
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 06 de Febrero de 2016, 22:54:51
Algo asi tambien puede ser:

Código: C
  1. // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  2. int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  3. char trama_serial[10];                  // Arreglo para recibir los datos.
  4. int1 flag_rx = 0;                       // Variable bandera de recepción.
  5. volatile int indice=0;
  6. int8 basura;
  7.  
  8. void RECEPCION_RS232(void)
  9. {
  10.         if(i<4)    // Solo 4 valores nomas.
  11.         {
  12.                 trama_serial[indice]=getc();
  13.                 indice++
  14.         }
  15.         else
  16.         {
  17.                 flag_rx = 1;                  // Se indica recepción completa.
  18.                 basura = getc();                // Descarto el caracter
  19.         }
  20. }
  21.  
  22. void main (void)
  23. {
  24.         int tiempo = 10;
  25.         int8 j;
  26.         set_tris_a(0x00);
  27.         set_tris_b(0x02);
  28.         enable_interrupts(INT_RDA);
  29.         enable_interrupts(GLOBAL);
  30.      
  31.         while (true)
  32.         {
  33.  
  34.                 if(flag_rx == 1)                // Si hay datos en el buffer...
  35.                 {
  36.  
  37.                         // Pasamos de ASCII a decimal
  38.                        
  39.                         for( j=0 ; j<4 ; j++)
  40.                         {
  41.                                 trama_serial[j] -= 48;
  42.                         }
  43.  
  44.                         // Mostramos por UART
  45.                         printf("%d%d%d%d\r",trama_serial[0],trama_serial[1],trama_serial[2],trama_serial[3]);
  46.  
  47.                         // Mostramos ahora por el puerto A, cada numero
  48.  
  49.                         output_b(0x12);
  50.                         output_a(Numeros[trama_serial[0]]);
  51.                         delay_ms(tiempo);
  52.                         output_b(0x22);
  53.                         output_a(Numeros[trama_serial[1]]);
  54.                         delay_ms(tiempo);
  55.                         output_b(0x42);
  56.                         output_a(Numeros[trama_serial[2]]);
  57.                         delay_ms(tiempo);
  58.                         output_b(0x82);
  59.                         output_a(Numeros[trama_serial[3]]);
  60.                         delay_ms(tiempo);
  61.  
  62.                         // Limpio el indice para que comience de nuevo Y limpio el flag para indicar que termino y no entre mas aca hasta que se llene
  63.                         indice=0;
  64.                         flag_rx = 0;
  65.                 }
  66.         }
  67. }

Solo decirte que este programa espera 4 caracteres desde la UART, que son numeros y descarta TODO lo que pueda llegar hasta que se muestre por completo. Cuando se mostro todo espera otros 4 numeros mas.
La diferencia entre el codigo de interrupcion de el garbe es que el mio como decia tira cualquier numero que pueda llegar mientras estas mostrando las cosas. Mientras que el de elgarbe no y sigue recibiendo a pesar que todavia esta mostrando.

Ahora tenes ya 2 codigos que hacen lo mismo :P
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 06 de Febrero de 2016, 23:00:56
gracias, lo estoy simulando ahora , la idea es que espere la trama completa y despues la muestre en los display , para que no se se empieze a mesclar las tramas
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 06 de Febrero de 2016, 23:09:02
Amigos probe el program que me indicaron, pero  igual sigue pegado
les puedo enviar el archivo , ai pueden ver bien el programa

saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 06 de Febrero de 2016, 23:22:46
Yo no estoy en la pc.
Igual es raro, el programa espera 4 números. Hasta q no los ingresas no hace nada. No hay que apretar entre entre ellos. Simplemente poner 1234 y debería funcionar. Pon un breack point dentro de la int de la uart a ver si entra y que recibe.
Que hace el programa cuando lo corres?

Saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 06 de Febrero de 2016, 23:23:56
Amigos

este es el programa completo , necesito recibir esta trama 25&26, logro recibir la trama pero aun no puedo mostrarlos
en los display 7 segemntos, esta trama siempre variara entre 0 al 99  por ejemplo   00&00...hasta  el 99&99


//////////////////////////////////////////////////////////////
#include <16f628A.H>
#fuses NOMCLR
#fuses INTRC_IO
#FUSES NOWDT                    //No Watch Dog Timer
//#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES RESERVED                 //Used to set the reserved FUSE bits
#use delay (clock=4000000)
#use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
#include <stdlib.h>
#define display_1     PIN_B4
#define display_2     PIN_B5
#define display_3     PIN_B6
#define display_4     PIN_B5



// NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
char trama_serial[4];                  // Arreglo para recibir los datos.
int1 flag_rx = 0;                       // Variable bandera de recepción.
volatile int indice=0;
int8 basura;
int i;
void RECEPCION_RS232(void)
{
        if(i<4)    // Solo 4 valores nomas.
        {
                trama_serial[indice]=getc();
                indice++;
        }
        else
        {
                flag_rx = 1;                  // Se indica recepción completa.
                basura = getc();                // Descarto el caracter
        }
}
 
void main (void)
{
        int tiempo = 10;
        int8 j;
        set_tris_a(0x00);
        set_tris_b(0x02);
        enable_interrupts(INT_RDA);
        enable_interrupts(GLOBAL);
     
        while (true)
        {
 
                if(flag_rx == 1)                // Si hay datos en el buffer...
                {
 
                        // Pasamos de ASCII a decimal
                       
                        for( j=0 ; j<4 ; j++)
                        {
                                trama_serial[j] -= 48;
                        }
 
                        // Mostramos por UART
                        printf("%d%d%d%d\r",trama_serial[0],trama_serial[1],trama_serial[2],trama_serial[3]);
 
                        // Mostramos ahora por el puerto A, cada numero
 
                        output_b(0x12);
                        output_a(Numeros[trama_serial[0]]);
                        delay_ms(tiempo);
                        output_b(0x22);
                        output_a(Numeros[trama_serial[1]]);
                        delay_ms(tiempo);
                        output_b(0x42);
                        output_a(Numeros[trama_serial[2]]);
                        delay_ms(tiempo);
                        output_b(0x82);
                        output_a(Numeros[trama_serial[3]]);
                        delay_ms(tiempo);
 
                        // Limpio el indice para que comience de nuevo Y limpio el flag para indicar que termino y no entre mas aca hasta que se llene
                        indice=0;
                        flag_rx = 0;
                }
        }
}
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 06 de Febrero de 2016, 23:29:13
esto es lo que se visualiza
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 07 de Febrero de 2016, 01:22:38
Sinceramente no comprendo demasiado por que no hay un circuito "completo". Los displays 7 segmentos por que son manejados ? Directamente desde el PIC o por un cd4511 ?

Por que hay un LCD en la captura de pantalla, cuando no hay nada de LCD en el codigo.

El codigo que pasamos esperan 4 numeros SEGUIDOS, y no separados por un '&'. Lo cual estaria agregando un caracter mas.

Cuando nos indiques eso va a ser mas facil.


PD: Por mi no subas ningun archivo de Proteus por que no lo tengo.
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 01:41:14

OK, AMIGO

DATOS DEL FUNCIONAMIENTO

1- El lcd es parte del programa del transmisor que es un PIC16F877A, el esta mandando la trama 26&50 , programe un lcd para visualizar la trama         que se esta transmitiendo.

2- los primeros 4 bit del PORTA del  pic16f628a le envian señales al 4511 para encender los display multiplexados, los display son catodo comun
    por lo cual el portb esta comandando las activaciones de los transitores para activar el negativo de los display

la misión es poder separar la trama enviada y colocar cada numero en cada display por ejemplo:

si la trama que se recepciono fue  "25&58" , tengo que separar cada numero en cada display

     2                   5                  5             8
Display 1   -  Display2  -  Display3  - Display4




Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 03:10:41
Y no podrías probar sin enviar el & entre los dos grupos de numeros? porque el programa así como está debería funcionar reciviendo 4 números.... podrías poner el instrumento RS232 de proteus para ver la trama real que sale de un micro y llega al otro para aislar el problema....

sds.
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 07 de Febrero de 2016, 04:30:54
Bueno..

Proba este codigo:

Código: C
  1. //////////////////////////////////////////////////////////////
  2. #include <16f628A.H>
  3. #fuses NOMCLR
  4. #fuses INTRC_IO
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  7. #FUSES NOPUT                    //No Power Up Timer
  8. #FUSES NOPROTECT                //Code not protected from reading
  9. #FUSES NOBROWNOUT               //No brownout reset
  10. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  11. #FUSES NOCPD                    //No EE protection
  12. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  13. #use delay (clock=4000000)
  14. #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  15. #include <stdlib.h>
  16. #define display_1     PIN_B4
  17. #define display_2     PIN_B5
  18. #define display_3     PIN_B6
  19. #define display_4     PIN_B5
  20.  
  21.  
  22.  
  23. // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  24. int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  25. char trama_serial[4];                  // Arreglo para recibir los datos.
  26. int1 flag_rx = 0;                       // Variable bandera de recepción.
  27. volatile int indice=0;
  28. int8 basura;
  29.  
  30. #INT_RDA
  31. void RECEPCION_RS232(void)
  32. {
  33.         if(indice<5)    // Solo 5 valores nomas.
  34.         {
  35.                 trama_serial[indice]=getc();
  36.                 indice++;
  37.         }
  38.         else
  39.         {
  40.                 flag_rx = 1;                  // Se indica recepción completa.
  41.                 basura = getc();                // Descarto el caracter
  42.         }
  43. }
  44.  
  45. void main (void)
  46. {
  47.         int tiempo = 10;
  48.         int8 j;
  49.         set_tris_a(0x00);
  50.         set_tris_b(0x02);
  51.         enable_interrupts(INT_RDA);
  52.         enable_interrupts(GLOBAL);
  53.      
  54.         while (true)
  55.         {
  56.  
  57.                 if(flag_rx == 1)                // Si hay datos en el buffer...
  58.                 {
  59.  
  60.                         // Pasamos de ASCII a decimal
  61.                        
  62.                         for( j=0 ; j<5 ; j++)
  63.                         {
  64.                                 trama_serial[j] -= 48;
  65.                         }
  66.  
  67.                         // Mostramos por UART
  68.                         printf("%d%d%d%d\r",trama_serial[0],trama_serial[1],trama_serial[3],trama_serial[4]);
  69.  
  70.                         // Mostramos ahora por el puerto A, cada numero
  71.  
  72.                         output_b(0x12);
  73.                         output_a(Numeros[trama_serial[0]]);
  74.                         delay_ms(tiempo);
  75.                         output_b(0x22);
  76.                         output_a(Numeros[trama_serial[1]]);
  77.                         delay_ms(tiempo);
  78.                         output_b(0x42);
  79.                         output_a(Numeros[trama_serial[3]]);
  80.                         delay_ms(tiempo);
  81.                         output_b(0x82);
  82.                         output_a(Numeros[trama_serial[4]]);
  83.                         delay_ms(tiempo);
  84.  
  85.                         // Limpio el indice para que comience de nuevo Y limpio el flag para indicar que termino y no entre mas aca hasta que se llene
  86.                         indice=0;
  87.                         flag_rx = 0;
  88.                 }
  89.         }
  90. }

Tuve un error yo en el copy-paste el cual sin querer me olvide cambiar la i, por indice.
Faltaba el #INT_RDA antes de la funcion de interrupcion.
Cambie el programa para que ahora reciba 5 caracteres y tome en cuenta esa '&'

Puede haber algunos problemas en el tiempo, el cual se solucionarian mandando un caracter inicial de la trama. O Sino deberias usar el codigo de elgarbe en la interrupcion (Extendido a 5 caracteres obvio) y que es lo unico que cambiaria de tu programa.
Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 09:59:03
Trama_serial[5]

Sds
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 11:13:04
claro, enviare la foto de lo que me pediste
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 11:51:11
 :-/ :-/
hola

la trama se esta enviando  ... el pic transmisor va cambiando la trama cada 1 segundo 00&19  -  00&20  -  00&21...sucesivamente


Hyperterminal  TRANSMISOR  = 00&25
  el lcd   muestra solo los decimales que envia el transmisor
Hyperterminal   RECEPTOR      = 00&25
* error  = el programa no muestra los datos por los display

 :-/ :-/ :-/ :-/ :-/

saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 11:53:36
ok
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 12:18:05
 saludos :-/

    Ahora el programa funciona mejor, pero aun sigue con unos problemas:

1- ahora muestra los datos en los display,,,pero no puedo sincronizar los tiempos para la multiplexacion,,por mas
    que baje o suba el tiempo de encendido entre los display...no se puede visualizar todos iluminado ala vez

2- intente incorporporar las rutinas que me enviaron, pero si coloco las instrucciones getc y la remplazo por gets , no funciona
    gets funciona por que al ser una trama pasa a ser texto, y la mejor manera para leer esto es con gets....ahora bien mi consulta
    es como puedo hacer lo siguiente
    en la interrupción RDA...
    como puedo asegurarme de que llegue la trama completa con la instrucción "gets"...   y después que el programa visualice la trama hasta que       llegue la proxima interrupcion


saludos amigos, si pudieran ayudarme
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 12:22:01

 :-/ :-/
adjunto programa, para que me puedan orientar por favor
saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 13:51:27
Killer ya te explicó que gets espera a que haya un entre (\n) entonces si el transmisor finaliza con un \n entoses podes usar gets, pero si el transmisor manda sólo los datos q vos le pones, entonces gets no sirve. Igual que getc no sirve si el transmisor envía \n ya que serían 6 caracteres cada trama.
Como conocemos la mitad de tu sistema es complicado dar en la tecla.
De todos modos deberías aprovechar la oportunidad para buscar información de cada función que proponemos para aprender bien. A prueba y error es medio feo programar....

Sds.
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 07 de Febrero de 2016, 13:56:36
saludos :-/

    Ahora el programa funciona mejor, pero aun sigue con unos problemas:

1- ahora muestra los datos en los display,,,pero no puedo sincronizar los tiempos para la multiplexacion,,por mas
    que baje o suba el tiempo de encendido entre los display...no se puede visualizar todos iluminado ala vez

2- intente incorporporar las rutinas que me enviaron, pero si coloco las instrucciones getc y la remplazo por gets , no funciona
    gets funciona por que al ser una trama pasa a ser texto, y la mejor manera para leer esto es con gets....ahora bien mi consulta
    es como puedo hacer lo siguiente
    en la interrupción RDA...
    como puedo asegurarme de que llegue la trama completa con la instrucción "gets"...   y después que el programa visualice la trama hasta que       llegue la proxima interrupcion


saludos amigos, si pudieran ayudarme

1 - Lo tuyo es una simulacion. Proteus se ve realmente MAL cuando se trata de multiplexado (con delays). Tambien podrias cambiar el programa para que continuamente muestre los valores recibidos y comente los delays asi se ve mejor en proteus. De paso cree otro array de caracteres el cual va a mantener el valor a mostrar en el display. Mientras puede ser cambiado el array que recibe datos.

Código: C
  1. void main (void)
  2. {
  3.         char array_valores[7];
  4.         int tiempo = 10;
  5.         int8 j;
  6.         set_tris_a(0x00);
  7.         set_tris_b(0x02);
  8.         enable_interrupts(INT_RDA);
  9.         enable_interrupts(GLOBAL);
  10.      
  11.         while (true)
  12.         {
  13.  
  14.                 if(flag_rx == 1)                // Si hay datos en el buffer...
  15.                 {
  16.  
  17.                         // Pasamos de ASCII a decimal
  18.                        
  19.                         for( j=0 ; j<5 ; j++)
  20.                         {
  21.                                  array_valores[j] = trama_serial[j] - 48;
  22.                         }
  23.  
  24.                         // Mostramos por UART
  25.                         printf("%d%d%d%d\r",array_valores[0],array_valores[1],array_valores[3],array_valores[4]);
  26.  
  27.                         // Limpio el indice para que comience de nuevo Y limpio el flag para indicar que termino y no entre mas aca hasta que se llene
  28.                         indice=0;
  29.                         flag_rx = 0;
  30.  
  31.  
  32.                 }
  33.  
  34.                 // Mostramos ahora por el puerto A, cada numero
  35.                 output_b(0x12);
  36.                 output_a(Numeros[array_valores[0]]);
  37.                 //delay_ms(tiempo);
  38.                 output_b(0x22);
  39.                 output_a(Numeros[array_valores[1]]);
  40.                 //delay_ms(tiempo);
  41.                 output_b(0x42);
  42.                 output_a(Numeros[array_valores[3]]);
  43.                 //delay_ms(tiempo);
  44.                 output_b(0x82);
  45.                 output_a(Numeros[array_valores[4]]);
  46.                 //delay_ms(tiempo);
  47.         }
  48. }


2- Respecto a gets... Ya te dije lo que funciona mal. El PIC no recibe "textos" , "strings" completos el PIC solamente recibe caracter a caracter. Entre cada caracter que llega hay mucho tiempo y mas a 9600 baudios en el que podria estar "mostrando" en los displays. Ya te dije las razones y te lo vuelvo a decir ahora. Yo no uso CCS y tal ves se me esta escapando algo pero no creo errarle sobre el uso del gets.


Citar
como puedo asegurarme de que llegue la trama completa con la instrucción "gets"...   y después que el programa visualice la trama hasta que       llegue la proxima interrupcion

Que tu PIC envie un '\n' ademas.. es decir 25&32\n  , (6 caracteres + 1 as por caracter nulo, deberia ser de 7 lugares como minimo tu array. Suerte con un buffer overflow tambien.
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 14:57:04
gracias por las respuestas

voy a modificar el programa del transmisor, agregare el " 25&32\n"

1- tengo un problema nuevamente no puedo hacer contar automaticamente el decimal 1 , se queda pegado..obviamente lo programe mal
2- solo el decimal 2 funciona bien el va de 00 a 99

me podrían ayudar con eso

saludos
gracias
////////////////////////////////////////////////////////////////////////////////////////
#include <16f877a.h>
#use delay (crystal = 4MHz)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8)

#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_TYPE 2
#include <lcd.c>

 void main(void){
 int Num1 = 0;
 int Num2 = 0;

 
 lcd_init();
 
 
 while (1){
   for (Num1=0 ;Num1<=99;Num1++);
       {(Num2=25;Num2<=99;Num2++){
      //putc(valor);
      lcd_gotoxy(1,1); printf(LCD_PUTC, " Decimal 1: %02d",Num1);
      lcd_gotoxy(1,2); printf(LCD_PUTC, " Decimal 2: %02d",Num2);
      printf("%02d&%02d\n\r",Num1,Num2);
   delay_ms(1500);
   }
    }
 }
 }
Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 15:08:08
Y el segundo for? El del interino?
Por que no lees el post de killer de buenas prácticas de programación?

Sds.
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 07 de Febrero de 2016, 15:17:13
Este es uno de los casos que se notaria la diferencia con solo identarlo, te dejo tu codigo identado primero, y luego que diga todos los errores pongo el codigo correcto

Código: C
  1. while (1)
  2.         {
  3.                 for (Num1=0 ;Num1<=99;Num1++);
  4.                 {
  5.                         (Num2=25;Num2<=99;Num2++)
  6.                         {
  7.                                 //putc(valor);
  8.                                 lcd_gotoxy(1,1); printf(LCD_PUTC, " Decimal 1: %02d",Num1);
  9.                                 lcd_gotoxy(1,2); printf(LCD_PUTC, " Decimal 2: %02d",Num2);
  10.                                 printf("%02d&%02d\n\r",Num1,Num2);
  11.                                 delay_ms(1500);
  12.                         }
  13.                 }
  14.         }


- El primer for, tiene un ";" al final. Por lo cual no ejecuta nada
- El segundo intento de for, ni siquiera tiene escrito el for, deberia darte un error en la compilacion eso.
- Estas enviando un valor mas por la UART, dijimos xx&xx\n , pero vos estas enviando xx&xx\n\r


Finalmente el codigo:

Código: C
  1. while (1)
  2.         {
  3.                 for (Num1=0 ;Num1<=99;Num1++)
  4.                 {
  5.                         for(Num2=25;Num2<=99;Num2++)
  6.                         {
  7.                                 //putc(valor);
  8.                                 lcd_gotoxy(1,1); printf(LCD_PUTC, " Decimal 1: %02d",Num1);
  9.                                 lcd_gotoxy(1,2); printf(LCD_PUTC, " Decimal 2: %02d",Num2);
  10.                                 printf("%02d&%02d\n",Num1,Num2);
  11.                                 delay_ms(1500);
  12.                         }
  13.                 }
  14.         }
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 15:36:58
gracias por responder

pido disculpa por esos errores básicos, traspase mal la información al foro

KILLERJC

Te digo por adelantado gracias por las respuestas que me envías, creo que me exprese mal  pero lo que yo estoy intentando de arreglar en el programa es que ambos decimales se estén incrementando de 1 en 1 automáticamente los dos al mismo tiempo; por ejemplo ;

carge el programa pero persiste la falla , ya que el contador esta dentro de un for y lo que esta haciendo es lo siguiente :
cuando el decimal 1 llega a 99 , recién ahí se esta incrementando el otro contador..

yo quiero hacer esto:
funcionamiento correcto = 01&01 - 02&02 - 03&03 - 04&04
funcionamiento actual     = 00&01 - 00&02 - 00&03 - 00&04

Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 07 de Febrero de 2016, 15:42:16
Simple... quita un for y deja solamente a Num1
Código: C
  1. while (1)
  2.         {
  3.                 for (Num1=0 ;Num1<=99;Num1++)
  4.                 {
  5.                         lcd_gotoxy(1,1);
  6.                         printf(LCD_PUTC, " Decimal 1: %02d",Num1);
  7.                         lcd_gotoxy(1,2);
  8.                         printf(LCD_PUTC, " Decimal 2: %02d",Num1);
  9.                         printf("%02d&%02d\n",Num1,Num1);
  10.                         delay_ms(1500);
  11.                         }
  12.                 }
  13.         }
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 16:09:40

solucionado,  ((:-)) ((:-)) ((:-))

ese tema gracias, pero aun estoy atascado en el otro incorpore la  "\n" ... ahora si que no me muestra nada... no se si necesitas algo que te envié para que me puedas ayudar mejor

 :-/ :-/ :-/ :-/ :-/
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 16:41:02
esto me esta complicando, incorpore las modificaciones y o hacen nada el programa
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 07 de Febrero de 2016, 17:10:12
esto me esta complicando, incorpore las modificaciones y o hacen nada el programa

Nuevametne te pido perdon es que ando con otras cosas y por ahi me pierdo. gets() detecta un \r , asi que reemplaza el \n por el \r. Quedando de esta forma:

printf("%02d&%02d\r",Num1,Num1);

Y ahora si el receptor deberia tomar el valor correcto. ( Espero )
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 17:50:55
KILLERJC

te serviria si te mando el programa.. se arreglo .. pero lo cargue pero segue con pestañasos los display
Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 17:59:31
yo diría que lo pongas en un post. Pero primero elegi aariba a la derecha donde está el combo de código el ue dice "C" y en medio de esas etiquetas ue se te crean en el post, pegas el código... ahi lo podemos ver bien.
Lo cargaste en el micro real y los dispay parpaden? o lo seguis vendo en proteus?

sds
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 18:18:46
 si lo cargue en una tarjeta electronica 100% real....
esas instrucciones de post donde las encuentras en el menu de responder mensajes
Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 18:21:42
Tenes
Asunto:
Icono del mensaje:
B   I    U  ............................ Tipo de fuente       Tamaño de Fuente                      Cambiar colo      Codigo

ese combo que dice código lo desplegas y elegis C

sds.
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 18:34:07
perfecto... ahi va el programa 
saludos amigos

Código: C
  1. #include <16f628A.H>
  2. #fuses NOMCLR
  3. #fuses INTRC_IO
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6. #FUSES NOPUT                    //No Power Up Timer
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10. #FUSES NOCPD                    //No EE protection
  11. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12. #use delay (clock=4000000)
  13. #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14. #define display_1     PIN_B4
  15. #define display_2     PIN_B5
  16. #define display_3     PIN_B6
  17. #define display_4     PIN_B7
  18. void alarma(void);  
  19. // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20. int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21. char trama_serial[5];                   // Arreglo para recibir los datos.
  22. int1 flag_rx = 0;  
  23.               // Variable bandera de recepción.
  24. int8  Num_1,Num_2,Num_3,Num_4,Num_2x;
  25.  
  26. #INT_RDA
  27. void RECEPCION_RS232(void)
  28.  
  29. {
  30.    gets(trama_serial);                  // Se recibe la cadena de datos.
  31.    flag_rx = 1;                  // Se indica recepción completa.
  32. }
  33.  
  34.  
  35.    
  36.    void main (void)
  37.    {
  38.    
  39.    
  40.    enable_interrupts(INT_RDA);
  41.    enable_interrupts(GLOBAL);
  42.    set_tris_a(0x00);
  43.    //set_tris_b(0x06);
  44.  
  45.    while (true)
  46.    {
  47.      
  48.      
  49.       if(flag_rx==1 )                // Si hay datos en el buffer...
  50.       {
  51.       Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
  52.       Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
  53.       Num_2X =(trama_serial[2]);
  54.       printf("%d%d%c%d%d\r"Num_1,Num_2,Num_2x,Num_3,Num_4);
  55.       alarma();
  56.       flag_rx = 0;    
  57.       }
  58.    }
  59.    }
  60.    
  61. void alarma(void)
  62. {      
  63.          
  64.          
  65.          output_high(Display_1);
  66.          output_a(Numeros[Num_1]);
  67.          delay_ms(100);
  68.          output_low(Display_1);
  69.          output_high(Display_2);                            
  70.          output_a(Numeros[Num_2]);          
  71.          delay_ms(100);
  72.          output_low(Display_2);
  73.          output_high(Display_3);
  74.          output_a(Numeros[Num_3]);
  75.          delay_ms(100);
  76.          output_low(Display_3);
  77.          output_high(Display_4);
  78.          output_a(Numeros[Num_4]);
  79.          delay_ms(100);
  80.          output_low(Display_4);
  81.  
  82. }
Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 19:03:45
el tema de que los display parpadean es por que solo los refrescas cuando recives las trama.
La funcion alarma debería llamarse constantemente y el tiempo entre display y display tenes que bajarlo mucho, digaos 1mseg cada display. De este modo, si alarma esta corriendo constanteente los display van a mostrar contantemente los mismos numeros. Pero cuando se reciva una nueva trama, se van a actualizar los datos y la proxima vez que entre en alarma se verán los nuevos números.
Algo así:

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21.     char trama_serial[5];                   // Arreglo para recibir los datos.
  22.     int1 flag_rx = 0;  
  23.                   // Variable bandera de recepción.
  24.     int8  Num_1,Num_2,Num_3,Num_4,Num_2x;
  25.      
  26.     #INT_RDA
  27.     void RECEPCION_RS232(void)
  28.      
  29.     {
  30.        gets(trama_serial);                  // Se recibe la cadena de datos.
  31.        flag_rx = 1;                  // Se indica recepción completa.
  32.     }
  33.      
  34.      
  35.        
  36.        void main (void)
  37.        {
  38.        
  39.        
  40.        enable_interrupts(INT_RDA);
  41.        enable_interrupts(GLOBAL);
  42.        set_tris_a(0x00);
  43.        //set_tris_b(0x06);
  44.      
  45.        while (true)
  46.        {
  47.          
  48.          
  49.           if(flag_rx==1 )                // Si hay datos en el buffer...
  50.           {
  51.           Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
  52.           Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
  53.           Num_2X =(trama_serial[2]);
  54.           printf("%d%d%c%d%d\r"Num_1,Num_2,Num_2x,Num_3,Num_4);
  55.  
  56.           flag_rx = 0;    
  57.           }
  58.           alarma();     //Esto se ejecuta constantemete, no importa si se ha recivido trama nueva o no.
  59.        }
  60.        }
  61.        
  62.     void alarma(void)
  63.     {      
  64.              
  65.              
  66.              output_high(Display_1);
  67.              output_a(Numeros[Num_1]);
  68.              delay_ms(1);
  69.              output_low(Display_1);
  70.              output_high(Display_2);                            
  71.              output_a(Numeros[Num_2]);          
  72.              delay_ms(1);
  73.              output_low(Display_2);
  74.              output_high(Display_3);
  75.              output_a(Numeros[Num_3]);
  76.              delay_ms(1);
  77.              output_low(Display_3);
  78.              output_high(Display_4);
  79.              output_a(Numeros[Num_4]);
  80.              delay_ms(1);
  81.              output_low(Display_4);
  82.      
  83.     }
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 19:17:51
 :-/ :-/ :-/ :-/ :-/ :-/ :-/
 (((:-))) (((:-))) (((:-)))

Excelente muchas gracias

ahí partió super bien el programa, ahora se logra ver perfectamente los display ....Pero para eso tuve que hacer lo ultimo que me enviaste
bajar a 1 ms la sincronizar y eliminar la confirmación de datos en la rutina del RDA

ahora recibe lo que quiere, quiero evitar que eso pase .. probe  sus ideas  que me enviaron pero no me resulta ... colo cuando pongo

este codigo parte super bien..pero queda desprotegido

Código: C
  1. #INT_RDA
  2.     void RECEPCION_RS232(void)
  3.      
  4.     {
  5.        gets(trama_serial);                  // Se recibe la cadena de datos.
  6.        flag_rx = 1;                  // Se indica recepción completa.
  7.     }

Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 19:35:30
... y eliminar la confirmación de datos en la rutina del RDA

yo no dije eso...

ahora recibe lo que quiere, quiero evitar que eso pase .. probe  sus ideas  que me enviaron pero no me resulta ... colo cuando pongo

este codigo parte super bien..pero queda desprotegido

Código: C
  1. #INT_RDA
  2.     void RECEPCION_RS232(void)
  3.     {
  4.        gets(trama_serial);                  // Se recibe la cadena de datos.
  5.        flag_rx = 1;                  // Se indica recepción completa.
  6.     }

que sería "queda desprotegido"?

La comunicacion serie no estaba resuelta ya???
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 07 de Febrero de 2016, 19:41:45
char trama_serial[5];                   // Arreglo para recibir los datos.

Aumenten el tamaño del buffer. Ponelo en 10.

El tema de mostrar en los displays yo lo habia sacado afuera antes, no se por que ahora estan dentro.

Citar
que sería "queda desprotegido"?

Tal ves se refirio cuando dije sobre un buffer overflow.

Citar
La comunicacion serie no estaba resuelta ya???

Solo le funciona con el gets(), y no se por que no le funciona con el getc(), ya que el gets() utiliza el getc() para obtener cada letra segun el manual del CCS.
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 19:46:17

en la rutina del rda , queria colocarle que confirme ultimo dato de la trama y cuando pase eso que de por aceptada la recepción

ahora en el programa solo queda recibiendo datos, con el afan de evitar posibles fallas cuando el programa este operando
Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 20:14:58
a ver en el programa del que transmite cambiaste el '\n' por el '\r'?

Código: C
  1. while (1)
  2.             {
  3.                     for (Num1=0 ;Num1<=99;Num1++)
  4.                     {
  5.                             lcd_gotoxy(1,1);
  6.                             printf(LCD_PUTC, " Decimal 1: %02d",Num1);
  7.                             lcd_gotoxy(1,2);
  8.                             printf(LCD_PUTC, " Decimal 2: %02d",Num1);
  9.                             printf("%02d&%02d\r",Num1,Num1);
  10.                             delay_ms(1500);
  11.                             }
  12.                     }
  13.             }

ese es el primer tema importante que killer ya comento que se habia equivocado. La trama tiene que ser 00&00\r o sea que son 6 caracteres los que salen del transmisor.
Cuando el primer caracter sale del Transmisor (Tx) entra a la interrupcion del PIC Receptor (Rx) y como la instruccion en la ISR es un gets se queda ahí clavado hasta que llegue el '\r' (esa parte no la entiendo bien, tendría que ver la implementacion de gets)

Bueno, investigando un poco encontré este post:
https://www.ccsinfo.com/forum/viewtopic.php?t=43695
donde se dice esto:
"You can't use 'gets', with interrupt driven RS232.

gets, expects to sit and wait for an entire string. If you put it inside an interrupt receive routine, you 'throw away' the point of having interrupt driven receive, locking the program till the string arrives. Yetch.
Put it outside the interrupt, and the PIC will hang forever, since characters will never become available to this routine.... "

Lo que yo haría es lo que ya hemos sugerido con KILLER, es usar getc dentro de la interrupcion:

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21. char trama_serial[10];                  // Arreglo para recibir los datos.
  22. int1 flag_rx = 0;                       // Variable bandera de recepción.
  23. volatile int indice=0;
  24. int8 basura;
  25.                   // Variable bandera de recepción.
  26.     int8  Num_1,Num_2,Num_3,Num_4,Num_2x;
  27.      
  28. #INT_RDA
  29. void RECEPCION_RS232(void)
  30. {
  31.         if(indice<5)    // Solo 5 valores nomas.
  32.         {
  33.                 trama_serial[indice]=getc();
  34.                 indice++;
  35.         }
  36.         else
  37.         {
  38.                 flag_rx = 1;                  // Se indica recepción completa.
  39.                 basura = getc();                // Descarto el caracter
  40.         }
  41. }
  42.  
  43.      
  44.      
  45.        
  46.        void main (void)
  47.        {
  48.        
  49.        
  50.        enable_interrupts(INT_RDA);
  51.        enable_interrupts(GLOBAL);
  52.        set_tris_a(0x00);
  53.        //set_tris_b(0x06);
  54.      
  55.        while (true)
  56.        {
  57.          
  58.          
  59.           if(flag_rx==1 )                // Si hay datos en el buffer...
  60.           {
  61.           Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
  62.           Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
  63.           Num_2X =(trama_serial[2]);
  64.           printf("%d%d%c%d%d\r"Num_1,Num_2,Num_2x,Num_3,Num_4);
  65.  
  66.           flag_rx = 0;    
  67.           }
  68.           alarma();     //Esto se ejecuta constantemete, no importa si se ha recivido trama nueva o no.
  69.        }
  70.        }
  71.        
  72.     void alarma(void)
  73.     {      
  74.              
  75.              
  76.              output_high(Display_1);
  77.              output_a(Numeros[Num_1]);
  78.              delay_ms(1);
  79.              output_low(Display_1);
  80.              output_high(Display_2);                            
  81.              output_a(Numeros[Num_2]);          
  82.              delay_ms(1);
  83.              output_low(Display_2);
  84.              output_high(Display_3);
  85.              output_a(Numeros[Num_3]);
  86.              delay_ms(1);
  87.              output_low(Display_3);
  88.              output_high(Display_4);
  89.              output_a(Numeros[Num_4]);
  90.              delay_ms(1);
  91.              output_low(Display_4);
  92.      
  93.     }

Si eso no funciona hay que seguir buscando con el getc.

Saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 20:28:12
 :-/ :-/ :-/ (((:-))) (((:-))) (((:-)))

gracias amigo , modifique el programa en ambos lados receptor y emisor y no pasa nada .. solo quiere funcionar con gets....pero quiero agradecerle por la ayuda brinda ..muchisimas gracias

  agradecimientos a  elgarbe y KILLERJC (((:-)))

los quería molestar con la ultima consulta, como puedo hacer que led sea intermitente sin interferir en el proceso normal que tiene el microcontrolador.

yo se hacer que un led se encienda y se apague... pero en este caso el led es como el indicador de que el micro esta operando...es como un indicador del sistema de vida por decir algo...cuando lo intento me hace pegar el programa...es como si funcionara al ritmo del led,la idea es que el led sea independiente su parpadeo

Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 20:36:33
Para el led tenes que usar un timer con interrupcion:

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21. char trama_serial[10];                  // Arreglo para recibir los datos.
  22. int1 flag_rx = 0;                       // Variable bandera de recepción.
  23. volatile int indice=0;
  24. int8 basura;
  25.                   // Variable bandera de recepción.
  26.     int8  Num_1,Num_2,Num_3,Num_4,Num_2x;
  27.  
  28.  
  29. int interrupt_counter=0;
  30. #define LED   PIN_A0           // Aquí el pin donde esta el led
  31.  
  32. #INT_TIMER0
  33. void TIMER0_isr()
  34. {
  35.    interrupt_counter++;
  36.    if(interrupt_counter==61)        // Ese 61 es para controlar el período de parpadeo.
  37.       output_toggle(LED);
  38. }
  39.  
  40.  
  41. #INT_RDA
  42. void RECEPCION_RS232(void)
  43. {
  44.         if(indice<5)    // Solo 5 valores nomas.
  45.         {
  46.                 trama_serial[indice]=getc();
  47.                 indice++;
  48.         }
  49.         else
  50.         {
  51.                 flag_rx = 1;                  // Se indica recepción completa.
  52.                 basura = getc();                // Descarto el caracter
  53.         }
  54. }
  55.  
  56.      
  57.      
  58.        
  59.        void main (void)
  60.        {
  61.        // Configuramos el Timer0... Esto investigalo vos
  62.        setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);
  63.        set_timer0(0);
  64.        enable_interrupts(INT_TIMER0);
  65.  
  66.        enable_interrupts(INT_RDA);
  67.        enable_interrupts(GLOBAL);
  68.        set_tris_a(0x00);
  69.        //set_tris_b(0x06);
  70.      
  71.        while (true)
  72.        {
  73.          
  74.          
  75.           if(flag_rx==1 )                // Si hay datos en el buffer...
  76.           {
  77.           Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
  78.           Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
  79.           Num_2X =(trama_serial[2]);
  80.           printf("%d%d%c%d%d\r"Num_1,Num_2,Num_2x,Num_3,Num_4);
  81.  
  82.           flag_rx = 0;    
  83.           }
  84.           alarma();     //Esto se ejecuta constantemete, no importa si se ha recivido trama nueva o no.
  85.        }
  86.        }
  87.        
  88.     void alarma(void)
  89.     {      
  90.              
  91.              
  92.              output_high(Display_1);
  93.              output_a(Numeros[Num_1]);
  94.              delay_ms(1);
  95.              output_low(Display_1);
  96.              output_high(Display_2);                            
  97.              output_a(Numeros[Num_2]);          
  98.              delay_ms(1);
  99.              output_low(Display_2);
  100.              output_high(Display_3);
  101.              output_a(Numeros[Num_3]);
  102.              delay_ms(1);
  103.              output_low(Display_3);
  104.              output_high(Display_4);
  105.              output_a(Numeros[Num_4]);
  106.              delay_ms(1);
  107.              output_low(Display_4);
  108.      
  109.     }

Título: Re:Problema al leer una trama por RS232
Publicado por: elgarbe en 07 de Febrero de 2016, 20:37:26
podrías adjuntar la simulacion en proteus y los fuentes de los 2 micros, por favor.

saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 07 de Febrero de 2016, 20:43:40
Tu problema son los delays.. En el transmisor es demasiado grande. Un delay no es que espera y se pone a hacer otra cosa. Un delay lo que hace es mantener ocupado al microcontrolador ejecutando instrucciones que no hacen nada, es decir no afectan variables. Entonces... si ves tenes algo asi en tu transmisor:

Citar
            while (1)
            {
                    for (Num1=0 ;Num1<=99;Num1++)
                    {
                            lcd_gotoxy(1,1);
                            printf(LCD_PUTC, " Decimal 1: %02d",Num1);
                            lcd_gotoxy(1,2);
                            printf(LCD_PUTC, " Decimal 2: %02d",Num1);
                            printf("%02d&%02d\r",Num1,Num1);
                            delay_ms(1500);
                            }
                    }
            }

Hay una espera de 1.5s es grande!. 1.5s en el que el microcontrolador no esta haciendo nada. Si te parece poco 1s nomas , un micro con un cristal de 4Mhz, podria ejecutar 1 millon de instrucciones en ese tiempo. Ni hablar si aumentamos la frecuencia y nos vamos a 20Mhz o 48Mhz.

Pero supongamos que queres hacerlo para el transmisor y no modificar mucho el programa, entonces podriamos hacer demoras de 0.5s y cuando se cumplan que pasaron 3 demoras ( 1.5s ) enviar la trama.


Código: C
  1. i = 0;
  2.  
  3.             while (1)
  4.             {
  5.                 if(i == 3)
  6.                 {
  7.                     i=0;
  8.                     for (Num1=0 ;Num1<=99;Num1++)
  9.                     {
  10.                             lcd_gotoxy(1,1);
  11.                             printf(LCD_PUTC, " Decimal 1: %02d",Num1);
  12.                             lcd_gotoxy(1,2);
  13.                             printf(LCD_PUTC, " Decimal 2: %02d",Num1);
  14.                             printf("%02d&%02d\r",Num1,Num1);
  15.                     }
  16.                 }
  17.                 output_toggle(PIN_Bx);
  18.                 delay_ms(500);
  19.             }

Es decir, cada 3 veces que se repita el delay(500) , entraria a enviar la trama. Una solucion "mala" por que uno deberia evitar de todos modos cualquier delay. Pero que te va a servir.
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 07 de Febrero de 2016, 21:44:08
gracias

funciono perfercto
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 08 de Febrero de 2016, 16:46:29
AMIGOS
Para el programa que esta hecho , de leer datos de otro pic  por tx- rx,   habra que cambiar mucho si quiero hacer lo siguiente

PIC16F628A - RS485 ----MAX232 - PC

que se tiene que modificar  :-/

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21. char trama_serial[10];                  // Arreglo para recibir los datos.
  22. int1 flag_rx = 0;                       // Variable bandera de recepción.
  23. volatile int indice=0;
  24. int8 basura;
  25.                   // Variable bandera de recepción.
  26.     int8  Num_1,Num_2,Num_3,Num_4,Num_2x;
  27.  
  28.  
  29. int interrupt_counter=0;
  30. #define LED   PIN_A0           // Aquí el pin donde esta el led
  31.  
  32. #INT_TIMER0
  33. void TIMER0_isr()
  34. {
  35.    interrupt_counter++;
  36.    if(interrupt_counter==61)        // Ese 61 es para controlar el período de parpadeo.
  37.       output_toggle(LED);
  38. }
  39.  
  40.  
  41. #INT_RDA
  42. void RECEPCION_RS232(void)
  43. {
  44.         if(indice<5)    // Solo 5 valores nomas.
  45.         {
  46.                 trama_serial[indice]=getc();
  47.                 indice++;
  48.         }
  49.         else
  50.         {
  51.                 flag_rx = 1;                  // Se indica recepción completa.
  52.                 basura = getc();                // Descarto el caracter
  53.         }
  54. }
  55.  
  56.      
  57.      
  58.        
  59.        void main (void)
  60.        {
  61.        // Configuramos el Timer0... Esto investigalo vos
  62.        setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);
  63.        set_timer0(0);
  64.        enable_interrupts(INT_TIMER0);
  65.  
  66.        enable_interrupts(INT_RDA);
  67.        enable_interrupts(GLOBAL);
  68.        set_tris_a(0x00);
  69.        //set_tris_b(0x06);
  70.      
  71.        while (true)
  72.        {
  73.          
  74.          
  75.           if(flag_rx==1 )                // Si hay datos en el buffer...
  76.           {
  77.           Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
  78.           Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
  79.           Num_2X =(trama_serial[2]);
  80.           printf("%d%d%c%d%d\r"Num_1,Num_2,Num_2x,Num_3,Num_4);
  81.  
  82.           flag_rx = 0;    
  83.           }
  84.           alarma();     //Esto se ejecuta constantemete, no importa si se ha recivido trama nueva o no.
  85.        }
  86.        }
  87.        
  88.     void alarma(void)
  89.     {      
  90.              
  91.              
  92.              output_high(Display_1);
  93.              output_a(Numeros[Num_1]);
  94.              delay_ms(1);
  95.              output_low(Display_1);
  96.              output_high(Display_2);                            
  97.              output_a(Numeros[Num_2]);          
  98.              delay_ms(1);
  99.              output_low(Display_2);
  100.              output_high(Display_3);
  101.              output_a(Numeros[Num_3]);
  102.              delay_ms(1);
  103.              output_low(Display_3);
  104.              output_high(Display_4);
  105.              output_a(Numeros[Num_4]);
  106.              delay_ms(1);
  107.              output_low(Display_4);
  108.      
  109.     }
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 08 de Febrero de 2016, 16:54:10
Primero que nada es RS485, y la posibilidad que tengas mas de un dispositivo conectado. Si solo vas a conectar solo el PIC --- PC, entonces como maximo lo que deberias agregar es el control de tri-stado ( activar/desactivar una o dos salidas antes de transmitir ) en el caso que lo posea el integrado.

Lo que me parece mal implementado es el MAX232 sobre la PC.
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 08 de Febrero de 2016, 16:57:08
me perdi, lo unico que entendi que son muchos driver para ese tipo de proceso


lo ideal seria

pc - 485 ---(200mts) 485 - pic16f628a
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 08 de Febrero de 2016, 17:00:07
si lo ideal fuero este proceso, como puedo pasar el programa que ya esta hecho ... como puedo modificar mi programa para que se comunique con 485

Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 08 de Febrero de 2016, 17:05:43
Exacto pero ese PC - 485 , estaria todo junto en una tarjeta dentro de la PC. Y luego deberias implementar un RS485 en tu PIC nomas, el integrado es una conversion UART-RS485, lo unico que cambia es la capa fisica, es decir la transmision de datos, que con un integrado ya estaria. Y no necesitas mas.

El problema es ... ¿para que vas a usar el RS485?, por que el 485 es un multi-punto ( y no punto a punto como el RS-232), en el sentido que hay un protocolo por detras si es que vas a agregar mas "salidas" y controlar varias cosas con el mismo cable.

Segun la distancia tambien te ves limitado en velocidad si no me equivoco.

Falta mas investigacion. Ya que no se puede contestar a ciencia cierta.. por que no hay nada especificado.
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 08 de Febrero de 2016, 17:20:38
 KILLERJC

tu me podrías ayudar a modificar el programa para que pueda recibir datos por el rs485
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 08 de Febrero de 2016, 18:46:23
KILLERJC

tu me podrías ayudar a modificar el programa para que pueda recibir datos por el rs485

Si la comunicacion es punto a punto entonces te sirve el programa, si vas a colgar algo mas del rs485 entonce debo decirte que vas a tener que cambiar el programa.
Como veo que es imposible que funcione el getc() entonces no sabria como ayudarte, por que yo uso XC8 y no CCS.
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 09 de Febrero de 2016, 16:01:35
gracias killer


amigos probando el programa en mi ciruito, recibiendo datos por rs 232, me di cuenta que si desconecto la tarjeta del computador...se queda pegado...el programa..

estoy intentando que al momento de desconectarse se quede mostrando  00:00 o por ultimo dejarlo en el ultimo dígito que capturo...  o tambien si nunca se a conectado al pc...que se muestre un 00:00 parpadeante...como queriendo decir listo para comuniarse..

alguien me podria orientar por favor
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 09 de Febrero de 2016, 16:35:07
Citar
amigos probando el programa en mi ciruito, recibiendo datos por rs 232, me di cuenta que si desconecto la tarjeta del computador...se queda pegado...el programa..

Los puertos series/paralelos / PS/2 entre otros no son hot-plug ( como USB ) y hacer lo que estas comentando podria terminar quemando la salida serie de la PC o el micro.
En resumen, si queres usar RS232 / RS485, no podes conectarlo y desconectarlo con la computadora encendida. Debes apagarla, conectarla y volverla a encender.

Algo que la gente olvido al estar tan acostumbrada al USB y que asume que todo es igual xD.

Respecto sobre "una perdida" de conexcion, podes hacer que tu PC envie en un intervalo regular de tiempo. Y en caso de no recibir nada por un tiempo el PIC asuma que hubo un problema o que no hay ninguna conexion. Un timer que cada tanto revise si hubo dato nuevo o no.

Pero... deberias hacerlo por interrupcion.. y ¿ adivina que ?, el gets() te lo bloquea. Nuevamente no uses gets()

Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 20 de Febrero de 2016, 04:19:27
hola amigos, gracias a todos por estar ayudandome..

quiero comentarles, que esto de leer la trama ha sido un lio cada vez se complica mas, provee el programa que han ayudado a corregir y funciona perfecto en el simulador pero en lo fisico no...

la idea principal  es leer los datos de un computador, mi pregunta es , se podrá hacer un programa solo para identificar que es realmente lo que esta enviando y con que frecuencia,  como no tengo el computador..trate simular con un Microcontrolador como si fuera el computador que estuviese mandando los datos..pero creo que no sera lo mismo..

mi idea es elaborar un programa en donde  lea los datos del pc, y los muestre por un lcd 16x2....asi puedo ver realmente que es lo que esta enviando

pero supuestamente los datos que se envian son datos decimales del 0 al 99...
no se si estan saliendo, hay varias alternativas creo:

datos importantes 9600 baudios
alternativa 1 : 1A&1B = hexadecimal & hexadecimal
alternativa 2 : 1A1B   = hexadecimal, hexadecimal
alternativa 3 : 2627   = binario,binario
alternativa 3 : 26&27 = binario & binario

sean como sean enviados los datos tengo que mostrarlos en 4 display de 7 segmentos = 2 4 2 7
mis amigos del foro, disculpen si los considero asi , pero con lo que me han ayudado ya son como amigos,,
tengo este programa que lee la trama serial y  es el programa que he estado completando con todas las correcciones , incluso pude incluir la instrucción getc, la que me recomendaron ya que era la mejor opción para estos casos.


 :-/ :-/ :-/
este programa lo cargue a la placa real, coloque un adptador usb-serial..y ademas instale el hercules programa que sirve para enviar datos por el puerto serial....pero no pude lograr nada.....por mas que enviaba datos en hex o binario los display no mostraban ningun numero..obviamente revise todo,conecion programa incluso el hercules pero todo estaba ok, incluso instale un programa mas basico en el pic ..como encender un led por el puerto serial con una  A y apagar con B,, y todo anda perfecto..........y cunado carge el programa mas importante no paso nada nuevamente... alguien me podria decir por que podria pasar esto.....por favor ?????

les dejo el programa
Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_b2, rcv = pin_b1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20. // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  21. int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  22. char trama_serial[10];                  // Arreglo para recibir los datos.
  23. int1 flag_rx = 0;                       // Variable bandera de recepción.
  24. volatile int indice=0;
  25. int8 basura;
  26. INT i;
  27.  
  28. void RECEPCION_RS232(void)
  29. {
  30.         if(i<4)    // Solo 4 valores nomas.
  31.         {
  32.                 trama_serial[indice]=getc();
  33.                 indice++;
  34.         }
  35.         else
  36.         {
  37.                 flag_rx = 1;                  // Se indica recepción completa.
  38.                 basura = getc();                // Descarto el caracter
  39.         }
  40. }
  41.  
  42. void main (void)
  43. {
  44.      
  45.         int tiempo = 10;
  46.         int8 j;
  47.         set_tris_a(0x00);
  48.         set_tris_b(0x02);
  49.         enable_interrupts(INT_RDA);
  50.         enable_interrupts(GLOBAL);
  51.    
  52.         while (true)
  53.         {
  54.  
  55.                 if(flag_rx == 1)                // Si hay datos en el buffer...
  56.                 {
  57.  
  58.                         // Pasamos de ASCII a decimal
  59.                        
  60.                         for( j=0 ; j<4 ; j++)
  61.                         {
  62.                                 trama_serial[j] -= 48;
  63.                         }
  64.  
  65.                         // Mostramos por UART
  66.                         printf("%d%d%d%d\r",trama_serial[0],trama_serial[1],trama_serial[2],trama_serial[3]);
  67.  
  68.                         // Mostramos ahora por el puerto A, cada numero
  69.  
  70.                         output_b(0x12);
  71.                         output_a(Numeros[trama_serial[0]]);
  72.                         delay_ms(tiempo);
  73.                         output_b(0x22);
  74.                         output_a(Numeros[trama_serial[1]]);
  75.                         delay_ms(tiempo);
  76.                         output_b(0x42);
  77.                         output_a(Numeros[trama_serial[2]]);
  78.                         delay_ms(tiempo);
  79.                         output_b(0x82);
  80.                         output_a(Numeros[trama_serial[3]]);
  81.                         delay_ms(tiempo);
  82.  
  83.                         // Limpio el indice para que comience de nuevo Y limpio el flag para indicar que termino y no entre mas aca hasta que se llene
  84.                         indice=0;
  85.                         flag_rx = 0;
  86.                 }
  87.         }
  88. }





Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 20 de Febrero de 2016, 09:46:57
Le falta el #INT_RDA antes de :

void RECEPCION_RS232(void)

indicando que es la rutina de interrupcion.

Este array, ( no lo dije por que pense al comienzo que era para un display 7 segmentos y que por ahora lo tenias de esa forma)

int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};

No tiene sentido ahora, Numero[indice] siempre va a dar indice, ademas corres peligro que indice se pueda pasar de valor., pero si tu idea luego era pasarlo por unos display 7 segmentos entonces podes dejarlo y luego cambiar los valores de ese array.


Citar
datos importantes 9600 baudios
alternativa 1 : 1A&1B = hexadecimal & hexadecimal
alternativa 2 : 1A1B   = hexadecimal, hexadecimal
alternativa 3 : 2627   = decimal,decimal
alternativa 3 : 26&27 = decimal & decimal

Al menos el codigo no se planteo de esa forma. Incluso propondria algo asi:

&2627

Que seria mas comodo. Ya que sabes cuando comienza siempre el string.
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 20 de Febrero de 2016, 19:54:10
ok, estoy modificando todo lo que me estas comentando, lo probare ahora y te comento como salen las pruebas
Título: Re:Problema al leer una trama por RS232
Publicado por: futurama en 21 de Febrero de 2016, 15:20:08
me perdí en lo del indice, tengo que sacarlo, cargue el programa ahora le agregue lo que le faltaba al programa #INT_RDA, pero aun sigue sin actuar en la placa, lo he probado con otros programas y anda bien...pero con este aun nada...les puedo enviar algo si quieren para queme puedan ayudar a encontrar la falla???
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 21 de Febrero de 2016, 15:50:59
Hagamos algo... vamos a lo mas basico posible y probemos eso, luego vamos a agregando.

Código: C
  1. #include <16f628A.h>
  2.  
  3. #fuses NOMCLR, INTRC_IO, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
  4. #use delay (clock=4000000)
  5. #use RS232 (baud = 9600, bits = 8, parity = N, xmit = PIN_B2, rcv = PIN_B1, ERRORS)
  6.  
  7. char dato_serial;
  8.  
  9. #INT_RDA
  10. void RECEPCION_RS232(void)
  11. {
  12.         putc(getc());           // Envio el caracter recibido
  13. }
  14.  
  15. void main (void)
  16. {
  17.  
  18.         enable_interrupts(INT_RDA);
  19.         enable_interrupts(GLOBAL);
  20.    
  21.         while (true)
  22.         {
  23.                 delay_ms(500);
  24.                 output_b(0x01);
  25.                 delay_ms(500);
  26.                 output_b(0x00);
  27.         }
  28. }

Deberias recibir en la PC todo lo que envias, basicamente es un loopback
Probalo si funciona le vamos agregando poco a poco lo demas.

(Intenta usar una sola cuenta)
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 21 de Febrero de 2016, 16:17:42
ok, solo usare esta cuenta...
provare lo que me dijiste ahora
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 21 de Febrero de 2016, 18:27:28
listo, el sistema debe quedar parpadeando automaticamente...o debe aparecer apagado..y solo prender cuando le envio un dato???
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 21 de Febrero de 2016, 18:30:04
el programa es solo encender y apagar el led no depende de nada su parpadeo, creí que dependía de lo que enviaba
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 21 de Febrero de 2016, 20:28:08
el programa es solo encender y apagar el led no depende de nada su parpadeo, creí que dependía de lo que enviaba

No, no depende de lo que envias, es solo para ver que esta funcionando. Si vos envias una "A" desde la PC al PIC el PIC responde con una "A" tambien.

Es decir todo lo que envies desde la PC lo vas a recibir. Es lo mas basico de lo basico para hacer con la UART.
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 21 de Febrero de 2016, 20:51:03
el programa que me enviaste solo esta parpadeando, pero prove con otro programa recibir una a para encender un led y una b para apagar el led
y anda bien...podriamos partir desde ese...no se que dices???

te envió el programa que me resulta, es bien básico

Código: C
  1. #include <16f628a.h>
  2.    // #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_b2, rcv = pin_b1)
  14.  
  15. char dato;
  16.  
  17. void main()
  18. {
  19.       printf ("\nEncender led \n");
  20.       delay_ms(1000);
  21.       printf ("teclea la letra =  a  para encender \n");
  22.       printf ("teclea la letra =  b  para apagar \n");
  23.       while(true)
  24. inicio:
  25.       {
  26.      
  27.        dato = getc();
  28.    
  29.        if(dato == 'a')
  30.          {  // Compara
  31.        
  32.           output_high(PIN_b4);
  33.           printf ("Led encendido \n");
  34.           }
  35.        if(dato == 'b')  // Compara
  36.           {  // Compara
  37.        
  38.           output_low(PIN_b4);
  39.           printf ("Led encendido \n");
  40.           }
  41.           goto inicio;
  42.        }
  43. }
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 21 de Febrero de 2016, 20:55:02
te adjunto la foto de como se ve en hercules
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 21 de Febrero de 2016, 21:04:36
y anda bien...podriamos partir desde ese...no se que dices???

No usa la interrupcion asi que no.

EL programa que te pase no te responde lo que le pones ? Cuando presionas una 'a' deberia aparecerte 2 'a' en el Hercules.
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 21 de Febrero de 2016, 21:59:59
disculpa me dices que si mando una "a" deberia aparecer "aa"
tengo este codigo con interrupcion, funciona bien....no se si al codigo que me enviaste le falta algo..(que no se mal interprete, cuando diga le falta algo al programa..yo se que tu eres el master aca...solo mi comentario ..es suposicion)

te cargo este programa,,este me sirvio...
Código: C
  1. #include <16F628A.h>
  2.  
  3. #FUSES INTRC_IO
  4. #FUSES NOWDT
  5. #FUSES PUT
  6. #FUSES NOMCLR
  7. #FUSES NOLVP
  8.  
  9. #use delay(internal=4MHz)
  10. #use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)
  11.  
  12.  
  13. char dato_serial;
  14.  
  15. #INT_RDA
  16. void RECEPCION_RS232(void)
  17. {
  18.         putc(getc());           // Envio el caracter recibido
  19.         output_toggle(pin_b4);
  20. }
  21. void main()
  22. {
  23.  enable_interrupts(INT_RDA);
  24.  enable_interrupts(GLOBAL);
  25.  
  26.    while(true){  
  27.       if(kbhit()){
  28.          dato_serial = getc();
  29.          putc(dato_serial);
  30.          
  31.       }
  32.    }
  33. }
Título: Re:Problema al leer una trama por RS232
Publicado por: pablomanieri en 21 de Febrero de 2016, 22:19:29
El programa que mandó Killerjc no funciona porque el compilador está sobre escribiendo la configuración del puerto B cada vez que hace:

Código: C
  1. delay_ms(500);
  2.                 output_b(0x01);
  3.                 delay_ms(500);
  4.                 output_b(0x00);

debería ser:

Código: C
  1. delay_ms(500);
  2.                 output_high(PIN_B0);
  3.                 delay_ms(500);
  4.                 output_low(PIN_B0);

o usar la directiva "fast_io(B)"
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 21 de Febrero de 2016, 22:26:06
no puede estar sobre escribiendo, ya que :

delay_ms(500);
output_b(0x01); es igual enciende led RB0
delay_ms(500);
output_b(0x00); es igual paga led RB0

lo que yo creo , es que falta declarar el "dato_serial " dentro del while..creo ..no estoy seguro
Título: Re:Problema al leer una trama por RS232
Publicado por: pablomanieri en 21 de Febrero de 2016, 23:20:59
Fijate en el archivo lst generado:
Código: ASM
  1. ....................                 delay_ms(500);
  2. 0070:  MOVLW  02
  3. 0071:  MOVWF  @@2A
  4. 0072:  MOVLW  FA
  5. 0073:  MOVWF  ??65535
  6. 0074:  CALL   @delay_ms1
  7. 0075:  DECFSZ @@2A,F
  8. 0076:  GOTO   072
  9. ....................                 output_b(0x01);
  10. 0077:  BSF    STATUS.RP0
  11. 0078:  CLRF   TRISB
  12. 0079:  MOVLW  01
  13. 007A:  BCF    STATUS.RP0
  14. 007B:  MOVWF  PORTB
  15. ....................                 delay_ms(500);
  16. 007C:  MOVLW  02
  17. 007D:  MOVWF  @@2A
  18. 007E:  MOVLW  FA
  19. 007F:  MOVWF  ??65535
  20. 0080:  CALL   @delay_ms1
  21. 0081:  DECFSZ @@2A,F
  22. 0082:  GOTO   07E
  23. ....................                 output_b(0x00);
  24. 0083:  BSF    STATUS.RP0
  25. 0084:  CLRF   TRISB
  26. 0085:  BCF    STATUS.RP0
  27. 0086:  CLRF   PORTB
  28. 0087:  GOTO   070

En las líneas 78 y 84 hace un CLRF TRISB, es decir que está poniendo todo el puerto B como salida, y no solo el PIN_B0
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 21 de Febrero de 2016, 23:26:52
provare lo que dices aver que sale
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 21 de Febrero de 2016, 23:37:59
tenias razón, funciono....... con esto lograba asegurarme de que la comunicación estaba correcta....
ahora estoy tratando de hacer lo mismo con este programa..... tratar le leer datos  que envió desde el pc y mostrarlos por el display

este es el programa que me esta ayudando KIller a coregir, ya que conecto la placa ..pero no pasa nada ..no enciende ningun display.. mi idea es
25&48...lo escribo ..pero no muestra nada...por lo menos deberian aparecer 0000..pero nada

Código: C
  1. #include <16f628a.h>
  2.    // #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_b2, rcv = pin_b1)
  14.  
  15. char dato;
  16.  
  17. void main()
  18. {
  19.       printf ("\nEncender led \n");
  20.       delay_ms(1000);
  21.       printf ("teclea la letra =  a  para encender \n");
  22.       printf ("teclea la letra =  b  para apagar \n");
  23.       while(true)
  24. inicio:
  25.       {
  26.      
  27.        dato = getc();
  28.    
  29.        if(dato == 'a')
  30.          {  // Compara
  31.        
  32.           output_high(PIN_b4);
  33.           printf ("Led encendido \n");
  34.           }
  35.        if(dato == 'b')  // Compara
  36.           {  // Compara
  37.        
  38.           output_low(PIN_b4);
  39.           printf ("Led encendido \n");
  40.           }
  41.           goto inicio;
  42.        }
  43. }
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 21 de Febrero de 2016, 23:50:10
El programa que mandó Killerjc no funciona porque el compilador está sobre escribiendo la configuración del puerto B cada vez que hace:

Eso me pasa por no programar en CCS y solo tocar XC8, es bueno saber que a pesar que uno define los pines como UART/SPI/etc si usas eso se vuelven a re-configurar todos.
Pense que el mismo compilador no lo modificaba a aquellos declarados en los modulos.

Una cosa mas aprendida sobre CCS, gracias pablo por el dato y por la ayuda.


PD: Sigo prefieriendo XC8 xD jeje
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 22 de Febrero de 2016, 00:09:14
cual sera el siguiente paso a seguir killer ,
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 22 de Febrero de 2016, 00:17:30
cual sera el siguiente paso a seguir killer ,

Lo mismo que hacemos todas las noches ciberik, tratar de conquistar al mundo.

(http://vignette2.wikia.nocookie.net/pinky-y-cerebro/images/5/58/Pinky_y_Cerebro.png/revision/latest?cb=20140707003113&path-prefix=es)

( Lo siento, no me pude aguantar, tenia que hacerlo )

Luego veo el programa y lo arreglo. Ya que ahora se por que no funcionaba el getc(). Ahora mismo no poseo demasiado tiempo como para ponerme a revisarlo y hacerlo.
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 22 de Febrero de 2016, 00:37:31
jajajjajajja, buena...
ok  avisame si puedes encontrar algun error  :-/
saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 23 de Febrero de 2016, 02:03:34
pude mejorar un poco el codigo, ahora logre que mostrar solo un numero de los 4 que trato enviar desde el pc.....
me falta configurar bien la interrupcion..pero aun no puedo dar con lo correcto..

envie el : 12&34 = y en la tarjeta solo pude ver el 4
te dejo el codigo:

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21.    
  22. int trama_serial[5];
  23. int x=0;
  24. #int_rda
  25.  
  26. void rda_isr(void)
  27. {
  28.    trama_serial[x]= getc();
  29. }
  30.  
  31.  void main(void){
  32.  //int8 unidad_dis1,decena_dis1,unidad_dis2,decena_dis2;
  33.  int8 unidad_1,decena_1,unidad_2,decena_2;
  34.  enable_interrupts(INT_RDA);
  35.  enable_interrupts(GLOBAL);
  36.  
  37.  while (true){
  38.  
  39.         ///////////////////////////////////////////////////
  40.         //unidad_dis1 = (valor % 10);         // Se extraen las unidades.
  41.         // decena_dis1  = (valor % 100)/10;  // Se extraen las decenas.
  42.         ////////////////////////////////////////////////////////////////////
  43.          unidad_1 = ((trama_serial[0])-48);   unidad_2 = ((trama_serial[3])-48);
  44.          decena_1 = ((trama_serial[1])-48);   decena_2 = ((trama_serial[4])-48);
  45.        
  46.          output_low(Display_4);// Retardo para mostrar las unidades.
  47.          output_high(Display_1);
  48.          output_a(Numeros[decena_1]);
  49.          delay_ms(1);
  50.          output_low(Display_1);// Retardo para mostrar las unidades.
  51.          output_high(Display_2);// Retardo para mostrar las unidades.
  52.          output_a(Numeros[unidad_1]);
  53.          delay_ms(1);
  54.          output_low(Display_2);
  55.          output_high(Display_3);// Retardo para mostrar las unidades.
  56.          output_a(Numeros[decena_2]);
  57.          delay_ms(1);
  58.          output_low(Display_3);// Retardo para mostrar las unidades.
  59.          output_high(Display_4);// Retardo para mostrar las unidades.
  60.          output_a(Numeros[unidad_2]);
  61.          delay_ms(1);
  62.          
  63.          
  64.    }
  65. }


saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 24 de Febrero de 2016, 22:55:08
Código: C
  1. #include <16f628A.H>
  2.  
  3. #fuses NOMCLR
  4. #fuses INTRC_IO
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. #FUSES NOPUT                    //No Power Up Timer
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10. #FUSES NOCPD                    //No EE protection
  11. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.  
  13. #use delay (clock=4000000)
  14. #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  15.  
  16. #define display_1     PIN_B4
  17. #define display_2     PIN_B5
  18. #define display_3     PIN_B6
  19. #define display_4     PIN_B7
  20.  
  21. unsigned char trama_serial[5], buffer[5];
  22. int x=0;
  23. char auxiliar;
  24.  
  25.  
  26. #int_rda
  27. void rda_isr(void)
  28. {
  29.         auxiliar = getc();
  30.         if ( auxiliar == '\r' || auxiliar == '\n' )
  31.         {
  32.                 x=0;                    // En caso de recibir un salto de linea o un retorno de carro vuelvo a 0
  33.         }
  34.         else
  35.         {
  36.                 if ( x < 5 )
  37.                 {
  38.                         buffer[x] = auxiliar;           // En caso que sea otro tipo de valor procede a guardarlo aca
  39.                         ++x;
  40.                         if ( x == 5 )
  41.                         {
  42.                                 unsigned int8 i;
  43.                                 for ( i = 0; i < 5 ; ++i )
  44.                                 {
  45.                                         trama_serial[i] = buffer[i];            // Guardo en trama serial el dato completo, de esa forma no cambia mientras va recibiendo, solo cuando recibio todo
  46.                                 }
  47.                         }
  48.                 }
  49.         }
  50. }
  51.  
  52. void main(void)
  53. {
  54.  
  55.         unsigned int8 i;
  56.         enable_interrupts(INT_RDA);
  57.         enable_interrupts(GLOBAL);
  58.  
  59.         while (true)
  60.         {
  61.  
  62.                 ///////////////////////////////////////////////////
  63.                 //unidad_dis1 = (valor % 10);         // Se extraen las unidades.
  64.                 // decena_dis1  = (valor % 100)/10;  // Se extraen las decenas.
  65.                 ////////////////////////////////////////////////////////////////////
  66.  
  67.  
  68.                 for( i = 0; i < 5; ++i)
  69.                 {
  70.                         trama_serial[i]-=48;
  71.                         if (trama_serial[i] > 9 )
  72.                         {
  73.                                 trama_serial[i] = 0;            // Proteccion por si envian cualquier caracter. Esto solo va a poner un 0 cuando no sea un numero
  74.                         }
  75.                 }
  76.                
  77.                  output_low(Display_4);                 // Apago el display anterior
  78.                  output_a(trama_serial[0]);             // Pongo el dato mientras estan todos apagados asi no se ve el cambio
  79.                  output_high(Display_1);                // Activo el display
  80.                  delay_ms(1);                           // Muestro
  81.                  output_low(Display_1);
  82.                  output_a(trama_serial[1]);
  83.                  output_high(Display_2);
  84.                  delay_ms(1);
  85.                  output_low(Display_2);
  86.                  output_a(trama_serial[3]);
  87.                  output_high(Display_3);
  88.                  delay_ms(1);
  89.                  output_low(Display_3);
  90.                  output_a(trama_serial[4]);
  91.                  output_high(Display_4);
  92.                  delay_ms(1);
  93.         }
  94. }

Algo asi ?

En la interrupcion ocurre lo siguiente:

Va guardando hasta que llegaron los 5 caracteres ( 34&32 ), en un array llamado buffer, cuando se completa lo pasa a trama_serial, asi podemos seguir recibiendo y guardando en buffer sin  que cambien los valores a medida que se va recibiendo, y solo cambien cuando se recibio por completa la trama.
En caso de llegar mas datos (mas de los 5) que no sea una nueva linea ( \n ) o retorno de carro ( \r ) en la interrupcion simplemente no hace nada (se descartan).
Si llega una nueva linea o retorno de carro procede a poner a x a 0, para comenzar a recibir de nuevo, de esa forma por mas que escriban 5000 caracteres no va a recibir mas que los 5 primeros.


En el main, procedo a restar 48 a todos los elementos ( incluso el '&' ), lo que hago es que si no esta entre el rango de 0 a 9, pongo un 0, asi si alguien envia esto:

a5&e2 , a la salida del for quedaria : 05002
25&38 , a la salida del for quedaria : 25038 , pero el 0 del & no lo usariamos. ( observa que no uso el indice 2 de trama_serial )

De esa forma me aseguro que si o si sean numeros ( de 0 a 9 ), luego muestro en el display esos numeros. Cambie el orden y lo explique en el comentario, primero apago todo, luego pongo el dato y recien alli enciendo el comun del display, es para que no este ese microsegundo encendido con el anterior valor.

Ahora si quisieras implementar varios tipos de forma de recepcion vemos cuales son y tratamos de crear algo que sirva para todos.
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 01:40:51
gracias por responder, pero carge el programa y tengo dos errores....lo estoy revisando pero lo cargue tal cual me lo enviaste, hace referencia a una llave

saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 25 de Febrero de 2016, 01:44:27
Me comi una llave del "else" en la interrupcion xD
y void alarma(void) esta demas.

Ahi corregi el codigo en el post anterior. Por si queres copiarlo de nuevo.

PD: Lo hago en el ""notepad"" de linux, por eso no me salen los errores :P
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 01:46:21
listo lo encontre, lo cargare enseguida
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 01:53:30
disculpa amigo, que te moleste tanto, cargue tu modificacion ..logre que aparecieran solo 4:0000...pense que se desconecto algo y cargue el ultimo...y volvi a leer los numeros..pero lo malo que ese programa lee una solavez..por que se bloquea...te dejo nuevamente el ultimo programa que funciona....me muestra por primera vez lo que le envio..pero ala segunda vez ..ya no hace nada....

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     #use     fast_io(b)        // Para usar el puerto b como I/O Estándar (Con TRISB)
  19.      
  20.  // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  21. int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  22.  
  23. int8 Unidad_1=0;
  24. int8 Decena_1=0;
  25. int8 Unidad_2=0;
  26. int8 Decena_2=0;
  27. int tiempo=1;
  28. /////////////////////////////////////////////////////////////////////////
  29. /// DECLARACIONES QUE NO ESTOY SEGURO/////////////////////
  30. char trama_serial[5];
  31. int1 flag_rx = 0;  
  32. volatile int indice=0;
  33. #INT_RDA
  34. void RECEPCION_RS232(void)
  35. {
  36.    trama_serial[indice]= getc();
  37.    indice++;
  38.    flag_rx = 1;  
  39. }
  40.  
  41.  void main(void)
  42.  
  43.  {
  44.  
  45.  set_tris_b(0b00001011);
  46.  enable_interrupts(INT_RDA);
  47.  enable_interrupts(GLOBAL);
  48.  
  49.  while (true){
  50.  
  51.         //// SEPARO LA TRAMA 12&34
  52.          Decena_1 = ((trama_serial[0])-48); Unidad_1 = ((trama_serial[1])-48);
  53.          Decena_2 = ((trama_serial[3])-48); Unidad_2 = ((trama_serial[4])-48);
  54.            
  55.        
  56.          // Muestro el display 1 - DIGITO [1] 2 & 3 4
  57.          output_b(0x10);
  58.          output_a(Numeros[Decena_1]);
  59.          delay_ms(tiempo);
  60.          
  61.          // Muestro el display 2 - DIGITO 1 [2] & 3 4
  62.          output_b(0x20);
  63.          output_a(Numeros[Unidad_1]);
  64.          delay_ms(tiempo);
  65.          
  66.          // Muestro el display 3 - DIGITO 1 2 & [3] 4
  67.          output_b(0x40);
  68.          output_a(Numeros[Decena_2]);
  69.          delay_ms(tiempo);
  70.          
  71.          // Muestro el display 4 - DIGITO 1 2 & 3 [4]
  72.          output_b(0x80);
  73.          output_a(Numeros[Unidad_2]);
  74.          delay_ms(tiempo);
  75.          
  76.    }
  77. }
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 01:56:08
que raro. no te imaginas todo lo que he hinchado por sacar este programa...jajajjaj me volvere loco
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 25 de Febrero de 2016, 02:14:57
Acabo de probar el programa que te pase, en realidad las partes de la interrupcion y main que hice. Pero en otro compilador distinto, por lo cual no va a funcionar en CCS, pero que funciona correctamente, acabo de ver que me comi una sola cosa que ahora voy a agregar.

Código: C
  1. #include <16f628A.H>
  2.  
  3. #fuses NOMCLR
  4. #fuses INTRC_IO
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. #FUSES NOPUT                    //No Power Up Timer
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10. #FUSES NOCPD                    //No EE protection
  11. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.  
  13. #use delay (clock=4000000)
  14. #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  15.  
  16. #define display_1     PIN_B4
  17. #define display_2     PIN_B5
  18. #define display_3     PIN_B6
  19. #define display_4     PIN_B7
  20.  
  21.  
  22. unsigned char trama_serial[5], buffer[5], i;
  23. int x=0;
  24. char auxiliar;
  25.  
  26.  
  27. #int_rda
  28. void rda_isr(void)
  29. {
  30.         auxiliar = getc();
  31.         if ( auxiliar == '\r' || auxiliar == '\n' )
  32.         {
  33.                 x=0;                    // En caso de recibir un salto de linea o un retorno de carro vuelvo a 0
  34.         }
  35.         else
  36.         {
  37.                 if ( x < 5 )
  38.                 {
  39.                         buffer[x] = auxiliar;           // En caso que sea otro tipo de valor procede a guardarlo aca
  40.                         ++x;
  41.                         if ( x == 5 )
  42.                         {
  43.                                 for ( i = 0; i < 5 ; ++i )
  44.                                 {
  45.                                         trama_serial[i] = buffer[i] - 48;            // Guardo en trama serial el dato completo, de esa forma no cambia mientras va recibiendo, solo cuando recibio todo
  46.                                         if (trama_serial[i] > 9 )
  47.                                         {
  48.                                                 trama_serial[i] = 0;            // Proteccion por si envian cualquier caracter. Esto solo va a poner un 0 cuando no sea un numero
  49.                                         }
  50.                                        
  51.                                 }
  52.                         }
  53.                 }
  54.         }
  55. }
  56.  
  57. void main(void)
  58. {
  59.  
  60.         unsigned int8 i;
  61.         enable_interrupts(INT_RDA);
  62.         enable_interrupts(GLOBAL);
  63.  
  64.         while (true)
  65.         {
  66.  
  67.                 ///////////////////////////////////////////////////
  68.                 //unidad_dis1 = (valor % 10);         // Se extraen las unidades.
  69.                 // decena_dis1  = (valor % 100)/10;  // Se extraen las decenas.
  70.                 ////////////////////////////////////////////////////////////////////
  71.  
  72.                
  73.                  output_low(Display_4);                 // Apago el display anterior
  74.                  output_a(trama_serial[0]);             // Pongo el dato mientras estan todos apagados asi no se ve el cambio
  75.                  output_high(Display_1);                // Activo el display
  76.                  delay_ms(1);                           // Muestro
  77.                  output_low(Display_1);
  78.                  output_a(trama_serial[1]);
  79.                  output_high(Display_2);
  80.                  delay_ms(1);
  81.                  output_low(Display_2);
  82.                  output_a(trama_serial[3]);
  83.                  output_high(Display_3);
  84.                  delay_ms(1);
  85.                  output_low(Display_3);
  86.                  output_a(trama_serial[4]);
  87.                  output_high(Display_4);
  88.                  delay_ms(1);
  89.         }
  90. }

Deberias:

Tener 00 00 al comienzo.
Si envias 45&87 , tendrias 45 87
Y para poder enviar de nuevo necesitas presionar un enter. asi se envia al menos un salto de linea '\n'. Ahora si los proximos 5 caracteres luego de ese "enter" seran de vuelta los mostrados.

Es decir:
Inicio: 00 00
Envias 54&12, mostraria 54 12
Envias un "enter" y luego 21&10 y se mostraria 21 10

Si ya esto no funciona , mejor me voy a tener que dedicar a jugar con arena. Se que puede haber un error , pero ya a esta hora  ( 2am ) es demasiado pedir xD.

EDITADO 2.21am
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 02:19:45
esto lo que puedo ver en mi tarjeta , con el ultimo de los últimos programas 
saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 25 de Febrero de 2016, 02:23:01
Edite al final un poquito el codigo, como te decia es enviar:

numero , numero, & , numero, numero, Tecla ENTER y repetir
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 02:31:08
gracias por la preocupación

amigo trato de responder enseguida  lo que me responden  y dejar la pregunta hecha...con la idea que la persona que me esta ayudando pueda ver los resultados....y no pasen semanas sin responder por la ayuda que me están brindando ..... .asi cuando tengan tiempo me puedan responder comprendo que es tarde...pero cuando tengas tiempo me respondes....muchas gracias por toda la ayuda facilitada hasta ahora

se agradece bastante

ha se me olvidaba que compilador usas para descargarlo??

saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 02:40:49
con lo que hiciste en el programa pasaron las siguientes cosas:

antes de la modificación:

- al encender la placa electrónica comenzaba con : 0 0 0 0
- y cuando enviaba el 12&34, no pasaba nada de nada

después de la modificación:

- al encender la placa electrónica no muestra nada, todos los display  están apagados
- y cuando enviaba el 12&34, en este caso muestra :1234,
- despues que mostro los 1234, borre los datos del hércules y decidí colocar 56&78 y pulse ENTER...y no paso nada ....en definitiva solo lee la primera vez

Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 25 de Febrero de 2016, 04:12:06
XC8, con MPLAB. Pero ahi vas a tener que leer el datasheet del micro para configurar los modulos.
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 19:53:34
ahi me pillaste, nunca he ocupado ese copilador.....referente a la modificacion que hiciste ultimo...que se podria hacer ..para que no se bloquee
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 25 de Febrero de 2016, 21:30:13
Citar
ahi me pillaste, nunca he ocupado ese copilador....

El compilador que digo es el que ofrece Microchip , el fabricante de los PIC, su IDE es el MPLAB X, que permite programar en assembler, y luego le instalas XC8 arriba para poder programar en C los PICs de 8 bits.

Citar
referente a la modificacion que hiciste ultimo...que se podria hacer ..para que no se bloquee

A que te referis con que no se bloquee?
A que siga recibiendo ?, va a seguir recibiendo pero no le va a importar nada hasta que encuentre un "enter" ( un salto de linea o un retorno de carro, el hexa de ese ASCII es 0x0A y 0x0D respectivamente. Line Feed ( '\n' ) y Carriage Return ('\r') en la imagen.

http://www.asciitable.com/index/asciifull.gif

Es decir la trama que deberias enviar desde tu pc seria asi:

"32&32\n"

el \n o \r le indica que va a comenzar una nueva trama, tambien hice que solo recibiera 5 caracteres para evitar que alguna persona pueda intentar enviar muchos caracteres y que el array se sobreescriba. Es decir intentar meter algo asi:

"32&3245&324hiaes478219dfjkl341"

En solo 5 lugares, lo cual es imposible!. Si alguien envia algo asi, solo tomaria los 5 primeros caracteres y nada mas, sino es imposible "determinar" cuando es que va comenzar el otro dato.
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 22:25:20
nuevamente gracias por responder..(estoy que me pego un balazo) :z) :z) :z) :z) :8} :8} :8} :8} jajajajajja

probe aagregando los dos tipos de (\n y \r) fin de carrera , para que sepa que comienza un nueva trama......pero igua lsi gue apareciendo solo la primera vez...despues por mas que cargue otra trama no me carga..se queda con la primera lectura.......  :cry:

esto es tan raro...tus programas son perfecto con todo el sistema de seguridad para leer datos ..pero todabia no arranca....y el programa que tengo ahora ...son mas o menos ....funciona pero lo malo que con un solo digito...demonios como quisiera que funcionara con los 4 .,....jajaja me ha dado pelea

no se que hice, pero es capas de leer a cada rato una lectura nueva del PC..pero lo malo como te he comentado anteriormente solo lee el ultimo dato del pc

pc = 12&34 --->  tarjeta ------> 0400
pc = 12&38 --->  tarjeta ------> 0800.
pc = 12&37 --->  tarjeta ------> 0700

te dejo el codigo ..por si puedes sacaralgo de esto....si me ayudas pasare hacer un pinky...ajjajjajajajja

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21.    
  22. int trama_serial[5];
  23. int x=0;
  24. #int_rda
  25.  
  26. void rda_isr(void)
  27. {
  28.    trama_serial[x]= getc();
  29. }
  30.  
  31.  void main(void){
  32.  //int8 unidad_dis1,decena_dis1,unidad_dis2,decena_dis2;
  33.  int8 unidad_1,decena_1,unidad_2,decena_2;
  34.  enable_interrupts(INT_RDA);
  35.  enable_interrupts(GLOBAL);
  36.  
  37.  while (true){
  38.  
  39.         ///////////////////////////////////////////////////
  40.         //unidad_dis1 = (valor % 10);         // Se extraen las unidades.
  41.         // decena_dis1  = (valor % 100)/10;  // Se extraen las decenas.
  42.         ////////////////////////////////////////////////////////////////////
  43.          unidad_1 = ((trama_serial[0])-48);   unidad_2 = ((trama_serial[3])-48);
  44.          decena_1 = ((trama_serial[1])-48);   decena_2 = ((trama_serial[4])-48);
  45.        
  46.          output_low(Display_4);// Retardo para mostrar las unidades.
  47.          output_high(Display_1);
  48.          output_a(Numeros[decena_1]);
  49.          delay_ms(1);
  50.          output_low(Display_1);// Retardo para mostrar las unidades.
  51.          output_high(Display_2);// Retardo para mostrar las unidades.
  52.          output_a(Numeros[unidad_1]);
  53.          delay_ms(1);
  54.          output_low(Display_2);
  55.          output_high(Display_3);// Retardo para mostrar las unidades.
  56.          output_a(Numeros[decena_2]);
  57.          delay_ms(1);
  58.          output_low(Display_3);// Retardo para mostrar las unidades.
  59.          output_high(Display_4);// Retardo para mostrar las unidades.
  60.          output_a(Numeros[unidad_2]);
  61.          delay_ms(1);
  62.          
  63.          
  64.    }
  65. }
Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 25 de Febrero de 2016, 22:43:17
Tu codigo solo te da un digito por que siempre estas cargando el mismo.

Código: [Seleccionar]
trama_serial[x]= getc();
x siempre es 0 , por lo tanto lo ultimo que llega se guarda en:

Código: [Seleccionar]
trama_serial[0]= getc();
quedando:
Código: [Seleccionar]
unidad_1 = ((trama_serial[0])-48);
Todo lo demas es 0, me refiero a trama_serial[1], trama_serial[2], trama_serial[3] son siempre 0  y le restas 48 cuando estan en 0!. Por eso mi if() preguntando si es mayor a 9 para ponerlo en 0.



Veo que te esta complicando demasiado la vida el tema de tener que enviar un retorno de carro, para mi que no lo estas enviando. Se me ocurren 3 cosas:

- Enviar en hexadecimal ( te dejo 3 para que hagas la prueba ):

"68&12\n" = 36 38 26 31 32 0A
"24&55\n" = 32 34 26 35 35 0A
"78&56\n" = 37 38 26 35 36 0A

Envia esos 3 valores en hexadecimal y fijate si funciona. Si funciona es por que no estas enviando el LF o CR

- Usar este codigo que no necesita del \n: ( Que al menos a mi no me gustaria, por que vas a tener errores, lo se.. intenta mandar una letra de mas y vas a ver )

Código: C
  1. #include <16f628A.H>
  2.  
  3. #fuses NOMCLR
  4. #fuses INTRC_IO
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. #FUSES NOPUT                    //No Power Up Timer
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10. #FUSES NOCPD                    //No EE protection
  11. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.  
  13. #use delay (clock=4000000)
  14. #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  15.  
  16. #define display_1     PIN_B4
  17. #define display_2     PIN_B5
  18. #define display_3     PIN_B6
  19. #define display_4     PIN_B7
  20.  
  21.  
  22. unsigned char trama_serial[5], buffer[5], i;
  23. int x=0;
  24. char auxiliar;
  25.  
  26.  
  27. #int_rda
  28. void rda_isr(void)
  29. {
  30.         auxiliar = getc();
  31.         if ( x < 5 )
  32.         {
  33.                 buffer[x] = auxiliar;           // En caso que sea otro tipo de valor procede a guardarlo aca
  34.                 ++x;
  35.                 if ( x == 5 )
  36.                 {
  37.                         for ( i = 0; i < 5 ; ++i )
  38.                         {
  39.                                 trama_serial[i] = buffer[i] - 48;            // Guardo en trama serial el dato completo, de esa forma no cambia mientras va recibiendo, solo cuando recibio todo
  40.                                 if (trama_serial[i] > 9 )
  41.                                 {
  42.                                         trama_serial[i] = 0;            // Proteccion por si envian cualquier caracter. Esto solo va a poner un 0 cuando no sea un numero
  43.                                 }
  44.                         }
  45.                 x=0;
  46.                 }
  47.         }
  48. }
  49.  
  50. void main(void)
  51. {
  52.  
  53.         enable_interrupts(INT_RDA);
  54.         enable_interrupts(GLOBAL);
  55.  
  56.         while (true)
  57.         {
  58.  
  59.                 ///////////////////////////////////////////////////
  60.                 //unidad_dis1 = (valor % 10);         // Se extraen las unidades.
  61.                 // decena_dis1  = (valor % 100)/10;  // Se extraen las decenas.
  62.                 ////////////////////////////////////////////////////////////////////
  63.  
  64.                
  65.                  output_low(Display_4);                 // Apago el display anterior
  66.                  output_a(trama_serial[0]);             // Pongo el dato mientras estan todos apagados asi no se ve el cambio
  67.                  output_high(Display_1);                // Activo el display
  68.                  delay_ms(1);                           // Muestro
  69.                  output_low(Display_1);
  70.                  output_a(trama_serial[1]);
  71.                  output_high(Display_2);
  72.                  delay_ms(1);
  73.                  output_low(Display_2);
  74.                  output_a(trama_serial[3]);
  75.                  output_high(Display_3);
  76.                  delay_ms(1);
  77.                  output_low(Display_3);
  78.                  output_a(trama_serial[4]);
  79.                  output_high(Display_4);
  80.                  delay_ms(1);
  81.         }
  82. }

Este ultimo codigo es igual, nomas que ahora toma los 5 que llegaron los procesa y los guarda. Y automaticamente agarra los 5 nuevos que viene.

- Cambiar el formato de la trama a otra parecida, supongamos asi:

"a12&37"

Esto va a permitir esperar la "a" para saber cuando comienza la trama de nuevo ( es lo mismo que el \n , nomas que esta ves estoy usando algo que podes poner en el teclado facilmente)
Lo bueno de esto, es que ademas podes definir varios "tipos" de tramas segun la letra inicial. Suponete:

"b1237" ---------- Lo mismo que a12&37 pero esta ves sin el &, con la b sabemos que 2 son del primero y 2 del segundo
"c123&456" ------ Lo mismo que antes, pero con la c, esperamos esta ves 3 digitos por cada uno y separados por un &
"d123456"  ------- Lo mismo que ocurriria con la b, pero esta ves para valroes de 3 digitos y sin &.
"e12"  ------------- Cambiar unicamente los 2 primeros digitos
"f32" -------------- Cambiar unicamente los 2 ultimos digitos.

ETC, es una idea esta nomas.
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 23:10:25
gracias amigo, probare todo lo que me has comentado ahora.......haber si me resulta ...te comento como me va

a mi me dieron la misión de leer la trama = 45&56, por eso pongo enfasis con ese caracter &, no es por que a mi se me  antoje...y como dices tu vendra con un fin de carrera que me indique que termina la trama...tienes toda la razon...si que seguire probando lo que me dices

saludos
Título: Re:Problema al leer una trama por RS232
Publicado por: ciberik en 25 de Febrero de 2016, 23:52:54
probe recien este ejemplo que me enviastey paso lo siguiente

ejemplo de la trama a:-
"Cambiar el formato de la trama a otra parecida, supongamos asi:

"a12&36"
cargo el dato, y después coloco enter siempre cargando el mismo dato

1° ENTER : 0103
2° ENTER : 8020
3° ENTER : 3812
4° ENTER : 0301
5° ENTER : 1238   <------ dato correcto, despues de 5 enter

nota : se supone que cada vez que cargue el dato siempre deberia haber sido 1238
_______________________________________________________________________________

y con la otra prueba también mejoro la lectura, pero también debo darle barios enter para que aparezca el valor correcto

32 34 26 35 35 0A = "68&12\n", aparece ese valores después de varios enter..pero responde bien a la lectura pero aparecen numeros que no tienen nada que ver....

Título: Re:Problema al leer una trama por RS232
Publicado por: KILLERJC en 26 de Febrero de 2016, 00:13:54
No entiendo.... Ya hay 2 codigos, el que te pase antes que deberias probar lo de enviar hexadecimal ( el que toma en cuenta el '\n' )

Probaste enviando el hexadecimal ( sin enter ), tilda abajo la casilla "hex" pone el valor

32 34 26 35 35 0A

Y presiona "Send", te deberia aparecer ( 24 55 ) luego pone otro valor

36 38 26 31 32 0A

y presiona "Send" de nuevo, y deberias ver 68 12.

Sino en modo "ASCII"  ( sin tildar el hex )

24&55$0A
68&12$0A

Citar
To sent data to the device press send button on the right of the respective field or use F1, F2, F3 respectively for the first, second and third field. Check the HEX box to send hex characters (used to send NVT commands). The ASCII characters are sent by typing #xxx (where x is a number in 0...9), $yy (where y is a hex number) or for example for line feed or for carriage return. To send the character #, $ or < type ##, $$ and << respectively.

------------------------------------------------------------------

Respecto a cambiar la trama tenes que cambiar el programa yo no lo hice, eso era una 3ra opcion.
El programa que pase al ultimo solo recibe datos y no tenes que enviar ningun enter, le quite exactamente lo del enter para que no tengas problemas, es decir deberias enviar:

12&3645&8934&98

Y si envias eso sin ningun enter ( todo junto ), primero mostraria 12 36, a medida que seguis escribiendo deberia aparecerte 45 89

Lo que no se es si el Hercules esta enviando algun otro valor ( tal como CR o LF ), en las imagenes que mostras no aparecen, pero me da a dudar que lo hace.

--------------------------------------

El primer programa que te pase, que toma en cuenta los enter, no deberia afectar el valor cuando presionas enter, para nada, ya que lo unico que hace es poner a 0 el indice, es decir por mas que presiones 100 veces enter y no envies teclas ni nada no cambiaria el valor para nada.

Lo que me molesta es no saber que esta enviando el Hercules, es decir si envia el \r o \n, pero aun asi lo tome en cuenta a ambos y no deberia afectar.