uart #5

Merged
stud126186 merged 4 commits from uart into hdlc-interface 2023-06-25 13:10:46 +00:00
Showing only changes of commit a2546d2931 - Show all commits

101
uart.c Normal file
View File

@ -0,0 +1,101 @@
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 16000000
#define SIZE_BUF 8
//кольцевой (циклический) буфер
volatile unsigned char usartTxBuf[SIZE_BUF];
unsigned char txBufTail = 0; //"указатель" хвоста буфера
unsigned char txBufHead = 0; //"указатель" головы буфера
volatile unsigned char txCount = 0; //счетчик символов
uint8_t receive = 0;
uint8_t rx_data = 0;
volatile uint8_t rx_flag = 0;
void UARTInit(void) {
UCSR1B=0; UCSR1C=0; // Обнулим, на всякий случай регистры статуса и контроля.
UBRR0H = 0; // Старшие биты регистра скорости.
UBRR0L = 103; //скорость передачи данных 9600
UCSR0B = (1«RXEN0)|(1«TXEN0)|(1«RXCIE0)|(1«TXCIE0)|(0«UDRIE0);//Включаем (подключаем ножки контроллера) приём и передачу по UART.
UCSR0C = (1«UCSZ01)|(1«UCSZ00); //8 bit
}
void UARTSend(uint8_t data) {
while (!(UCSR0A & (1«UDRE0))); // Ждём опустошения буфера передачи (читаем флаг).
UDR0 = data; // Записываем в регистр значение переменной "data" для передачи.
}
//"очищает" буфер
void USART_FlushTxBuf(void)
{
txBufTail = 0;
txCount = 0;
txBufHead = 0;
//положить символ в буфер
void USART_PutChar(unsigned char sym)
{
if(((UCSRA0 & (1«UDRE0)) != 0) && (txCount == 0)) UDR0 = sym; //Если модуль USART не занят и передающий буфер пустой,
else { //символ записывается в регистр UDR
if (txCount < SIZE_BUF){ //если в буфере еще есть место
usartTxBuf[txBufTail] = sym; //помещаем в него символ
txCount++; //инкрементируем счетчик символов
txBufTail++; //и индекс хвоста буфера
if (txBufTail == SIZE_BUF) txBufTail = 0;
}
}
}
//взять символ из буфера
unsigned char GetChar(void)
{
unsigned char sym = 0;
if (count > 0){ //если буфер не пустой
sym = cycleBuf[head]; //считываем символ из буфера
count--; //уменьшаем счетчик символов
head++; //инкрементируем индекс головы буфера
if (head == SIZE_BUF) head = 0;
}
return sym;
}
//функция загрузки строк
void USART_SendStr(unsigned char * data)
{
unsigned char sym;
while(*data){ // пока не будет считан символ конца строки
sym = *data++;
USART_PutChar(sym);
}
}
// unsigned char UARTGet() {
// while(!rx_flag); //пока значение флага не станет равно "1"
// rx_flag = 0;
// return rx_data; //возвращет состояние переменной rx_data
// }
int main(void) {
sei();
UARTInit();
DDRL = 0b11111111; // Определим порт "L" на выход
while(1) {
receive = UARTGet();
receive++;
UARTSend(receive);
}
}
ISR(USART_RXC_vect) {
if (txCount > 0){ //если буфер не пустой
UDR = usartTxBuf[txBufHead]; //записываем в UDR символ из буфера
txCount--; //уменьшаем счетчик символов
txBufHead++; //инкрементируем индекс головы буфера
if (txBufHead == SIZE_BUF) txBufHead = 0;
}
// rx_data = UDR0; //В нем данные из приемного буфера UDR переносятся в глобальную переменную rx_data
// rx_flag = 1; //выставляется флаг rx_flag, говорящий о том, что прием завершен
}