int init_UART(void) { // Установка скорости 9600 UBRRH=0; // UBRR=f/(16*band)-1 f=8000000Гц band=9600, UBRRL=51; // нормальный асинхронный двунаправленный режим работы // RXC - завершение приёма // |TXC - завершение передачи // ||UDRE - отсутствие данных для отправки // |||FE - ошибка кадра // ||||DOR - ошибка переполнение буфера // |||||PE - ошибка чётности // ||||||U2X - Двойная скорость // |||||||MPCM - Многопроцессорный режим // 76543210 UCSRA=0b00000000; // RXCIE - прерывание при приёме данных // |TXCIE - прерывание при завершение передачи // ||UDRIE - прерывание отсутствие данных для отправки // |||RXEN - разрешение приёма // ||||TXEN - разрешение передачи // |||||UCSZ2 - UCSZ0:2 размер кадра данных // ||||||RXB8 - 9 бит принятых данных // |||||||TXB8 - 9 бит переданных данных // 76543210 UCSRB=0b00011000; // разрешен приём и передача по UART // URSEL - всегда 1 // |UMSEL - режим:1-синхронный 0-асинхронный // ||UPM1 - UPM0:1 чётность // |||UPM0 - UPM0:1 чётность // ||||USBS - топ биты: 0-1, 1-2 // |||||UCSZ1 - UCSZ0:2 размер кадра данных // ||||||UCSZ0 - UCSZ0:2 размер кадра данных // |||||||UCPOL- в синхронном режиме - тактирование // 76543210 UCSRC=0b10000110; // 8-битовая посылка } // UART void send_Uart(unsigned char c)// Отправка байта { while(!(UCSRA&(1<<UDRE))) // Устанавливается, когда регистр свободен {} UDR = c; } void send_Uart_str(unsigned char *s)// Отправка строки { while (*s != 0) send_Uart(*s++); } void send_int_Uart(unsigned int c)// Отправка числа от 0000 до 9999 { unsigned char temp; c=c%10000; temp=c/100; send_Uart(temp/10+'0'); send_Uart(temp%10+'0'); temp=c%100; send_Uart(temp/10+'0'); send_Uart(temp%10+'0'); } unsigned char getch_Uart(void)// Получение байта { while(!(UCSRA&(1<<RXC))) // Устанавливается, когда регистр свободен {} return UDR; } int main(void) { DDRC = 0b00000001; // инициализация порта C, PC0 - выход init_UART(); // инициализация UART _delay_ms(1000); // задержка 1c send_Uart_str("test print"); // отправка строки send_Uart(13); // перенос строки send_int_Uart(2013); // отправка числа send_Uart(13); // перенос строки while(1) // бесконечный рабочий цикл { if(UCSRA&(1<<RXC)) // если пришёл байт по UART { send_Uart(getch_Uart()+1); // отвечаем увеличенным на 1 пришедшим байтом // LED on // и мигнём диодом PORTC = 0b00000001; // Включаем диод PC0 = 1 = Vcc _delay_ms(50); // задержка 50мс // LED off PORTC = 0b00000000; // Выключаем диод PC0 = 0 = Vcc } } }
#define RX_BUFFER 128 //длина нашего буфера, читай макс. длина строки volatile unsigned char work=0; volatile unsigned char rx_buffer[RX_BUFFER]; ISR(USART_RXC_vect) { unsigned char status,data; status=UCSRA; data=UDR; if ((status&((1<<FE)|(1<<PE)|(1<<DOR)))==0) { if (data==10) // CR { work=1; } else rx_buffer[rx_index]=data; if (++rx_index == RX_BUFFER) rx_index=0; } } в майне: if (work) { work=0; //обрабатываем нашу строку как хотим. }
Комментариев нет:
Отправить комментарий
ваше мнение...