Autor Tema: comunicacion serial cadena de caracteres en 18f25k20  (Leído 4615 veces)

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

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
comunicacion serial cadena de caracteres en 18f25k20
« en: 08 de Junio de 2017, 14:20:24 »
buen dia foreros soy nuevito pero viejito leyendolos

proyecto; debo tener lectura en el pic18f25k20 de la trama nmea del gps A7, y estoy intentando primero lograr enviar una cadena de caracteres en proteus por el visual terminal para probar que si podre guardar toda la trama del GPS, ya despues estudiare como parsear la trama que tampoco tengo idea.
he descargo el siguiente codigo https://sites.google.com/site/ronnyf7/p9
Código: C
  1. #include <18f25k20.h>        
  2. #fuses XT, NOWDT, NOPROTECT
  3. #use delay(clock=4M)
  4.  
  5. #use rs232(baud=9600,xmit=pin_C6,rcv=pin_C7)                          /// libreria para el manejo del
  6.                                                                                                       /// puerto serie  se establece
  7.                                                                                                     /// velocidad de 9600 baudios
  8. #define LCD_DB4   PIN_B4
  9. #define LCD_DB5   PIN_B5
  10. #define LCD_DB6   PIN_B6
  11. #define LCD_DB7   PIN_B7
  12.  
  13. #define LCD_RS    PIN_B1
  14. #define LCD_RW    PIN_B2
  15. #define LCD_E     PIN_B3
  16. #include "flex_lcd_c2.c"                           /// libreria para el manejo de la lcd
  17.  
  18. char dato_recibido[20];                   /// aqui va a ir los datos recibidos por rs232
  19.  
  20. #int_rda                                     //// interrupcion por escritura en buffer del puerto
  21. void rda_isr()
  22.  {
  23.   gets(dato_recibido);                     //// esta instruccion almacena en la variable los
  24.  }                                           //// datos que se esten enviando hasta que llega
  25.                                                  //// la tecla enter
  26.  
  27.  
  28.  
  29. void main()
  30. {
  31.    puts("AT");
  32.    delay_ms(100);
  33.    puts("AT+GPSRD=1");
  34.    delay_ms(100);
  35.    puts("AT+GPS=1");                                // estos se lo anadi al codigo y es para
  36.    delay_ms(100);                                  //  inicializar el el GPS A7
  37.    
  38.    enable_interrupts(int_rda);                    //// se habilita la interrupcion por
  39.                                                   ////  escritura del puerto serial
  40.    enable_interrupts(global);
  41.  
  42.    lcd_init();
  43.    lcd_gotoxy(1,1);
  44.    lcd_putc("    com RS232   ");
  45.    
  46.    while(true)
  47.    {
  48.    lcd_gotoxy(1,2);
  49.    printf(lcd_putc,"%s",dato_recibido);         /// se manda a lcd lo que se  recibio
  50.    }
  51. }

necesito que me ayuden por favor con el que descargue para el 15f877a y quiero pasarla para el 18f25k20
lo simulo con el pic16 y corre perfecto y lo cambio al pic18 y no me recibe la cadena de caracteres que envio desde el visual terminal
« Última modificación: 12 de Junio de 2017, 12:21:45 por juandavidcy »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:comunicacion serial en 18f25k20
« Respuesta #1 en: 08 de Junio de 2017, 15:11:08 »
Desde ya te digo que ese codigo es malo.

Hacer esto:

Código: C
  1. #int_rda                                     //// interrupcion por escritura en buffer del puerto
  2. void rda_isr()
  3.  {
  4.   gets(dato_recibido);                     //// esta instruccion almacena en la variable los
  5.  }

Me dice que el que hizo eso no tiene ni idea.
Voy a decir porque. Lo demas queda para que vos lo estudies y lo hagas funcionar solo, sin copiar y pegar.
El problema es que deberia entrar a la interrupcion cada ves que recibe un caracter. el gets hace que se quede siempre destrozando el proposito de una interrupcion, que es atender algo y continuar lo que estaba haciendo.

