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