Настраиваем UART на передачу данных в микроконтроллере PIC16F873A.

В данном уроке мы настроим работу UART на передачу данных в микроконтроллере 16F873A.  UART подключается к ножкам RC7 — RX, RC6 — TX.

В качестве переходника будем использовать обычный USB переходник:

В качестве терминальной программы будем использовать CoolTerm.

Для настройки UART на передачу данных нам понадобятся следующий регистр:

TXSTA — Регистр состояния и управления передатчика.

Где:

CSRC: Выбор источника тактового сигнала
Синхронный режим
1 = ведущий, внутренний тактовый сигнал от BRG
0 = ведомый, внешний тактовый сигнал с входа CK
Асинхронный режим
Не имеет значения
 TX9: Разрешение 9-разрядной передачи
1 = 9-разрядная передача
0 = 8-разрядная передача
TXEN: Разрешение передачи
1 = разрешена
0 = запрещена
Примечание. В синхронном режиме биты SREN/CREN отменяют действие бита TXEN.
SYNC: Режим работы USART
1 = синхронный
0 = асинхронный
бит 3: Не используется: читается как ‘0’
BRGH: Выбор высокоскоростного режима
Синхронный режим
Не имеет значения
Асинхронный режим
1 = высокоскоростной режим
0 = низкоскоростной режим
TRMT: Флаг очистки сдвигового регистра передатчика TSR
1 = TSR пуст
0 = TSR полон
TX9D: 9-й бит передаваемых данных (может использоваться для программной проверки четности)

Так же надо еще установить в 1 значение бита SPEN (разрешение работы последовательного порта) который находиться в регистре CSTA.

Скорости передачи данных рассчитывают по следующей формуле:

BRGH = 0
(Асинхронный) Скорость обмена = FOSC / (64 (X + 1))
(Синхронный) Скорость обмена = FOSC / (4 (X + 1))
BRGH = 1
(Асинхронный) Скорость обмена = FOSC / (16 (X + 1))
(Синхронный) Скорость обмена = FOSC / (4 (X + 1))
X = значение регистра SPBRG (от 0 до 255)

Заголовочный файл:

#ifndef MAIN_H
#define MAIN_H

#define _XTAL_FREQ 8000000
#include <xc.h>
#include <stdio.h>
#include <string.h>

//--------------------------------------------------------------
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//--------------------------------------------------------------

#endif /* MAIN_H */

Основная программа, в ней мы будем разными способами отправлять данные на терминал. Причем мы выведем как текст, так и цифры — целые и дробные:

#include "main.h"

void USART_Transmit(unsigned char tx_byte){
while(!(TRMT)){;}
TXREG=tx_byte;
}

void USART_Transmit_Arr(char *tx_buff, unsigned int tx_len){
unsigned int cnt=0;
while(cnt<tx_len)
{
USART_Transmit(tx_buff[cnt]);
cnt++;
}
}

void USART_Transmit_Str(char *str_buff){
unsigned int cnt=0;
unsigned int tx_len = strlen(str_buff);
while(cnt<tx_len)
{
USART_Transmit(str_buff[cnt]);
cnt++;
}
}

void main(void) {
char str1[15];
int i=5;
TRISC6 = 1; //USART (TX);
TRISC7 = 1; //USART (RX);
SPBRG=12; //38400
TX9 = 0;
TXEN = 1;
SYNC = 0;
BRGH = 1;
TX9D = 0;
SPEN = 1;

 while(1){
__delay_ms(500);
USART_Transmit_Arr("1234567890\r\n",12);
__delay_ms(500);
USART_Transmit_Str("0987654321\r\n");
__delay_ms(500);
sprintf(str1,"String%d\r\n",i);
USART_Transmit_Str(str1);
__delay_ms(500);
str1[0]='5';
str1[1]='.';
str1[2]='2';
USART_Transmit_Arr(str1,3);
USART_Transmit_Arr("\r\n",2);
}
}