TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: javalenciab90 en 16 de Junio de 2019, 17:57:59

Título: Comunicacion Serial RS232
Publicado por: javalenciab90 en 16 de Junio de 2019, 17:57:59
Hola buenas un saludo a todos. Estoy aprendiendo como realizar la comunicacion serial RS232 con PIC C Compiler, Conexión mediante un modulo RS232 que me transforma a señales TTL y un cable serie-USB. Comprobe que dicho modulo estuviera transmitiendo y recibiendo datos de manera correcta utilizando la herramienta de Comunicacion serial que tiene el PIC C Compiler y otro software llamado Hercules y esta bien el módulo.
Ahora cuando intento hacer la comunicacion con el PIC (de manera física) no logro hacerlo, la idea es enviar desde el PC un caracter y que lo reciba y muestre mediante un LCD, ademas de responder desde el PIC al PC ese mismo caracter (Hacer como un eco).
En el LCD Sale bien el mensaje, pero el caracter, aparece un simbolo raro.

Código: [Seleccionar]
#include <16f877A.h>
#FUSES XT,NOWDT
#USE delay (clock = 4M)
#USE RS232(UART1,baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#BYTE TRISB = 0x86
#BYTE PORTB = 0x06

#define LCD_ENABLE_PIN  PIN_B0
#define LCD_RS_PIN      PIN_B1
#define LCD_RW_PIN      PIN_B2
#define LCD_DATA4       PIN_B4
#define LCD_DATA5       PIN_B5
#define LCD_DATA6       PIN_B6
#define LCD_DATA7       PIN_B7

#include <lcd.c>

char ch;

#int_rda       // Interrupción por dato recibido por rs232
void serial_isr(){
   ch = getc();
   putchar(ch);
}

void main(){
   // Habilito las interrupciones
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA);
   
   lcd_init();
   lcd_gotoxy(1,1);
   lcd_putc ("Prueba RS232");
   
   while(true){
      lcd_gotoxy(1,2);
      printf(lcd_putc, "ch = %c", ch);   
   }
}

Si alguien me puede indicar si estoy pasando algo por alto algo o estoy configurando algo de mala manera lo agradecería.
Saludos. :-)
Título: Re:Comunicacion Serial RS232
Publicado por: remi04 en 16 de Junio de 2019, 19:25:19
Con el cristal que estás usando ponle mejor HS y no XT en el fuse y prueba.

 
Título: Re:Comunicacion Serial RS232
Publicado por: javalenciab90 en 16 de Junio de 2019, 19:52:39
Con el cristal que estás usando ponle mejor HS y no XT en el fuse y prueba.

Hola, recien acabo de probar lo que me indicaste. Sigue igual, como muestro en la foto.

PD: El XT no se debe usar si el reloj es <=4M?
Título: Re:Comunicacion Serial RS232
Publicado por: remi04 en 17 de Junio de 2019, 18:30:42
Más bien menos a 4 Mhz es cuando hay que usar XT.  Para 4 Mhz puedes usar cualquiera, yo prefiero HS.

  Otra prueba que puedes hacer es eliminar las dos resistencias pullup que has puesto a los pines tx y rx del micro. La usart no los necesita y puede darte error.
Título: Re:Comunicacion Serial RS232
Publicado por: javalenciab90 en 17 de Junio de 2019, 20:46:26
Más bien menos a 4 Mhz es cuando hay que usar XT.  Para 4 Mhz puedes usar cualquiera, yo prefiero HS.

  Otra prueba que puedes hacer es eliminar las dos resistencias pullup que has puesto a los pines tx y rx del micro. La usart no los necesita y puede darte error.

Vale gracias por la aclaración, Bien respecto a lo otro ya intenté quitando dichas resistencias y aún no da. Me entro la curiosidad por saber si era el microcontrolador, pero lo cambie por uno recien comprado y sigue con el mismo resultado.
No se que puede estar mal...  :x
Título: Re:Comunicacion Serial RS232
Publicado por: remi04 en 18 de Junio de 2019, 02:53:54
Cuando recibas un byte inmediatamente lee el registro RCSTA

 Mira si uno de los bits 1 y 2 se ha puesto a 1.   Especialmente el bit 2 (Frame error)

Si es así, puede que el macro #use rs232 esté configurando SPBRG para modo BRGH = 0

 Es que así el error es casi un 7%. Muchísimo.

 Si puedes poner manualmente en tu main un valor al bit TXSTA.BRGH = 1 y al registro SPBRG = 129

 Prueba con esa configuración.  De ese modo el error sería un 0,16

