Autor Tema: Comunicación de 2 uC por USART  (Leído 2223 veces)

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

Desconectado rfjhh

  • PIC10
  • *
  • Mensajes: 14
Comunicación de 2 uC por USART
« en: 05 de Mayo de 2020, 21:46:57 »
Hola todos
Estoy haciendo una comunicación entre dos PICs con MPLABX y XC8. Hice bibliotecas para LCD y EUSART. y estoy simulando con Proteus 8.
El maestro le manda una letra al esclavo y éste le responde con una frase "Hola todos". Cuando el maestro la recibe la debe mostrar en un LCD pero solo muestra Ho. La biblioteca LCD funciona bien, el problema está en la del EUSART.

EUSART.h
// Manejo del módulo EUSART en modo asíncrono, alta velocidad a 8 bits
// Registro TXSTA: CSRC  TX9  TXEN  SYNC  SENDB  BRGH  TRMT  TX9D
// Registro RCSTA: SPEN  RX9  SREN  CREN  ADDEN  FERR  OERR  RX9D


void ini_eusart();
unsigned char lee_usart();
unsigned char lee_cad_usart(char* buf, char longitud);
void escr_char_usart(unsigned char dato);
void escr_cad_usart(char* cadena);

void ini_eusart()
{
    TRISCbits.TRISC7 = 1;       //RX como una entrada digital
    TRISCbits.TRISC6 = 0;       //TX como una salida digital
    // Se necesita CSRC = x, TX9 = 0, TXEN = 1, SYNC = 0, sendb = 0, BRGH = 1
    TXSTA = 0b00100100;         // 8bits, transmisión habilitada, asíncrono, alta velocidad
    // Se necesita SPEN = 1, RX9 = 0, SREN = x, CREN = 1
    RCSTA = 0b10010000;         // recepción habilitada a 8 bits,
    // para una velocidad de 9600 baudios con un oscilador de 8 Mhz
    // SPBRG = ((8000000/9600)/16) - 1 = 51
    SPBRG = 51;           
}
// maestro
unsigned char lee_usart()
{
    if(PIR1bits.RCIF == 1)    //Si hay dato en RCREG
    {
        return RCREG;       //devuelve el dato en RCREG
    }
    else
        return 0x00;
}

void escr_char_usart(unsigned char dato)
{
    while(TXSTAbits.TRMT == 0);   // espero a que TSR esté vacío: TRMT = 1
   TXREG = dato;           // cuando TSR esté vacio cargo el dato
}

void escr_cad_usart(char* buf)
{       
    char i;
    for(i=0;buf!='\0';i++)
        escr_char_usart(buf);
}

unsigned char lee_cad_usart(char *buf, char longitud)
{
    char i;
    for(i=0;i<longitud;i++)
         buf = lee_usart();

Maestro:

#include <xc.h>
#include "config_master_2uC01.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "EUSART.h"
#include "LCD.h"
#define _XTAL_FREQ 8000000

void main()
{
    char dato[20];
    TRISAbits.TRISA0 = 1;
    TRISD = 0X08;
    TRISBbits.TRISB0 = 0;
    ANSEL = 0;
    OSCCONbits.IRCF = 0b111;    // 8 MHz
    ini_eusart();
    ini_lcd();
    while(1)
    {
        PORTBbits.RB0 = 0;
        ve_xy(1,1); escr_cadena("Buenas tardes");
        if(PORTAbits.RA0 == 0)
        {           
            escr_char_usart('a');
            if(PIR1bits.RCIF == 1)
            {         
                PORTBbits.RB0 = 1;
                lee_cad_usart(dato, 20);   
                __delay_ms(2);
                ve_xy(1,2);
                escr_cadena(dato);      // LCD
            }
             __delay_ms(100);
             ve_xy(1,2);
             escr_cadena("                ");   // LCD
        }
       
    }



¿Alguien puede decirme qué está pasando porfa?

De antemano gracias



Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Comunicación de 2 uC por USART
« Respuesta #1 en: 06 de Mayo de 2020, 06:34:13 »
Te voy comentando en el codigo:

Código: C
  1. unsigned char lee_cad_usart(char *buf, char longitud)
  2. {
  3.     char i;
  4.     for(i=0;i<longitud;i++)
  5.          *buf++ = lee_usart();  
  6.      
  7. // Incrementa el puntero, si no lo que estas haciendo es leer la usart 20 veces y cargarlo siempre en la dirección
  8.  // del primer carácter de buff solapando uno encima del otro.
  9.       // aparte, cuando quieras acceder al contenido de memoria de un puntero tanto para leerlo
  10.     // como para modificarlo tienes que ponerle el *delante.
  11.  
  12. }     // <<----  No encuentro la llave de cierre de esta función en tu código.


Los macros e includes los pondría al principio del todo.

 



Código: C
  1. void escr_cad_usart(char* buf)
  2. {      
  3.     char i;
  4.     for(i=0;buf !='\0'; i++)      
  5. // Este for termina solamente cuando se encuentre un caracter null. el i=0;i++ y demás no tiene ningún sentido aquí por que es que además
  6. // nisiquiera está controlando nada dentro de la iteracción.  
  7.         escr_char_usart(buf);  
  8. }

  Yo lo probaría así:

 
Código: C
  1. void escr_cad_usart(char* buf)
  2. {      
  3.     while(*buff != '\0') escr_char_usart(buf++);   // Va a enviar toda la cadena buff hasta el (null).
  4. }



« Última modificación: 06 de Mayo de 2020, 06:40:59 por remi04 »

Desconectado rfjhh

  • PIC10
  • *
  • Mensajes: 14
Re:Comunicación de 2 uC por USART
« Respuesta #2 en: 06 de Mayo de 2020, 20:47:14 »
remi04

Gracias por responder.
Probé lo que me propusiste y ahora ni siquiera escribe Ho

Saludos

Desconectado rfjhh

  • PIC10
  • *
  • Mensajes: 14
Re:Comunicación de 2 uC por USART
« Respuesta #3 en: 06 de Mayo de 2020, 21:04:56 »
remi04

También veo que
void escr_cad_usart(char* buf)
{       
    char i;
    for(i=0;buf !='\0'; i++)     
// Este for termina solamente cuando se encuentre un caracter null. el i=0;i++ y demás no tiene ningún sentido aquí por que es que además
// nisiquiera está controlando nada dentro de la iteracción. 
        escr_char_usart(buf);   
}

no escribe en la terminal virtual, mientras que el que tengo si   :?


Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Comunicación de 2 uC por USART
« Respuesta #4 en: 07 de Mayo de 2020, 03:42:21 »
Pruébalo así.

void escr_cad_usart(char* buf)
{       
    while(*buff != '\0') escr_char_usart(*buff++);   // Va a enviar toda la cadena buff hasta el (null).
}
« Última modificación: 07 de Mayo de 2020, 04:16:13 por remi04 »