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