Todo esto entiendo que debería hacerlo bien el compilador mediante el macro #use rs232 pero ante la duda.

Quita lo de UART1 de La macro , no es necesario ponerlo en un micro que solo tiene una uart.  Es por ir descartando.
Título: Re:Comunicacion Serial RS232
Publicado por: elreypic2 en 19 de Junio de 2019, 07:14:42
Que tal javalenciab90,

He probado tu código tal como lo tienes y funciona perfectamente en mi caso. He realizado la simulación en proteus sin ningún problema. Es probable que lo que tengas es un error en el hardware. Asegúrate que tus conexiones estén correctas. Que tu conversor USB a serial funcione correctamente.

Saludos,

elreypic.
Título: Re:Comunicacion Serial RS232
Publicado por: javalenciab90 en 20 de Junio de 2019, 17:53:10
Cuando recibas un byte inmediatamente lee el registro RCSTA

 Mira si uno de los bits 1 y 2 se ha puesto a 1.   Especialmente el bit 2 (Frame error)

Si es así, puede que el macro #use rs232 esté configurando SPBRG para modo BRGH = 0

 Es que así el error es casi un 7%. Muchísimo.

 Si puedes poner manualmente en tu main un valor al bit TXSTA.BRGH = 1 y al registro SPBRG = 129

 Prueba con esa configuración.  De ese modo el error sería un 0,16

Todo esto entiendo que debería hacerlo bien el compilador mediante el macro #use rs232 pero ante la duda.

Quita lo de UART1 de La macro , no es necesario ponerlo en un micro que solo tiene una uart.  Es por ir descartando.

Hola remi04,
Vale probaré de esta forma entonces. y Comentaré si pude solucionar
Título: Re:Comunicacion Serial RS232
Publicado por: javalenciab90 en 20 de Junio de 2019, 17:56:32
Que tal javalenciab90,

He probado tu código tal como lo tienes y funciona perfectamente en mi caso. He realizado la simulación en proteus sin ningún problema. Es probable que lo que tengas es un error en el hardware. Asegúrate que tus conexiones estén correctas. Que tu conversor USB a serial funcione correctamente.

Saludos,

elreypic.

Hola elreypic2,
Al igual que vos lo simule, y funciona perfectamente, el tema va en el montaje físico. Ya he probado el módulo en otros PC's, probé uno nuevo con mi PC y comprobé que no es el problema. Ahora el pic lo cambie por uno nuevo, cambie de protoboard para estar seguro que no fuera eso también y sigue sin andar. Voy a probar como me indicaron arriba y les comentaré.

Gracias por su colaboración.
Título: Re:Comunicacion Serial RS232
Publicado por: elreypic2 en 20 de Junio de 2019, 19:27:24
¿Qué software estás usando para enviar el dato serial desde la computadora? ¿Hyperterminal?
¿Cuál es la configuración que estás usando para ese software?

elreypic
Título: Re:Comunicacion Serial RS232
Publicado por: javalenciab90 en 23 de Junio de 2019, 15:18:33
remi04, ya probé lo que me indicaste y sigue igual, no muestra nada.

¿Qué software estás usando para enviar el dato serial desde la computadora? ¿Hyperterminal?
¿Cuál es la configuración que estás usando para ese software?

elreypic

Estoy usando el monitor serial de mismo PIC C compiler y otro llamado Hercules. Las configuraciones son iguales -> bits=8, baud=9600, parity=N.

Sigo sin obtener resultados.  :?
Título: Re:Comunicacion Serial RS232
Publicado por: remi04 en 23 de Junio de 2019, 18:42:10
Lo único que sé me ocurre ya entonces es que el interface rs232 que estás usando esté enviando el dato invertido.

Prueba al cambiarlo en la configuración del terminal que estás usando a ver si puedes activar dato invertido y prueba.
Título: Re:Comunicacion Serial RS232
Publicado por: javalenciab90 en 24 de Junio de 2019, 16:35:54
Hola, retomé todo desde cero a ver que tal, y sigo sin obtener el resultado que quiero.

Código: [Seleccionar]
#include <16f877A.h>
#FUSES XT,NOWDT
#USE delay (clock = 4M)
#USE RS232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#BYTE TRISB = 0x86
#BYTE PORTB = 0x06

#define LCD_ENABLE_PIN  PIN_B0
#define LCD_RS_PIN      PIN_B1
#define LCD_RW_PIN      PIN_B2
#define LCD_DATA4       PIN_B4
#define LCD_DATA5       PIN_B5
#define LCD_DATA6       PIN_B6
#define LCD_DATA7       PIN_B7

