Autor Tema: Problema al leer una trama por RS232  (Leído 16484 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 #75 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
« Última modificación: 21 de Febrero de 2016, 23:53:38 por KILLERJC »

Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Problema al leer una trama por RS232
« Respuesta #76 en: 22 de Febrero de 2016, 00:09:14 »
cual sera el siguiente paso a seguir killer ,

Desconectado KILLERJC

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



( 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.

Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Problema al leer una trama por RS232
« Respuesta #78 en: 22 de Febrero de 2016, 00:37:31 »
jajajjajajja, buena...
ok  avisame si puedes encontrar algun error  :-/
saludos

Desconectado ciberik

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #80 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.
« Última modificación: 25 de Febrero de 2016, 01:45:00 por KILLERJC »

Desconectado ciberik

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

Desconectado KILLERJC

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

Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Problema al leer una trama por RS232
« Respuesta #83 en: 25 de Febrero de 2016, 01:46:21 »
listo lo encontre, lo cargare enseguida

Desconectado ciberik

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

Desconectado ciberik

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #86 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
« Última modificación: 25 de Febrero de 2016, 02:28:13 por KILLERJC »

Desconectado ciberik

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

Desconectado KILLERJC

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

Desconectado ciberik

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


 

anything