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; //обрабатываем нашу строку как хотим. }



Комментариев нет:
Отправить комментарий
ваше мнение...