From 993d23b92878650567cfd0747ec8cd81ced66353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=97=D0=B0=D0=BF=D0=B5?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=D0=BE=D0=B2?= Date: Thu, 8 Jun 2023 11:36:42 +0000 Subject: [PATCH] complete --- uart/uart.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++ uart/uart.h | 11 +++++ 2 files changed, 131 insertions(+) create mode 100644 uart/uart.c create mode 100644 uart/uart.h diff --git a/uart/uart.c b/uart/uart.c new file mode 100644 index 0000000..2fbd5a1 --- /dev/null +++ b/uart/uart.c @@ -0,0 +1,120 @@ +#include +#include +#include + +#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< 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_TXC_vect) { + if (txCount > 0){ //если буфер не пустой + UDR0 = usartTxBuf[txBufHead]; //записываем в UDR символ из буфера + txCount--; //уменьшаем счетчик символов + txBufHead++; //инкрементируем индекс головы буфера + if (txBufHead == SIZE_BUF) + txBufHead = 0; + } + else { + UCSR0B &= ~(0<