В данном уроке мы настроим работу 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.
Скорости передачи данных рассчитывают по следующей формуле:
Заголовочный файл:
#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);
}
}