Como vos quieras, pero si sos nuevo comenzaria por cosas simples y no de golpe meterme con 3 cosas a la ves: UART + LCD + C para el manejo de arrays
« Última modificación: 08 de Junio de 2017, 16:14:39 por KILLERJC »

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:comunicacion serial en 18f25k20
« Respuesta #2 en: 08 de Junio de 2017, 16:06:40 »
hay si estoy sano porque no tengo nada de conocimiento sobre esa interrupcion, y se que el problema que tengo es en la captura de la cadena, que debo hacer solo para guardarla en un buffer, como hago para arreglar lo que va dentro de esa interrupcion?, ya despues de que este guardada puedo seguir con mi investigacion, muchas gracias
« Última modificación: 08 de Junio de 2017, 16:10:20 por juandavidcy »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:comunicacion serial en 18f25k20
« Respuesta #3 en: 08 de Junio de 2017, 16:16:11 »
Citar
Como vos quieras, pero si sos nuevo comenzaria por cosas simples y no de golpe meterme con 3 cosas a la ves: UART + LCD + C para el manejo de arrays

Trata primero de recibir algo por la UART, lo que sea.

Luego usar el LCD.

Desconectado Varcorp

  • PIC10
  • *
  • Mensajes: 5
Re:comunicacion serial en 18f25k20
« Respuesta #4 en: 08 de Junio de 2017, 16:23:44 »
juandavidcy

Podrias subir el codigo de tu pic 16f877, ya solo es cuestion de pasarlo el 18, lo que cambia son los regitros del pic.

yo tuve el mismpo problema hace tiempo y fue cuention de mucha lectura lograr los primero pasos

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:comunicacion serial en 18f25k20
« Respuesta #5 en: 08 de Junio de 2017, 17:01:36 »
decide comentar en el foro porque ya llego 4 dias y nada que me sale el chistesito  ((:-)) :5]
este es el codigo original, es lo mismo solo cambia el pic y funciona

Código: C
  1. #include <16f877a.h>
  2. #fuses XT, NOWDT, NOPROTECT,
  3. #use delay(clock=4M)
  4.  
  5. #use rs232(baud=9600,xmit=pin_C6,rcv=pin_C7)                          /// libreria para el manejo del
  6.                                                                         /// puerto serie  se establece
  7.                                                                         /// velocidad de 9600 baudios
  8. #define LCD_DB4   PIN_B4
  9. #define LCD_DB5   PIN_B5
  10. #define LCD_DB6   PIN_B6
  11. #define LCD_DB7   PIN_B7
  12.  
  13. #define LCD_RS    PIN_B1
  14. #define LCD_RW    PIN_B2
  15. #define LCD_E     PIN_B3
  16. #include "flex_lcd_c2.c"                           /// libreria para el manejo de la lcd
  17.  
  18. char dato_recibido[20];                   /// aqui va a ir los datos recibidos por rs232
  19.  
  20. #int_rda                                     //// interrupcion por escritura en buffer del puerto
  21. void rda_isr()
  22.  {
  23.  gets(dato_recibido);                     //// esta instruccion almacena en la variable los
  24.  }                                          //// datos que se esten enviando hasta que llega
  25.                                                  //// la tecla enter
  26.  
  27. void main()
  28. {  
  29.    enable_interrupts(int_rda);                    //// se habilita la interrupcion por
  30.                                                               ////  escritura del puerto serial
  31.    enable_interrupts(global);
  32.  
  33.    lcd_init();
  34.    lcd_gotoxy(1,1);
  35.    lcd_putc("    com RS232   ");
  36.    
  37.    while(true)
  38.    {
  39.    lcd_gotoxy(1,2);
  40.    printf(lcd_putc,"%s",dato_recibido);         /// se manda a lcd lo que se  recibio
  41.    }
  42. }

foto de proteus abajo, emviando mensaje por serial al pic y mostrando en lcd
http://subefotos.com/ver/?01a5b8f5e49fe4ff1b5bc9155e2321e5o.png

Tambien puedo enviar en el 25k20 un solo caracter cambiando la interrupcion asi
Código: C
  1. #int_rda                                     //// interrupcion por escritura en buffer del puerto
  2. void rda_isr()
  3.  {
  4.  dato_recibido=getc();
  5.  //gets(dato_recibido);                     //// esta instruccion almacena en la variable los
  6.  }

