Autor Tema: Comunicacion RS232 + Terminal de Linux  (Leído 2801 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Comunicacion RS232 + Terminal de Linux
« en: 27 de Febrero de 2016, 14:05:16 »
Hola tengo este código el cual me funciona correctamente:
Código: C
  1. #define _XTAL_FREQ 20000000
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include "config_bits.c"
  6. #include "config_ports.c"
  7.  
  8. //-- CONSTANTES
  9. #define B9600_4MHZ   0x19  //-- Vel. 9600 baudios cuando cristal de 4MHz
  10. #define B9600_20MHZ  0x81  //-- vel. 9600 baudios cuando cristal de 20MHz
  11.  
  12. //---------------------------------------------
  13. //-- CONSTANTES MODIFICABLES POR EL USUARIO
  14. //---------------------------------------------
  15. //-- Establecer la velocidad para un cristal de 20MHZ
  16. #define B9600 B9600_20MHZ
  17.  
  18. //-- VARIABLES GLOBALES
  19. unsigned char   caracter;
  20.  
  21. //---------------------------------------------
  22. //-- DECLARACION DE FUNCIONES
  23. //---------------------------------------------
  24. void sci_init(void);
  25. unsigned char sci_read(void);
  26. void sci_write(unsigned char car);
  27. void config_ports(void);
  28.  
  29. /****************************************************/
  30. /* Configurar el puerto serie a N81 y 9600 Baudios  */
  31. /****************************************************/
  32. void sci_init(void)
  33. {
  34.   SPBRG = B9600; //-- 9600 baudios
  35.   TXSTA = 0x24;  //-- Configurar transmisor
  36.   RCSTA = 0x90;  //-- Configurar receptor
  37. }
  38.  
  39. /******************************************/
  40. /* Recibir un caracter por el SCI         */
  41. /*----------------------------------------*/
  42. /* DEVUELVE:                              */
  43. /*   -Caracter recibido                   */
  44. /******************************************/
  45. unsigned char sci_read(void)
  46. {
  47.   //-- Eserar hasta que llegue el dato
  48.   while (!RCIF);
  49.    
  50.   return RCREG;
  51. }
  52.  
  53. /*****************************************/
  54. /* Transmitir un caracter por el SCI     */
  55. /*---------------------------------------*/
  56. /* ENTRADAS:                             */
  57. /*   -car: Caracter a enviar             */
  58. /*****************************************/
  59. void sci_write(unsigned char car)
  60. {
  61.   //-- Esperar a que Flag de lista para transmitir se active
  62.   while (!TXIF);
  63.    
  64.   //-- Hacer la transmision
  65.   TXREG=car;
  66. }
  67.  
  68. /****************************************
  69. * Configurar puertos del Pic
  70. *****************************************/
  71. /*void config_ports(void)
  72. {
  73.     ADCON1 = 0x06;  //todos los pines como digitales
  74.     TRISB = 0x00;   //todo el puerto B como salidas
  75.     PORTB = 0x00;   //todos los leds del puerto B apagados
  76. }*/
  77.  
  78. //----------------------------------------
  79. //-- FUNCION PRINCIPAL
  80. //----------------------------------------
  81. void main(void)
  82. {
  83.     config_ports(); //Configuracion de puertos.
  84.     sci_init(); //Configuramos la comunicacion por puerto serie.
  85.    
  86.     for(;;)
  87.     {
  88.     //-- Esperar a que llegue dato del PC
  89.     caracter = sci_read();
  90.    
  91.        switch (caracter)
  92.        {  
  93.            /* Comprueba si se a pulsado la letra a de ser asi
  94.               encendera el led conectado en RB0 */
  95.            case 0x61:   //letra a
  96.                PORTB = 0x01;
  97.                break;
  98.            
  99.            /* Comprueba si se a pulsado la letra b de ser asi
  100.               encendera el led conectado en RB1 */    
  101.            case 0x62:   //letra b
  102.                PORTB = 0x02;
  103.                break;
  104.                
  105.            /* Comprueba si se a pulsado ENTER de ser asi
  106.               apaga los led's */
  107.            case 0x20:   //tecla ESPACIO
  108.                PORTB = 0x00;
  109.                break;
  110.        }
  111.     //-- ... envia de vuelta el caracter por el puerto serie
  112.     sci_write(caracter);
  113.     }
  114. }
pero al comentar la función
Código: C
  1. config_ports
y crear un
Código: C
  1. config_ports.c
al compilar me crea un error con relación a que no encuentra lo que hay dentro de la función.
Código: C
  1. config_ports.c:13: error: (192) undefined identifier "ADCON1"
  2. config_ports.c:14: error: (192) undefined identifier "TRISB"
  3. config_ports.c:15: error: (192) undefined identifier "PORTB"
  4. (908) exit status = 1
  5. make[2]: *** [build/default/production/config_ports.p1] Error 1
  6. make[2]: *** Se espera a que terminen otras tareas....
  7. make[1]: *** [.build-conf] Error 2
  8. make: *** [.build-impl] Error 2
  9. nbproject/Makefile-default.mk:126: recipe for target 'build/default/production/config_ports.p1' failed
  10. make[2]: Leaving directory '/home/miquel/MPLABXProjects/pic16F876A/Stargate_led_RS232.X'
  11. nbproject/Makefile-default.mk:78: recipe for target '.build-conf' failed
  12. make[1]: Leaving directory '/home/miquel/MPLABXProjects/pic16F876A/Stargate_led_RS232.X'
  13. nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
  14.  
  15. BUILD FAILED (exit value 2, total time: 116ms)
y no termino de entender el porque no puedo tener dichas funciones fuera del main y simplemente llamarlas.

Gracias.
« Última modificación: 03 de Marzo de 2016, 17:21:21 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicacion RS232 + Terminal de Linux
« Respuesta #1 en: 27 de Febrero de 2016, 14:23:09 »
inclui el xc.h en tu archivo .c, asi te carga el .h del PIC y alli tenes definido esto:

config_ports.c:13: error: (192) undefined identifier "ADCON1"
config_ports.c:14: error: (192) undefined identifier "TRISB"
config_ports.c:15: error: (192) undefined identifier "PORTB"

Tampoco veo el xc.h en tu main ..

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Comunicacion RS232 + Terminal de Linux
« Respuesta #2 en: 27 de Febrero de 2016, 14:54:45 »
Gracias KILLERJC creía que con un único xc.h el cual lo tengo en la configuración de fuses era suficiente. Voy a probar poniéndolo en cada .c

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicacion RS232 + Terminal de Linux
« Respuesta #3 en: 27 de Febrero de 2016, 15:26:16 »
Recien veo que estas incluyendo los .c, pense que eran .h.
No tenes que incluir los .c , en cualquier caso incluis los .h con las funciones del otro archivo.

Me explico, si tenes los fuses en un archivo supongamos : fuses.c
y en tu main.c tenes tu programa. El mismo compilador va a compilar uno por uno los .c , por lo tanto no hace falta tener el include fuses.c,

Distinto a config_portc.c el cual tiene funciones, entonces lo mejor es crear un .h que vas a inlcuir en config_port.c y tambien en main.c, que poseen los prototipos de funciones a usar.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Comunicacion RS232 + Terminal de Linux
« Respuesta #4 en: 27 de Febrero de 2016, 15:27:40 »
He incluido un xc.h en config_ports pero solo he cambiado de error:
Código: C
  1. config_ports.c:12: error: (237) function "_configuracion_puertos" redefined
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Comunicacion RS232 + Terminal de Linux
« Respuesta #5 en: 27 de Febrero de 2016, 15:29:26 »
Perdón estábamos escribiendo en el mismo momento, voy a probar lo que comentas.

Gracias
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Comunicacion RS232 + Terminal de Linux
« Respuesta #6 en: 27 de Febrero de 2016, 15:42:01 »
Gracias KILLERJC problema resuelto.

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Comunicacion RS232 + Terminal de Linux (SOLUCIONADO)
« Respuesta #7 en: 02 de Marzo de 2016, 18:20:10 »
Hola, aunque KILLERJC me solucionara el problema voy a preguntar una duda que tengo con este programa el cual he tomado prestado para estudiarlo, lo pregunto aquí ya que sigue estando relacionado con el RS232 y el terminal de Linux:
Código: C
  1. #include "config_bits.c"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. void sci_init(void)
  6. {
  7.     BRGH = 1;
  8.     SPBRG = 129;
  9.     SYNC = 0;
  10.     SPEN = 1;
  11.     CREN = 1;
  12.     TXEN = 1;
  13. }
  14.  
  15. unsigned char sci_read()
  16. {
  17.     while(RCIF == 0){
  18.         return RCREG;
  19.     }
  20. }
  21.  
  22. void sci_write(unsigned char dato)
  23. {
  24.     while(TXIF == 0){
  25.         TXREG = dato;
  26.     }
  27. }
  28.  
  29. void sci_cad(unsigned char *cad)
  30. {
  31.     unsigned char i=0;
  32.    
  33.     while(cad[i]!=0)
  34.     {
  35.         sci_write(cad[i]);
  36.         i++;
  37.     }
  38. }
  39.  
  40. void main(void)
  41. {
  42.     sci_init();
  43.     while(1)
  44.     {
  45.         sci_cad("Prueba de comunicacion....");
  46.         sci_read();
  47.     }
  48. }
dicho programa debería de mostrar el mensaje cada vez que le de a una tecla del ordenador pero no es asi y estoy casi seguro que el problema esta con el puntero de la función
Código: C
  1. void sci_cad(unsigned char *cad)
pero no se como solucionarlo, estoy usando un 16F876A a 20MHz y al compilar no me tira ningún error.

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicacion RS232 + Terminal de Linux (SOLUCIONADO)
« Respuesta #8 en: 02 de Marzo de 2016, 19:16:22 »
Tengo unas dudas, aunque nunca lo probe, y por eso te lo voy a decir aca, para que lo pruebes vos:

Código: C
  1. sci_cad("Prueba de comunicacion....");

Estas pasando el valor, primero defini una variable, global y constante:

Código: C
  1. const char TextoFijo[] = "Prueba de comunicacion....";

Y cambia el envio:

Código: C
  1. sci_cad(TextoFijo);

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

Lo bueno del '\0' del string de C que no necesitas un indice. Asi que esto:

Código: C
  1. void sci_cad(unsigned char *cad)
  2. {
  3.     unsigned char i=0;
  4.    
  5.     while(cad[i]!=0)
  6.     {
  7.         sci_write(cad[i]);
  8.         i++;
  9.     }
  10. }

Puede ser escrito asi:

Código: C
  1. void sci_cad(unsigned char *cad)
  2. {
  3.     while(*cad)            // Si es '\0' sale
  4.     {
  5.         sci_write(*cad);  // Envia a lo que apunta cad
  6.         cad++;               // Apunto al proximo caracter
  7.     }
  8. }

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Comunicacion RS232 + Terminal de Linux (SOLUCIONADO)
« Respuesta #9 en: 03 de Marzo de 2016, 03:46:32 »
Gracias KILLERJC ahora estoy en el trabajo cuando pueda lo pruebo.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Comunicacion RS232 + Terminal de Linux
« Respuesta #10 en: 03 de Marzo de 2016, 17:40:57 »
Lo primero quiero disculparme por estar siempre preguntando sin aportar nada, pero mi nivel de programación del 1 al 10 es un 3 pelado y cuando me surge un problema ni se que buscar ni donde buscar. Después de probar lo que comenta KILLERJC al compilar me salen dos warning:
Código: C
  1. stargate_str_RS232.c:30: warning: (343) implicit return at end of non-void function
  2. stargate_str_RS232.c:54: warning: (359) illegal conversion between pointer types
el del puntero me desaparece si añado el
Código: C
  1. #include <string.h>
y cambio el
Código: C
  1. void sci_cad(unsigned char *cad)
por
Código: C
  1. void sci_cad(const char *cad)
pero sigue sin funcionar y no se que probar el codigo que tengo ahora una vez modificado es este:
Código: C
  1. #include "config_bits.c"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. const char TextoFijo[] = "Prueba de comunicacion...";
  7.  
  8. void sci_init(void)
  9. {
  10.     BRGH = 1;
  11.     SPBRG = 129;
  12.     SYNC = 0;
  13.     SPEN = 1;
  14.     CREN = 1;
  15.     TXEN = 1;
  16. }
  17.  
  18. unsigned char sci_read()
  19. {
  20.     while(RCIF == 0){
  21.         return RCREG;
  22.     }
  23. }
  24.  
  25. void sci_write(unsigned char dato)
  26. {
  27.     while(TXIF == 0){
  28.         TXREG = dato;
  29.     }
  30. }
  31.  
  32. void sci_cad(const char *cad)
  33. {
  34.    
  35.     while(*cad)
  36.     {
  37.         sci_write(*cad);
  38.         cad++;
  39.     }
  40. }
  41.  
  42. void main(void)
  43. {
  44.     sci_init();
  45.     while(1)
  46.     {
  47.         sci_cad(TextoFijo);
  48.         sci_read();
  49.     }
  50. }

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comunicacion RS232 + Terminal de Linux
« Respuesta #11 en: 03 de Marzo de 2016, 19:26:12 »
Hice este codigo para probarlo:

Con un unico include: xc.h
Esto es todo lo que hay en el main.c :

Código: C
  1. #include <xc.h>
  2.  
  3. char x;
  4. char TextoFijo[] = "HolaComoEstas";
  5.  
  6.  
  7. void sci_write(char dato)
  8. {
  9.     x = dato;
  10. }
  11.  
  12. void sci_cad(char *cad)
  13. {
  14.     while(*cad)
  15.     {
  16.         sci_write(*cad);
  17.         cad++;
  18.     }
  19. }
  20.  
  21. void main(void)
  22. {
  23.  
  24.     while(1)
  25.     {
  26.         sci_cad(TextoFijo);
  27.     }
  28. }

Esta asi como lo ves ya que no hay nada del PIC involucrado, y pone correctamente en x letra por letra y sale correctamente.
Yo use el const por que era un texto fijo. Luego me di cuenta que ibas a tener problemas.

Si hubieras puesto el const en el array, solo necesitabas cambiar 2 cosas, por las dudas dejo el programa por igual:

Código: C
  1. #include <xc.h>
  2.  
  3. char x;
  4. const char TextoFijo[] = "HolaComoEstas";
  5.  
  6.  
  7. void sci_write(char dato)
  8. {
  9.     x = dato;
  10. }
  11.  
  12. void sci_cad(const char *cad)
  13. {
  14.     while(*cad)
  15.     {
  16.         sci_write(*cad);
  17.         cad++;
  18.     }
  19. }
  20.  
  21. void main(void)
  22. {
  23.  
  24.     while(1)
  25.     {
  26.         sci_cad(TextoFijo);
  27.     }
  28. }

Para las letras usa simplemente "char" no unsigned char o signed char.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Comunicacion RS232 + Terminal de Linux
« Respuesta #12 en: 05 de Marzo de 2016, 20:45:18 »
Hola ya he logrado resolver el ultimo problema después de cambiar esto:
Código: C
  1. char sci_read()
  2. {
  3.     while(RCIF == 0){
  4.         return RCREG;
  5.     }
  6. }
  7.  
  8. void sci_write(char dato)
  9. {
  10.     while(TXIF == 0){
  11.         TXREG = dato;
  12.     }
  13. }
por esto:
Código: C
  1. char sci_read()
  2. {
  3.     while(RCIF == 0){};
  4.         return RCREG;
  5. }
  6.  
  7. void sci_write(char dato)
  8. {
  9.     while(TXIF == 0){};
  10.         TXREG = dato;
  11. }
creia que era lo mismo  :5]
este es el codigo final:
Código: C
  1. #include "config_bits.c"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. char TextoFijo[] = "Prueba comunicacion RS232\n\r";
  6.  
  7. void sci_init(void)
  8. {
  9.     SPBRG = 0x81;
  10.     TXSTA = 0x24;
  11.     RCSTA = 0x90;      
  12. }
  13.  
  14. char sci_read()
  15. {
  16.     while(RCIF == 0){};
  17.         return RCREG;
  18. }
  19.  
  20. void sci_write(char dato)
  21. {
  22.     while(TXIF == 0){};
  23.         TXREG = dato;
  24. }
  25.  
  26. void sci_cad(char *cad)
  27. {
  28.    
  29.     while(*cad)
  30.     {
  31.         sci_write(*cad);
  32.         cad++;
  33.     }
  34. }
  35.  
  36. void main(void)
  37. {
  38.     sci_init();
  39.    
  40.     for(;;)
  41.     {
  42.         sci_cad(TextoFijo);
  43.         sci_read();
  44.     }
  45. }
A seguir probando  :mrgreen: :mrgreen:

Gracias por la ayuda.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.


 

anything