Autor Tema: Error en el receptor usart en un 16f883 en xc8  (Leído 2574 veces)

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

Desconectado alejo1996

  • PIC10
  • *
  • Mensajes: 12
Error en el receptor usart en un 16f883 en xc8
« en: 24 de Agosto de 2018, 14:20:59 »
Hola estoy usando un archivo cabecera para la transmicion y recepcion, mi problema es que al iniciar la recepcion de datos me tira error de compilacion, osea cuando en el programa principal no llamo a la recepcion de datos no me da error de compilacion, a continuacion les dejo el programa del archivo cabecera y el log del error

Código: C
  1. //Archivo de cabecera para el uso del módulo USART///
  2. /////////////////////////////////////////////////////////////////////////////
  3.  
  4. #ifndef USART_H
  5. #define USART_H
  6.  
  7. void iniciar_usart();//función para iniciar el USART PIC asíncron, 8 bits, 9600 baudios
  8. unsigned char recibe_caracter_usart();//función para la recepción de caracteres
  9. void envia_caracter_usart(unsigned char);//función para la transmisión de caracteres
  10. void envia_cadena_usart(char*);//función para la transmisión de cadenas de caracteres
  11.  
  12. ///////////////////////////////////////////////
  13. //inicialización del módulo USART PIC modo asíncrono
  14. //en una función, a 8bits,a 9600 baudios
  15. /////////////////////////////////////////////////////
  16. void iniciar_usart(){
  17.      TRISCbits.TRISC7=1;//pin RX como una entrada digital
  18.      TRISCbits.TRISC6=0;//pin TX como una salida digital
  19.      TXSTA = 0b00100110;// 8bits, transmisión habilitada, asíncrono, alta velocidad
  20.      RCSTA = 0b10010000;//habilitado el USART PIC, recepción 8 bits,  habilitada, asíncrono
  21.      BAUDCTL = 0b00000000;
  22.      SPBRG = 25;//para una velocidad de 9600baudios con un oscilador de 4Mhz
  23.     }
  24.  
  25. ///////////////////////////////////////////////
  26. //recepción de datos del módulo USART PIC modo asíncrono
  27. ////////////////////////////////////////////////////////////
  28. unsigned char recibe_caracter_usart(){
  29.     if(PIR1bits.RCIF==1){//si el bit5 del registro PIR1 se ha puesto a 1
  30.     return RCREG;//devuelve el dato almacenado en el registro RCREG
  31.     }
  32.     else//sino
  33.         return 0;  //retorna sin hacer nada
  34. }
  35.  
  36. ///////////////////////////////////////////////
  37. //transmisión de datos del módulo USART PIC modo asíncrono
  38. ///////////////////////////////////////////////
  39. void envia_caracter_usart(unsigned char caracter){
  40.         while(TXSTAbits.TRMT==0);// mientras el registro TSR esté lleno espera
  41.         TXREG = caracter;//cuando el el registro TSR está vacio se envia el caracter
  42. }
  43.  
  44.  
  45. ///////////////////////////////////////////////
  46. //transmisión de cadenas de caracteres con el módulo USART PIC modo asíncrono
  47. ///////////////////////////////////////////////
  48. void envia_cadena_usart(char* cadena){//cadena de caracteres de tipo char
  49.     while(*cadena !=0x00){//mientras el último valor de la cadena sea diferente
  50.                           //de el caracter nulo
  51.         envia_caracter_usart(*cadena);//transmite los caracteres de cadena
  52.         cadena++;//incrementa la ubicación de los caracteres en cadena
  53.                  //para enviar el siguiente caracter de cadena
  54.     }
  55. }
  56.  
  57. #endif  /* USART_H */