foto
https://subefotos.com/ver/?fa2dc71664dfb732c8e84fa1f29d99dao.png#codigos
« Última modificación: 08 de Junio de 2017, 19:59:07 por juandavidcy »

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:comunicacion serial en 18f25k20
« Respuesta #6 en: 08 de Junio de 2017, 19:44:17 »
hola ya logre conseguir la lectura de una cadena de caracteres, por fin. con ayuda de RedPic por unos impresionantes tutoriales.
http://www.todopic.com.ar/foros/index.php?topic=23222.0
use practicamente el codigo de el solo que a mi antojo.

el codigo lo que hace es leer el serial guardarlo en un bufer y mostralo en la lcd

Código: C
  1. #include <18f25k20.h>
  2.    
  3.     #fuses hs
  4.     #use delay(clock=20M)
  5.    
  6. #define LCD_DB4   PIN_B4
  7. #define LCD_DB5   PIN_B5
  8. #define LCD_DB6   PIN_B6
  9. #define LCD_DB7   PIN_B7
  10.  
  11. #define LCD_RS    PIN_B1
  12. #define LCD_RW    PIN_B2
  13. #define LCD_E     PIN_B3
  14. #include "flex_lcd_c2.c"                           /// libreria para el manejo de la lcd
  15.      
  16.     #define TTL_TX PIN_C6
  17.     #define TTL_RX PIN_C7
  18.    
  19.     #use rs232(baud=9600, xmit=TTL_TX, rcv=TTL_RX)
  20.  
  21. int const lenbuff=32; // Longitud máxima del buffer
  22.  
  23. int  xbuff=0x00;     // Índice: siguiente char en cbuff
  24. char cbuff[lenbuff]; // Buffer de recepción
  25. int1 flagcommand=0;  // Flag para comando disponible
  26.  
  27. void init_cbuff(void){
  28.    int i;
  29.  
  30.    for(i=0;i<lenbuff;i++){// Bucle que pone a 0 todos los
  31.       cbuff[i]=0x00;      // caracteres en el buffer
  32.    }
  33.    xbuff=0x00;            // Inicializo el indice de siguiente caracter
  34. }
  35.  
  36. void add_2_cbuff(char c){
  37.  
  38.       switch(c){
  39.          case 0x0D:  // Enter -> Habilita Flag para procesar comando
  40.             flagcommand=1;
  41.             break;
  42.          default:    // Añade caracter recibido al Buffer
  43.             cbuff[xbuff++]=c;
  44.       }
  45. }
  46.  
  47. void commad_menu(void){
  48.  
  49.    puts("AT");
  50.    delay_ms(100);
  51.    puts("AT+GPSRD=1");
  52.    delay_ms(100);
  53.    puts("AT+GPS=1");                                
  54.    delay_ms(100);                                  //  inicializar el el GPS A7
  55. }
  56.  
  57. void commad_process(void){
  58.  
  59.    flagcommand=0;            // Desactivo flag de comando pendiente.
  60.    printf(lcd_putc,"%s\n"cbuff);              // ... y lo muestro
  61.    init_cbuff();             // Borro buffer.
  62. }
  63.  
  64. #int_rda
  65. void serial_isr() {          // Interrupción recepción serie USART
  66.  
  67.    char rcvchar=0x00;        // último caracter recibido
  68.    if(kbhit()){              // Si hay algo pendiente de recibir ...
  69.       rcvchar=getc();        // lo descargo y ...
  70.       add_2_cbuff(rcvchar);  // lo añado al buffer
  71.    }
  72. }
  73.  
  74. void main() {
  75.    lcd_init();
  76.    commad_menu();          // Nos presentamos
  77.    init_cbuff();               // Borra buffer al inicio
  78.    enable_interrupts(int_rda); // Habilita Interrupción RDA
  79.    enable_interrupts(global);  // Habilita interrupciones
  80.  
  81.    do {
  82.       if(flagcommand) commad_process(); // Hay algo pendiente de procesar y lo procesa.
  83.    } while (TRUE);
  84. }

ya lo que tengo que hacer es separar las tramas por comas y obtener la hora latitud y longitud del gps. pero eso ya lo hago mañana que estoy cansado.

* picpic.png
(108.53 kB, 800x372 - visto 1264 veces)


