#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<