y el log del error:
Código: HTML5
  1. ./usart.h:17:6: error: use of undeclared identifier 'TRISCbits'
  2.      TRISCbits.TRISC7=1;//pin RX como una entrada digital
  3.      ^
  4. ./usart.h:18:6: error: use of undeclared identifier 'TRISCbits'
  5.      TRISCbits.TRISC6=0;//pin TX como una salida digital
  6.      ^
  7. ./usart.h:19:6: error: use of undeclared identifier 'TXSTA'
  8.      TXSTA = 0b00100110;// 8bits, transmisi<F3>n habilitada, as<ED>ncrono, alta velocidad
  9.      ^
  10. ./usart.h:20:6: error: use of undeclared identifier 'RCSTA'
  11.      RCSTA = 0b10010000;//habilitado el USART PIC, recepci<F3>n 8 bits,  habilitada, as<ED>ncrono
  12.      ^
  13. ./usart.h:21:6: error: use of undeclared identifier 'BAUDCTL'
  14.      BAUDCTL = 0b00000000;
  15.      ^
  16. ./usart.h:22:6: error: use of undeclared identifier 'SPBRG'
  17.      SPBRG = 25;//para una velocidad de 9600baudios con un oscilador de 4Mhz
  18.      ^
  19. ./usart.h:29:8: error: use of undeclared identifier 'PIR1bits'
  20.     if(PIR1bits.RCIF==1){//si el bit5 del registro PIR1 se ha puesto a 1
  21.        ^
  22. ./usart.h:30:12: error: use of undeclared identifier 'RCREG'
  23.     return RCREG;//devuelve el dato almacenado en el registro RCREG
  24.            ^
  25. ./usart.h:40:15: error: use of undeclared identifier 'TXSTAbits'
  26.         while(TXSTAbits.TRMT==0);// mientras el registro TSR est<E9> lleno espera
  27.               ^
  28. ./usart.h:41:2: error: use of undeclared identifier 'TXREG'
  29.         TXREG = caracter;//cuando el el registro TSR est<E1> vacio se envia el caracter
  30.         ^
  31. 10 errors generated.
  32. (908) exit status = 1

Si necesitan les subo el programa principal pero no es mas que llamar al recibe_caracter_usart() en un bucle con un if.
Desde ya muchas gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error en el receptor usart en un 16f883 en xc8
« Respuesta #1 en: 24 de Agosto de 2018, 16:35:57 »
Si queres crear una libreria, pensa que el .h no deberia llevar ningun codigo dentro, solo declarar las cosas que te hacen falta en ambos lados ( en tu main, donde lo llamas, y tu libreria).

El error es por que no tiene el xc.h, pero correctamente deberia ser asi:

Supongamos que se llama envio la libreria, deberias tener los siguientes 2 archivos, envio.h y envio.c .

envio.h:
Código: C
  1. //Archivo de cabecera para el uso del módulo USART///
  2. /////////////////////////////////////////////////////////////////////////////
  3.  
  4. #ifndef USART_H
  5. #define USART_H
  6.  
  7. void iniciar_usart();//función para iniciar el USART PIC asíncron, 8 bits, 9600 baudios
  8. unsigned char recibe_caracter_usart();//función para la recepción de caracteres
  9. void envia_caracter_usart(unsigned char);//función para la transmisión de caracteres
  10. void envia_cadena_usart(char*);//función para la transmisión de cadenas de caracteres
  11.  
  12. #endif  /* USART_H */
El archivo .h lo incluis en el main.c y vas a poder usar esas funciones.

envio.c
Código: C
  1. #include <xc.h>
  2. #include "envio.h"
  3.  
  4. ///////////////////////////////////////////////
  5. //inicialización del módulo USART PIC modo asíncrono
  6. //en una función, a 8bits,a 9600 baudios
  7. /////////////////////////////////////////////////////
  8. void iniciar_usart(){
  9.      TRISCbits.TRISC7=1;//pin RX como una entrada digital
  10.      TRISCbits.TRISC6=0;//pin TX como una salida digital
  11.      TXSTA = 0b00100110;// 8bits, transmisión habilitada, asíncrono, alta velocidad
  12.      RCSTA = 0b10010000;//habilitado el USART PIC, recepción 8 bits,  habilitada, asíncrono
  13.      BAUDCTL = 0b00000000;
  14.      SPBRG = 25;//para una velocidad de 9600baudios con un oscilador de 4Mhz
  15.     }
  16.  
  17. ///////////////////////////////////////////////
  18. //recepción de datos del módulo USART PIC modo asíncrono
  19. ////////////////////////////////////////////////////////////
  20. unsigned char recibe_caracter_usart(){
  21.     if(PIR1bits.RCIF==1){//si el bit5 del registro PIR1 se ha puesto a 1
  22.     return RCREG;//devuelve el dato almacenado en el registro RCREG
  23.     }
  24.     else//sino
  25.         return 0;  //retorna sin hacer nada
  26. }
  27.  
  28. ///////////////////////////////////////////////
  29. //transmisión de datos del módulo USART PIC modo asíncrono
  30. ///////////////////////////////////////////////
  31. void envia_caracter_usart(unsigned char caracter){
  32.         while(TXSTAbits.TRMT==0);// mientras el registro TSR esté lleno espera
  33.         TXREG = caracter;//cuando el el registro TSR está vacio se envia el caracter
  34. }
  35.  
  36.  
  37. ///////////////////////////////////////////////
  38. //transmisión de cadenas de caracteres con el módulo USART PIC modo asíncrono
  39. ///////////////////////////////////////////////
  40. void envia_cadena_usart(char* cadena){//cadena de caracteres de tipo char
  41.     while(*cadena !=0x00){//mientras el último valor de la cadena sea diferente
  42.                           //de el caracter nulo
  43.         envia_caracter_usart(*cadena);//transmite los caracteres de cadena
  44.         cadena++;//incrementa la ubicación de los caracteres en cadena
  45.                  //para enviar el siguiente caracter de cadena
  46.     }
  47. }

Este .c lo copias y lo pegas en la carpeta del proyecto, deberia estar en el proyecto como "Sources".
Si observas el .h es un "nexo" entre los 2 archivos .c


En tu main.c quedaria asi:

Código: C
  1. #include <xc.h>
  2. #include "envio.h"
  3.  
  4. void main() {
  5.  
  6.   iniciar_usart();
  7.  
  8.   while(1) {
  9.     // ... lo que quieras
  10.   }
  11. }
« Última modificación: 24 de Agosto de 2018, 16:38:35 por KILLERJC »

Desconectado alejo1996

  • PIC10
  • *
  • Mensajes: 12
Re:Error en el receptor usart en un 16f883 en xc8
« Respuesta #2 en: 29 de Agosto de 2018, 19:22:50 »
Hola muchas gracias ya no tira el error de compilación, ahora el problema es que no recibe los datos, no se si hay algún error en la configuración del registro o no se donde.
Me canse de leer el datasheet y no encuentro donde esta el problema

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error en el receptor usart en un 16f883 en xc8
« Respuesta #3 en: 29 de Agosto de 2018, 23:33:55 »
Que PIC estas usando? Y que codigo estas probando para deterinar que no recibe?

Desconectado alejo1996

  • PIC10
  • *
  • Mensajes: 12
Re:Error en el receptor usart en un 16f883 en xc8
« Respuesta #4 en: 30 de Agosto de 2018, 16:13:09 »
estoy usando un 16f883 y el codigo muy elemental
Código: C
  1. void main(){
  2.    
  3.     ANSELH=0b00000000;
  4.     ANSEL=0b00000000;
  5.     ADCON1=0b00000000;
  6.     ADCON0=0b00000000;
  7.     TRISBbits.TRISB7=0;
  8.     unsigned char dato;
  9.     iniciar_usart();
  10.     PORTBbits.RB7=0;
  11.    
  12.     while(1){
  13.         dato=recibe_caracter_usart();
  14.         if(dato=='r'){
  15.             PORTBbits.RB7=1;
  16.             __delay_ms(1000);
  17.             PORTBbits.RB7=0;
  18.         }
  19.         __delay_ms(10);
  20.     }
  21. }
por eso no se donde esta el problema, porque yo le pongo el osciloscopio en el proteus al pic que envia el dato y me marca como corresponde el patron de 0 y 1 que le corresponden a esa letra

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error en el receptor usart en un 16f883 en xc8
« Respuesta #5 en: 02 de Septiembre de 2018, 10:11:54 »
Perdon por la demora, No veo nada malo en el codigo.

Lo unico que se me ocurre es que no solo se envie el caracter solo sino que tambien se envie algo mas. (Como un salto de linea).
Y ahi tendrias problemas, ya que ese delay de 1s haria que no pudieras recibir mas. Al llegar varios caracteres y sobreescribirse. O tal ves los 10ms tambien afecten, no me puse a calcularlo

Para ver si funciona bien la parte de la recepcion podes hacer un loop, que el PIC le responda con lo mismo que le envio la PC.

Código: C
  1. while(1){
  2.         dato=recibe_caracter_usart();
  3.         envia_caracter_usart(dato);
  4.     }

Sino la recomendacion para la recepcion es siempre usarlo con interrupciones.


 

anything