#include <lcd.c>

char valor;

#int_rda       // Interrupción por dato recibido por rs232
void serial_isr(){
   valor = getc();
   putc(valor);
}

void main(){
   TRISB = 0x00;
   // Habilito las interrupciones
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA);
   
   lcd_init();
   lcd_gotoxy(1,1);
   lcd_putc ("Prueba RS232");
   
   while(true){
      lcd_gotoxy(1,2);
      printf(lcd_putc, "ch = %c", valor);
      delay_ms(2000);
   }
}

- El código anterior me funciona perfecto en la simulación, pero no en la realidad. Aca dejo las imágenes.
En la simulación envio el caracter ´a´ y como se ve en el LCD se muestra el caracter que envié. Cuando lo hago de manera fisica en la protoboard sale un simbolo que no es el que envié.
Título: Re:Comunicacion Serial RS232
Publicado por: remi04 en 24 de Junio de 2019, 17:56:54
Yo es que los simuladores no los he usado jamás por que no. Prefiero siempre usar tarjetas de desarrollo, ni siquiera protoboard.

  Veo que en la interrupción tal y como recibes un carácter lo reenvías de vuelta a la terminal.  La pregunta es, ¿ la terminal recibe bien ese eco?? 

Título: Re:Comunicacion Serial RS232
Publicado por: planeta9999 en 24 de Junio de 2019, 21:49:07
Yo es que los simuladores no los he usado jamás por que no. Prefiero siempre usar tarjetas de desarrollo, ni siquiera protoboard.

Yo también detesto los simuladores, no los he utilizado en mi vida, donde se ponga la placa real con tu Debug, no hay nada mejor.

En mi caso, no uso protoboards, pero tampoco me gustan las tarjetas de desarrollo, salvo el Teensy que lo he usado en algunos casos.

Prefiero diseñar la placa y enviar a fabricar el PCB a los chinos, por unos pocos dólares tienes la placa en tu casa en una semana. Muchas veces, por comodidad, he pedido placas que solo iban a servir para pruebas, aunque luego vayan al cajón de los recuerdos o a la basura. No vale la pena liarse con una protoboard con mil cablecitos o con una tarjeta de desarrollo que también lleva su curro.

Título: Re:Comunicacion Serial RS232
Publicado por: remi04 en 25 de Junio de 2019, 03:38:45
Yo es que los simuladores no los he usado jamás por que no. Prefiero siempre usar tarjetas de desarrollo, ni siquiera protoboard.

Yo también detesto los simuladores, no los he utilizado en mi vida, donde se ponga la placa real con tu Debug, no hay nada mejor.

En mi caso, no uso protoboards, pero tampoco me gustan las tarjetas de desarrollo, salvo el Teensy que lo he usado en algunos casos.

Prefiero diseñar la placa y enviar a fabricar el PCB a los chinos, por unos pocos dólares tienes la placa en tu casa en una semana. Muchas veces, por comodidad, he pedido placas que solo iban a servir para pruebas, aunque luego vayan al cajón de los recuerdos o a la basura. No vale la pena liarse con una protoboard con mil cablecitos o con una tarjeta de desarrollo que también lleva su curro.

  Así es. De hecho mis tarjetas de desarrollo también me las he diseñado yo de acuerdo a mis necesidades y fabricadas por JLPCB.
Título: Re:Comunicacion Serial RS232
Publicado por: javalenciab90 en 26 de Junio de 2019, 21:00:10
Bueno gracias a todos por la colaboración, lamentablemente no pude hacer la comunicación serial.
Título: Re:Comunicacion Serial RS232
Publicado por: remi04 en 27 de Junio de 2019, 19:34:35
Bueno gracias a todos por la colaboración, lamentablemente no pude hacer la comunicación serial.

Mañana mismo voy a compilar tu código e instalarlo en un 16f877a que tengo y ya te digo... 

  Un saludo.
Título: Re:Comunicacion Serial RS232
Publicado por: javalenciab90 en 22 de Julio de 2019, 21:31:43
 :oops:
Buenas remi04,

Se me presento un inconveniente y me quede sin laptop, no pude seguir trabajando, pero ya estoy de vuelta. Lametablemente como te dije no pude realizar dicha comunicación.
Ahora último opte por probar el MPLABX XC8 para realizar mis proyectos ya que he recibido muchos comentario buenos de este.
Para sorpresa mia y frustración, he estado intentando la comunicación serial y no he pordido lograrlo, no se si cometo un error de configuración de bits (no creo porque no solo lo he chequeado con otros ejemplos si no con datasheet en mano), o si el problema pasa por la configuración y el tipo de reloj que utilizo.

