Estoy intentando usar el módulo USART en PIC161F628A para comunicarme con un HC -06 módulo bluetooth. Escribí mi código en C en MPLAB X usando el compilador XC8, sin embargo, no parece funcionar y no puedo entender por qué.
Aquí está mi código:
#include <xc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000 // Hz
#endif
// Comm Setup.
#define BAUDRATE 9600
// Config words.
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_ON & LVP_OFF & CPD_OFF & CP_OFF);
//__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_ON & LVP_OFF & CPD_OFF & CP_OFF);
// Function that initializes UART.
void initUART(void) {
// First calculate check if we have a high baudrate.
unsigned int x;
x = (_XTAL_FREQ - BAUDRATE*64)/(BAUDRATE*64); // SPBRG for Low Baud Rate
if(x>255) {
x = (_XTAL_FREQ - BAUDRATE*16)/(BAUDRATE*16); // SPBRG for High Baud Rate
BRGH = 1; // Setting High Baud Rate
} else {
// Define pins.
TRISB2 = 1; // TX Pin
TRISB1 = 1; // RX Pin
// Define UART setup.
SPBRG = x; // Writing SPBRG Register
SYNC = 0; // Setting Asynchronous Mode, ie UART
SPEN = 1; // Enables Serial Port
CREN = 1; // Enables Continuous Reception
TXIE = 0; // Disable tx interrupts
//RCIE = 1; // Enable rx interrupts
RCIE = 0;
TX9 = 0; // 8-bit transmission
RX9 = 0; // 8-bit reception
TXEN = 0; // Reset transmitter
TXEN = 1; // Enables Transmission
}
}
// Function that sends characters through serial port.
void sendData(char data) {
while(!TRMT); // wait for previous transmission to finish
TXREG = data;
}
// Function that sends strings through serial port.
void sendString(char* text) {
int i;
for(i=0;text[i]!='#include <xc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000 // Hz
#endif
// Comm Setup.
#define BAUDRATE 9600
// Config words.
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_ON & LVP_OFF & CPD_OFF & CP_OFF);
//__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_ON & LVP_OFF & CPD_OFF & CP_OFF);
// Function that initializes UART.
void initUART(void) {
// First calculate check if we have a high baudrate.
unsigned int x;
x = (_XTAL_FREQ - BAUDRATE*64)/(BAUDRATE*64); // SPBRG for Low Baud Rate
if(x>255) {
x = (_XTAL_FREQ - BAUDRATE*16)/(BAUDRATE*16); // SPBRG for High Baud Rate
BRGH = 1; // Setting High Baud Rate
} else {
// Define pins.
TRISB2 = 1; // TX Pin
TRISB1 = 1; // RX Pin
// Define UART setup.
SPBRG = x; // Writing SPBRG Register
SYNC = 0; // Setting Asynchronous Mode, ie UART
SPEN = 1; // Enables Serial Port
CREN = 1; // Enables Continuous Reception
TXIE = 0; // Disable tx interrupts
//RCIE = 1; // Enable rx interrupts
RCIE = 0;
TX9 = 0; // 8-bit transmission
RX9 = 0; // 8-bit reception
TXEN = 0; // Reset transmitter
TXEN = 1; // Enables Transmission
}
}
// Function that sends characters through serial port.
void sendData(char data) {
while(!TRMT); // wait for previous transmission to finish
TXREG = data;
}
// Function that sends strings through serial port.
void sendString(char* text) {
int i;
for(i=0;text[i]!='%pre%';i++)
sendData(text[i]);
}
char UART_TX_Empty() {
return TRMT;
}
// Main function.
void main(void) {
TRISB = 0; // PORTB as Output.
nRBPU = 0; // Enables PORTB Internal Pull Up Resistors
// Initialize UART.
initUART();
while(1) {
// Send string through UART.
sendString("Hello!");
__delay_ms(300);
}
}
';i++)
sendData(text[i]);
}
char UART_TX_Empty() {
return TRMT;
}
// Main function.
void main(void) {
TRISB = 0; // PORTB as Output.
nRBPU = 0; // Enables PORTB Internal Pull Up Resistors
// Initialize UART.
initUART();
while(1) {
// Send string through UART.
sendString("Hello!");
__delay_ms(300);
}
}
He verificado que el módulo Bluetooth funciona correctamente al conectarlo a mi computadora portátil y usarlo para enviar y recibir cadenas a mi teléfono. También he verificado que el microcontrolador está funcionando correctamente al escribir un simple programa "Hello World" de un LED parpadeando.
He estado tratando de hacer que esto funcione por un par de días y estoy bastante frustrado en este punto, ¡cualquier ayuda sería muy apreciada!