MPLAB X & C18: Comunicación serie (UART)

Saludos!! El objetivo de este ejemplo usar la UART de nuestro microcontrolador (especƭficamente del PIC18F4620) y comunicarlo con nuestra PC para interactuar con el monitor serial X-CTU (pueden descargar la version que yo uso desde aquƭ, por cierto yo lo ocupo con Windows7 sin problemas), si lo prefieren pueden usar otro como el Hiperterminal, Putty o incluso el monitor serial de Arduino, como en mi PC no tengo un puerto serial voy a utilizar el FT232 para hacer el puente entre el uC y un puerto USB (usare un circuito mostrado anteriormente en el blog, aquƭ el enlace), tambiƩn pueden usar otro modulo o circuito que tengan.

La configuración del X-CTU usado para este ejemplo es el siguiente:

El circuito usado es bastante sencillo, se trata de tres LEDs conectado al puerto E de un PIC18F4620, los pines TX y RX se conectan al modulo FT232 (recordar que se invierten los pines para tener una comunicación exitosa), continuación el circuito usado:

El código que hace posible esto es el siguiente, primero mostramos la librería para la UART, una forma sencilla y se debe de aclarar que la recepción de datos esta activado constantemente, se muestran los archivos uart.h y uart,c:
/*******************************************************************************
*
* Libreria basica para usar la UART
*
*******************************************************************************
* FileName: uart.c
* Processor: PIC18F4620
* Complier: MPLAB x IDE v3.51 & C18 v3.47
* Author: Pedro SƔnchez (MrChunckuee)
* Blog: http://mrchunckuee.blogspot.com/
* Email: mrchunckuee.psr@gmail.com
* Description: Eviar y recibir datos por la USART del uC y monitorear la
* informacion en la computadora.
*******************************************************************************
* Rev. Date Comment
* v1.00 27/01/2017 - Creación del firmware
* - Envio y recepcion de datos de forma sencilla
******************************************************************************/
//*********** I N C L U D E S *************************************************/
#include <p18f4620.h>
#include "uart.h"
/*******************************************************************************
* Function: void UART_Init(void)
* Description: Initialization of UART
* Precondition: None
* Parameters: None
* Return Values: None
* Remarks: 1. Enable Transmitter and select High Baud Rate in TXSTA
* 2. Select a value in SPGRB register to generate 9600 baud rate
* 3. Enable Serial port in RCSTA register
* 4. Enable continuous reception in RCSTA
******************************************************************************/
void UART_Init(void){
//Configure RC6/TX/CK and RC7/RX/DT as a UART
UART_RX_TRIS = 1;
UART_TX_TRIS = 0;
UART_TX_STATUS = 0; // Reset TXSTA
UART_RX_STATUS = 0; // Reset RCSTA
UART_TX_STATUS = 0x20; // Load TXSTA from TxConUser selected
SPBRG = BAUD_RATE; // Write baudrate to SPBRG
UART_RX_STATUS = 0x90;
BAUDCON = BAUD_CONTROL;
}
/*******************************************************************************
* Function: unsigned char UART_ReadByte(void)
* Description: Wait till a byte received from terminal
* Precondition: None
* Parameters: None
* Return Values: Return a byte received from UART
* Remarks: None
******************************************************************************/
unsigned char UART_ReadByte(void){
unsigned char recv_data;
while(!PIR1bits.RCIF);
recv_data = RCREG;
PIR1bits.RCIF = 0;
return (recv_data);
}
/*******************************************************************************
* Function: void UART_WriteByte (unsigned char data_byte)
* Description: Transmits a byte to terminal through UART
* Precondition: None
* Parameters: unsigned char send_data = Byte to transmit
* Return Values: None
* Remarks: None
******************************************************************************/
void UART_WriteByte (unsigned char data_byte){
TXREG = data_byte; // Also transmit USART status value
while (!TXSTAbits.TRMT); // wait here transmission to complete.
}
/*******************************************************************************
* Function: void UART_WriteString (unsigned char *mess)
* Description: Sends the string to terminal till it finds NULL character.
* Precondition: None
* Parameters: unsigned char *data_string = Pointer to display message
* Return Values: None
* Remarks: None
******************************************************************************/
void UART_WriteString (unsigned char *data_string){
while(*data_string != '\0'){
UART_WriteByte(*data_string++);
}
}
view raw C18_011: uart.c hosted with ā¤ by GitHub
/*
* File: uart.h
* Author: MRCHUNCKUEE
*
* Created on 27 de enero de 2017, 10:03 PM
*/
#ifndef UART_H
#define UART_H
#ifdef __cplusplus
extern "C" {
#endif
/****PORT D E F I N I T I O N S ***********************************************/
//UART PORT DEFINITIONS
#define UART_RX_TRIS TRISCbits.TRISC7
#define UART_TX_TRIS TRISCbits.TRISC6
#define UART_RX_STATUS RCSTA
#define UART_TX_STATUS TXSTA
/********* G E N E R I C D E F I N I T I O N S ******************************/
#define BAUD_CONTROL 00
#define BAUD_RATE 25
/*********** P R O T O T Y P E S **********************************************/
void UART_Init(void);
unsigned char UART_ReadByte(void);
void UART_WriteByte (unsigned char data_byte);
void UART_WriteString (unsigned char *data_string);
#ifdef __cplusplus
}
#endif
#endif /* UART_H */
view raw C18_011: uart.h hosted with ā¤ by GitHub
La configuración de los fuses del PIC queda de a siguiente forma:
#ifndef __WORD_CONFIG_H
#define __WORD_CONFIG_H
// Configuracion del PIC18F4620
#pragma config OSC = INTIO67 //Uso del osc interno
#pragma config FCMEN = ON
#pragma config IESO = ON
#pragma config PWRT = ON
#pragma config BOREN = OFF
#pragma config WDT = OFF
#pragma config MCLRE = ON //Se activa el reset externo
#pragma config LVP = OFF
#pragma config XINST = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT3 = OFF
#pragma config WRTC = OFF
#pragma config WRTB = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
#endif
Para nuestra archivo main.c tenemos en el bucle infinito una lectura de lo datos recibidos, después lo evaluamos con un switch y realizamos una acción dependiendo del dato recibido, que en este caso es encender los LEDs y devolver un mensaje del estado, el código queda de la siguiente forma:
/*******************************************************************************
*
* Ejemplo basico para la USART
*
*******************************************************************************
* FileName: main.c
* Processor: PIC18F4620
* Complier: MPLAB x IDE v3.51 & C18 v3.47
* Author: Pedro SƔnchez (MrChunckuee)
* Blog: http://mrchunckuee.blogspot.com/
* Email: mrchunckuee.psr@gmail.com
* Description: Eviar y recibir datos por la USART del uC y monitorear la
* informacion en la computadora.
*******************************************************************************
* Rev. Date Comment
* v1.00 25/01/2017 Creación del firmware
******************************************************************************/
/************ I N C L U D E S *************************************************/
#include <p18f4620.h>
#include <delays.h>
#include "Config_FUSES.h" //Only here
#include "uart.h"
/*********** P O R T D E F I N I T I O N S **********************************/
#define LED1_TRIS TRISEbits.TRISE0
#define LED1 LATEbits.LATE0
#define LED2_TRIS TRISEbits.TRISE1
#define LED2 LATEbits.LATE1
#define LED3_TRIS TRISEbits.TRISE2
#define LED3 PORTEbits.RE2
/*********** L E D S T A T U S M E S S A G E ********************************/
unsigned char mensajeLED1_ON[]=" LED 1 Encendido\r";
unsigned char mensajeLED1_OFF[]=" LED 1 Apagado\r";
unsigned char mensajeLED2_ON[]=" LED 2 Encendido\r";
unsigned char mensajeLED2_OFF[]=" LED 2 Apagado\r";
unsigned char mensajeLED3_ON[]=" LED 3 Encendido\r";
unsigned char mensajeLED3_OFF[]=" LED 3 Apagado\r";
unsigned char mensajeAllLED_ON[]=" LEDs Encendidos\r";
unsigned char mensajeAllLED_OFF[]=" LEDs Apagados\r";
/************** P R O T O T Y P E S *******************************************/
void MCU_Init(void);
void main(void){
unsigned char val_usart=0;
MCU_Init(); //Initilization of uC
UART_Init(); //Initilization of UART
while(1){
val_usart=UART_ReadByte();
Delay10KTCYx(100);
switch (val_usart){
case 'a':
LED1 = 1;
UART_WriteString(mensajeLED1_ON);
break;
case 'b':
LED1 = 0;
UART_WriteString(mensajeLED1_OFF);
break;
case 'c':
LED2 = 1;
UART_WriteString(mensajeLED2_ON);
break;
case 'd':
LED2 = 0;
UART_WriteString(mensajeLED2_OFF);
break;
case 'e':
LED3 = 1;
UART_WriteString(mensajeLED3_ON);
break;
case 'f':
LED3 = 0;
UART_WriteString(mensajeLED3_OFF);
break;
case 'g':
LED1 = 1;
LED2 = 1;
LED3 = 1;
UART_WriteString(mensajeAllLED_ON);
break;
case 'h':
LED1 = 0;
LED2 = 0;
LED3 = 0;
UART_WriteString(mensajeAllLED_OFF);
break;
default:
LED1 = 0;
LED2 = 0;
LED3 = 0;
break;
}
}
}
/*******************************************************************************
* Function: void MCU_Init(void)
* Description: Configura opciones del sitema. Velocidad, entras y salidas
* Precondition: None
* Parameters: None
* Return Values: None
* Remarks: Oscilador interno = 4MHz, PLL activado, OSC = 16MHz
******************************************************************************/
void MCU_Init(void){
OSCCONbits.IRCF = 0b110; //Fosc = 4MHz
OSCTUNEbits.PLLEN = 1; //PLL enable Fosc = 16MHz
ADCON1=0xFF; //Entradas digitales
LED1_TRIS = 0; //
LED2_TRIS = 0; //LEDs como salidas
LED3_TRIS = 0; //
LED1 = 0; //
LED2 = 0; //Apagamos LEDs
LED3 = 0; //
}
view raw C18_011: main.c hosted with ā¤ by GitHub
Aquí el vídeo del circuito en acción:


Descargas:
AquĆ­ el enlace directo para DESCARGAR los archivos disponibles, tambiĆ©n puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquĆ­, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.


Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interĆ©s y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. TambiĆ©n puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.

Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.

Publicar un comentario

0 Comentarios