Use UART para transmitir datos Pic16f628A

-3

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!

    
pregunta patrickdamery

2 respuestas

1

(Sé que esta es una pregunta antigua, pero daré una respuesta de todos modos)

Hay algo mal en su estructura de código: no use una cláusula else en la línea 23.

Como x es obviamente mayor que 255 (4000000/9600 > 255), la inicialización del pin y USART nunca se realiza.

La depuración al paso a través de tu código revelaría eso.

    
respondido por el Niels C.B.
1
  1. Revise su cableado
  2. Verifique la conexión de BT por su cuenta: conecte RX y TX juntos sin el PIC
  3. Compruebe la conexión PIC por su cuenta: conecte RX y TX juntos sin el módulo BT

Debería recibir los datos transmitidos en el mismo canal.

    
respondido por el ThiloF

Lea otras preguntas en las etiquetas