Código: [Seleccionar]
// CONFIG
#pragma config FOSC = EXTRC     // Oscillator Selection bits (RC oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

Código: [Seleccionar]
#define _XTAL_FREQ 4000000
#include <xc.h>
#include "config.h"


void main(void) {
    char x = 65;
   
    TRISCbits.TRISC6 = 0;
    PORTC = 0;
   
    //Configuracion Serie
    TXSTAbits.TX9 = 0;  // Modo 8-bits
    TXSTAbits.TXEN = 1; // habilito transmision
    TXSTAbits.SYNC = 0; // Tx asincrona
    TXSTAbits.BRGH = 0; // Tx Lenta
    RCSTAbits.SPEN = 1; // Habilito puerto serie
   
    // Baud rate
    SPBRG = (unsigned char) (((_XTAL_FREQ / 9600) / 64) - 1); //baudios  = 9600
   
    while(1){
        for(x=65; x<=90; x++){
            TXREG = x;
            while(TXSTAbits.TRMT == 0); // Mientras este lleno buffer
            __delay_ms(500);
        }
    }     
    return;
}

Bien este es el código que tengo ahora, me parece mejor manejar los bits de los registros directamente y no por librerías, asi sé que estoy configurando.

Saludos si me puedes colaborar por este lado

Gracias
Título: Re:Comunicacion Serial RS232
Publicado por: KILLERJC en 23 de Julio de 2019, 17:27:34
Un par de cosas a corregir:

Código: C
  1. #pragma config FOSC = EXTRC     // Oscillator Selection bits (RC oscillator)

Pero.... estas usando un cristal.. XTAL por los ( 4Mhz ) y por las fotos que veo.

Otras cosa:

Citar
Bit SPEN (RCSTA<7>) and bits TRISC<7:6> have to be set in order to configure pins RC6/TX/CK and RC7/RX/DT as the Universal Synchronous Asynchronous Receiver Transmitter.

En le datasheet tenes una tablas, y si observas para 4Mhz, es mejor usar el BGRH = 1, ya que posee menos error ( 0.16% frente a los 7% de error que tenias con BGRH = 0)

Código: C
  1. #define _XTAL_FREQ 4000000
  2. #include <xc.h>
  3. #include "config.h"
  4.  
  5.  
  6. void main(void) {
  7.    
  8.     TRISCbits.TRISC6 = 1;  // Esto no tiene sentido, ya que de por si esta en 1
  9.     TRISCbits.TRISC7 = 1;
  10.    
  11.  
  12.     //Configuracion Serie
  13.     // Baud rate
  14.     SPBRG = (unsigned char) (((_XTAL_FREQ / 9600) / 16) - 1); //baudios  = 9600, Deberia cargarse con el numero 25
  15.     TXSTAbits.BRGH = 1; // Baud Rate /16
  16.  
  17.     TXSTAbits.TX9 = 0;  // Modo 8-bits
  18.     TXSTAbits.SYNC = 0; // Tx asincrona
  19.  
  20.     TXSTAbits.TXEN = 1; // habilito transmision
  21.     RCSTAbits.SPEN = 1; // Habilito puerto serie
  22.    
  23.    
  24.     while(1){
  25.         char x;
  26.         for(x='A'; x<='Z'; x++){
  27.             TXREG = x;
  28.             while(!TXSTAbits.TRMT); // Mientras este lleno buffer
  29.             __delay_ms(500);
  30.         }
  31.     }      
  32. }
Título: Re:Comunicacion Serial RS232
Publicado por: javalenciab90 en 25 de Julio de 2019, 00:00:40
Un par de cosas a corregir:

Código: C
  1. #pragma config FOSC = EXTRC     // Oscillator Selection bits (RC oscillator)

Pero.... estas usando un cristal.. XTAL por los ( 4Mhz ) y por las fotos que veo.

Otras cosa:

Citar
Bit SPEN (RCSTA<7>) and bits TRISC<7:6> have to be set in order to configure pins RC6/TX/CK and RC7/RX/DT as the Universal Synchronous Asynchronous Receiver Transmitter.

En le datasheet tenes una tablas, y si observas para 4Mhz, es mejor usar el BGRH = 1, ya que posee menos error ( 0.16% frente a los 7% de error que tenias con BGRH = 0)

