Autor Tema: Problema al leer una trama por RS232  (Leído 16441 veces)

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

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema al leer una trama por RS232
« Respuesta #45 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
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #46 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.

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #47 en: 07 de Febrero de 2016, 21:44:08 »
gracias

funciono perfercto

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #48 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.     }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #49 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.

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #50 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

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #51 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


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #52 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.

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #53 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #54 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.

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #55 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #56 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()


Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Problema al leer una trama por RS232
« Respuesta #57 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. }





« Última modificación: 20 de Febrero de 2016, 04:24:33 por ciberik »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #58 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.

Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Problema al leer una trama por RS232
« Respuesta #59 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