Muchas gracias KILLERJC y Varcorp por la ayuda
« Última modificación: 08 de Junio de 2017, 19:58:34 por juandavidcy »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:comunicacion serial en 18f25k20
« Respuesta #7 en: 08 de Junio de 2017, 23:07:55 »
Ahora si vale la pena ver esa interrupcion. Espero que puedas entender cual era el error del primer codigo que pasaste.

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:comunicacion serial en 18f25k20
« Respuesta #8 en: 09 de Junio de 2017, 13:55:16 »
Ahora si vale la pena ver esa interrupcion. Espero que puedas entender cual era el error del primer codigo que pasaste.
sipi xD,

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:comunicacion serial cadena de caracteres en 18f25k20
« Respuesta #9 en: 10 de Junio de 2017, 12:11:39 »
siguiendo con el mismo programa, quise montarlo fisicamente, no me envia nada de lo que quiero ni tampoco me recibe, solo caracteres, creo que el problema que tengo es con los baudios que no se estan configurandos correctamente, solo uso un cristal esterno de 20M y el fuse HS y defino 115200 baudios, y no me funciona.
aclaro que ya probe tratando de usar otros baudios y tampoco.
alguno sabria que puede estar sucediendo, estoy usando el ultimo codigo que coloque.
Muchas gracias por su ayuda y tiempo

ya probe el gps por separado directamente en el pc y si funciona a 115200 baudios pero no me fuciona con el pic
estoy usando este modulo

* A7-module-02.jpg
(119.34 kB, 750x667 - visto 1098 veces)
« Última modificación: 12 de Junio de 2017, 12:22:57 por juandavidcy »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:comunicacion serial cadena de caracteres en 18f25k20
« Respuesta #10 en: 13 de Junio de 2017, 02:46:31 »
Yo uso un cristal de 22118400

 Asi el error es 0%.

  Con 20 mhz redondos a mi no me ha funcionado nunca una comunicacion a mas de 9600 bps.


Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:comunicacion serial cadena de caracteres en 18f25k20
« Respuesta #11 en: 14 de Junio de 2017, 10:51:34 »
Yo uso un cristal de 22118400

 Asi el error es 0%.

  Con 20 mhz redondos a mi no me ha funcionado nunca una comunicacion a mas de 9600 bps.

Perdon, no entendi, entonces como debo configurarlo para conseguir 115200 baudios

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:comunicacion serial cadena de caracteres en 18f25k20
« Respuesta #12 en: 14 de Junio de 2017, 18:50:15 »
El cristal de cuarzo exterior de 20 Mhz lo cambias por uno de 22.1184  Mhz como el del enlace que te dejo abajo.

  Luego le pones el     #use delay(clock=22118400)

  En el #use rs232 le pones el baud = 115200

  Asi el % de error que tendras en el sincronismo rs232 será del 0% siempre y todas las comunicaciones funcionarán totalmente fiables.



 

 

 
   



http://m.ebay.es/itm/TXC-9B-22-1184MAAJ-B-XTAL-22-1184MHZ-18PF-HC-49S-/171948285360?hash=item2808ea9db0%3Ag%3AFHwAAMXQRPRTI4RS&_trkparms=pageci%253A4d435ea2-514a-11e7-ba27-74dbd180ee08%257Cparentrq%253Aa88e615615c0aa476fa9ee58ffff4bfd%257Ciid%253A2

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:comunicacion serial cadena de caracteres en 18f25k20
« Respuesta #13 en: 14 de Junio de 2017, 20:14:27 »
muchas gracias remi04 apenas puedo lo probare, pero me funciono usando el oscilador interno asi:

Código: C
  1. #fuses intrc_io,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
  2.  #use delay(clock=8M)
  3. #use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7)

pero ahora tengo otro problemita, solo me lee 20 caracteres de las 4 lineas que me envia el GPS


* terminta.png
(25.15 kB, 819x625 - visto 1045 veces)


sigo usando el codigo de la respuesta #6
muchas gracias a todos por su colaboracion

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7907
Re:comunicacion serial cadena de caracteres en 18f25k20
« Respuesta #14 en: 14 de Junio de 2017, 20:15:25 »
De que tensiones son el PIC y el GPS ?
Que interfase le colocaste en medio de ellos?
Creo que no tiene que ver con el cristal.
Yo uso uno de 10 mhz y activo el PLL por 4 y me da 115200 bps sin problemas.
Al menos si programas con CCS seria asi.

Una foto del corcuito montado seria genial, recuerda que en Proteus no hay cortos ni problemas de interfases entre micro y Gps de distintas tensiones, pero en la practica si lo hay.
 :mrgreen: :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything