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

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #15 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.
« Última modificación: 07 de Febrero de 2016, 04:46:29 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema al leer una trama por RS232
« Respuesta #16 en: 07 de Febrero de 2016, 09:59:03 »
Trama_serial[5]

Sds
-
Leonardo Garberoglio

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #17 en: 07 de Febrero de 2016, 11:13:04 »
claro, enviare la foto de lo que me pediste

Desconectado futurama

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

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #19 en: 07 de Febrero de 2016, 11:53:36 »
ok

Desconectado futurama

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

Desconectado futurama

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

 :-/ :-/
adjunto programa, para que me puedan orientar por favor
saludos

Desconectado elgarbe

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

Desconectado KILLERJC

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

Desconectado futurama

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

Desconectado elgarbe

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

Desconectado KILLERJC

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

Desconectado futurama

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


Desconectado KILLERJC

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

Desconectado futurama

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

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