Código: C
  1. #define _XTAL_FREQ 4000000
  2. #include <xc.h>
  3. #include "config.h"
  4.  
  5.  
  6. void main(void) {
  7.    
  8.     TRISCbits.TRISC6 = 1;  // Esto no tiene sentido, ya que de por si esta en 1
  9.     TRISCbits.TRISC7 = 1;
  10.    
  11.  
  12.     //Configuracion Serie
  13.     // Baud rate
  14.     SPBRG = (unsigned char) (((_XTAL_FREQ / 9600) / 16) - 1); //baudios  = 9600, Deberia cargarse con el numero 25
  15.     TXSTAbits.BRGH = 1; // Baud Rate /16
  16.  
  17.     TXSTAbits.TX9 = 0;  // Modo 8-bits
  18.     TXSTAbits.SYNC = 0; // Tx asincrona
  19.  
  20.     TXSTAbits.TXEN = 1; // habilito transmision
  21.     RCSTAbits.SPEN = 1; // Habilito puerto serie
  22.    
  23.    
  24.     while(1){
  25.         char x;
  26.         for(x='A'; x<='Z'; x++){
  27.             TXREG = x;
  28.             while(!TXSTAbits.TRMT); // Mientras este lleno buffer
  29.             __delay_ms(500);
  30.         }
  31.     }      
  32. }

Gracias KILLERJC. No solo lo comprobé con el 16f877A sino también con el 16f887 (aprovechando el oscilador interno) y la simulación me funciona muy bien.
Pero en la parte física no me da aún. Salen así ej: AAAAAAAAAAAABCDþþÑGHIJKÿPQRSXYZEFGLMNSTUZ 
Esto puede ser por la velocidad de transmisión?... lo hice a 8MHz, oscilador interno con el pic 16f887. Ya estoy que lo logro, faltta creería algún mínimo detalle, pero no logro dar con el.

Código: [Seleccionar]

#define _XTAL_FREQ 8000000
#include <xc.h>
#include "config.h"

void main(void) {
   
    OSCCON = 0x71;
    // Baud rate
    BAUDCTLbits.BRG16 = 0;
    TXSTAbits.BRGH = 1; // Tx Rapida
    SPBRG = 51; //baudios  = 9600

    //Configuracion Serie
    TXSTAbits.TX9 = 0;  // Modo 8-bits
    TXSTAbits.SYNC = 0; // Tx asincrona
 
    TXSTAbits.TXEN = 1; // habilito transmision
    RCSTAbits.SPEN = 1; // Habilito puerto serie
           
    while(1){
        char x;
        for(x='A'; x<='Z'; x++){
            TXREG = x;
            while(TXSTAbits.TRMT == 0); // Mientras este lleno buffer
            __delay_ms(1000);
        }
    }     
    return;
}

Título: Re:Comunicacion Serial RS232
Publicado por: KILLERJC en 25 de Julio de 2019, 16:34:23
Código: [Seleccionar]
Pero en la parte física no me da aún. Salen así ej: AAAAAAAAAAAABCDþþÑGHIJKÿPQRSXYZEFGLMNSTUZ 
Eso es lo que sale? o un ejemplo?....

Fijate si esta bien configurado todo, el PIC parece estar bien.... proba otra velocidad. Proba con 19.2k (cargale 25 al SPGR) pero de todas formas deberia funcionar correctamente
Título: Re:Comunicacion Serial RS232
Publicado por: javalenciab90 en 25 de Julio de 2019, 19:44:22
Sale eso tal cual, en uno de los intentos que realicé. Voy a probar otras velocidades a ver que tal, quiero descartar el modulo rs232 igualmente probando otro que compré. estaré avisando.

 ((:-))Gracias
Título: Re:Comunicacion Serial RS232
Publicado por: remi04 en 16 de Agosto de 2019, 13:45:42
Sale eso tal cual, en uno de los intentos que realicé. Voy a probar otras velocidades a ver que tal, quiero descartar el modulo rs232 igualmente probando otro que compré. estaré avisando.

 ((:-))Gracias

Hola ¿Probaste el módulo rs232?. 

  A mi me pasó algo parecido una vez y fue por unos cable FTDI que resultaron ser falsos y me daba fallo en el envío de cadenas. 

  Enviaba bien carácter a carácter , pero en las cadenas me hacía eso. Después de volverme majareta del todo descubrí que eran falsos los ftdi que había comprado por eBay en china.

 Saludos.