#include <htc.h>
/*
;******** Configuracion del Oscilador **********
CONFIG FOSC = XT_XT ;Osc XT, XT usado para el USB
;******** Otros bits de configuracion **********
CONFIG PWRT = ON ;PWRT habilitado
CONFIG BOR = OFF ;Brown out resete deshabilitado
CONFIG WDT = OFF ;Watch dog deshabilitado
CONFIG MCLRE = OFF ;MCLR como entrada
CONFIG PBADEN = ON ;Todos los pines como entradas analogicas
CONFIG LVP = OFF ;programacion en bajo voltaje deshabilitado
;********* Bits de proteccion ******************
CONFIG CP0 = OFF ;los bloques del codigo de programa
CONFIG CP1 = OFF ;no estan protegidos
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF ;Sector Boot no esta protegido
CONFIG CPD = OFF ;La EEPROM no esta protegida
*/
/*
Hay que definir BAUD y PIC_CLK para que compile bien y a su vez para poder asignar el valor de velocidad
PIC_CLK tiene que ser la frecuencia de trabajo del CPU y es el mismo que hay que asignar desde Proteus
*/
#define BAUD 19200 // velocidad en baudios
#define PIC_CLK 20000000 // 20MHz de oscilación
void serial_setup(void);
void putch(unsigned char);
unsigned char dummy;
void main (void)
{
char c = 'G'; //cuando es un valor char tiene que ir entre comillas simples (') y no dobles (")
TRISC = 192; //todos los pines del puerto C se van a comportar como salida menos RC7 Y RC6. ( como entrada) 2^6 + 2^7=192
serial_setup();
while(1)
{
putch(c);
}
}
void serial_setup(void)
{
/*
Te agrego lo siguiente para que se configure la velocidad automáticamente,
basandose en el valor definido a PIC_CLK y el valor definido a BAUD
Que esta basado en la formula del DataSheet para BRG16 = 0 y BRGH = 1
*/
#define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1) // Valor que hay que asignar al registro SPBRG
// En nuestro caso la Fosc=5MHZ y baud rate 9600kbaud/s
/*
#define BAUD 9600
#define SPBRG
#define BRGH_VALUE 1 // High Baud Rate Select bit (=1 High Speed)
#if PIC_CLK==5000000 && BAUD==9600
#assert SPBRG==129 // Calculado anteriormente. Daba 129.2 pero hay que redondear a la baja 129
#assert BRGH_VALUE==1
#endif
*/
/*
Anulé todo lo anterior, porque no voy a hacer uso de ello
*/
BRGH = 1;
BRG16 = 0;
SPBRG = SPBRG_VALUE; //esté es el valor caldulado y lo podés corroborar con las tablas del DataSheet
SPEN=1; // Enable serial port
SYNC=0; // Asincrono
/*Transmision*/
TXIE=0; // Desactivar interrupciones de tx
TXEN=1; // Enable the transmitter
TX9=0; // 8 bits transmission
/*Recepcion*/
RCIE=1; // Interrupciones en recepcion
RX9=0; // 8 bits receiver
CREN=1; // Enable reception
//Using interruptions...
GIE=1;
PEIE=1;
// Para configurar como asincrono
/*
1. Initialize the SPBRGH:SPBRG registers for the
appropriate baud rate. Set or clear the BRGH
and BRG16 bits, as required, to achieve the
desired baud rate.
2. Enable the asynchronous serial port by clearing
bit, SYNC, and setting bit, SPEN.
3. If the signal from the TX pin is to be inverted, set
the TXCKP bit.
4. If interrupts are desired, set enable bit, TXIE.
5. If 9-bit transmission is desired, set transmit bit,
TX9. Can be used as address/data bit.
6. Enable the transmission by setting bit, TXEN,
which will also set bit, TXIF.
7. If 9-bit transmission is selected, the ninth bit
should be loaded in bit, TX9D.
8. Load data to the TXREG register (starts
transmission).
9. If using interrupts, ensure that the GIE and PEIE
bits in the INTCON register (INTCON<7:6>) are
set.
*/
/*
To set up an Asynchronous Reception:
1. Initialize the SPBRGH:SPBRG registers for the
appropriate baud rate. Set or clear the BRGH
and BRG16 bits, as required, to achieve the
desired baud rate.
2. Enable the asynchronous serial port by clearing
bit, SYNC, and setting bit, SPEN.
3. If the signal at the RX pin is to be inverted, set
the RXDTP bit.
4. If interrupts are desired, set enable bit, RCIE.
5. If 9-bit reception is desired, set bit, RX9.
6. Enable the reception by setting bit, CREN.
7. Flag bit, RCIF, will be set when reception is
complete and an interrupt will be generated if
enable bit, RCIE, was set.
8. Read the RCSTA register to get the 9th bit (if
enabled) and determine if any error occurred
during reception.
9. Read the 8-bit received data by reading the
RCREG register.
10. If any error occurred, clear the error by clearing
enable bit, CREN.
11. If using interrupts, ensure that the GIE and PEIE
bits in the INTCON register (INTCON<7:6>) are
set
*/
#define clear_usart_errors_inline \
if (OERR) \
{ \
TXEN=0; \
TXEN=1; \
CREN=0; \
CREN=1; \
} \
if (FERR) \
{ \
dummy=RCREG; \
TXEN=0; \
TXEN=1; \
}
}
void putch(unsigned char c)
{
while(!TXIF) // 1 si el registro esta vacio
{
clear_usart_errors_inline;
CLRWDT();
}
TXREG=c;
}