4 функции ему всего надо - инициализация, получение байта, отправка байта и проверка получен ли байт
технических проблем с написанием нет. Однако, поскоку "библиотека" - по идее в инициализации надо дать возможность выбора типа передачи - длина фрейма, стоповые биты и т.д.
по известным причинам - решил сделать всю конфигурацию препроцессором.
получилось что-то:
Код
//USART initialisation function
//Initialisation, asynchronous transmission
void USART_Init()
{
// set baud rate
UBRRH = (F_CPU / BAUD_RATE / 16 - 1) >> 8;
UBRRL = (F_CPU / BAUD_RATE / 16 - 1);
//set UCSZ2 if 9-bit communication
#ifdef FRAME_LENGTH9
UCRSRA |= (1<< UCSZ2)
#endif
//asynchronous 8 bit
UCSRC = (1 << UCSZ0) | (1 <<UCSZ1);
//Parity bit
#ifdef ODD_PARITY
UCSRC |= (1<<UPM1) | (1<<UPM0);
#endif
#ifdef EVEN_PARITY
UCSRC |= (1<<UPM0);
#endif
//if 2 stop bits
#ifdef STOP2
UCSRC |= (1 << USBS);
#endif
// Enable receiver and transmitter;
UCSRB = (1 << RXEN) | (1 << TXEN);
}
//Initialisation, asynchronous transmission
void USART_Init()
{
// set baud rate
UBRRH = (F_CPU / BAUD_RATE / 16 - 1) >> 8;
UBRRL = (F_CPU / BAUD_RATE / 16 - 1);
//set UCSZ2 if 9-bit communication
#ifdef FRAME_LENGTH9
UCRSRA |= (1<< UCSZ2)
#endif
//asynchronous 8 bit
UCSRC = (1 << UCSZ0) | (1 <<UCSZ1);
//Parity bit
#ifdef ODD_PARITY
UCSRC |= (1<<UPM1) | (1<<UPM0);
#endif
#ifdef EVEN_PARITY
UCSRC |= (1<<UPM0);
#endif
//if 2 stop bits
#ifdef STOP2
UCSRC |= (1 << USBS);
#endif
// Enable receiver and transmitter;
UCSRB = (1 << RXEN) | (1 << TXEN);
}
что напрягает:
//asynchronous 8 bit
UCSRC = (1 << UCSZ0) | (1 <<UCSZ1);
#ifdef ODD_PARITY
UCSRC |= (1<<UPM1) | (1<<UPM0);
#endif
поясняю: 2 команды на конфигурацию 1 регистра.
а хотелось бы всю конфигурацию этого регистра записать одной командой. а как, не рассматирвая все конфигурации - не вижу. кто поможет?
компилятор - gcc
P.S.
еще такой момент, как в окне компиляции заставить выводить сообщения пользовательские - типа текущую конфигурацию.
типа #error, тока чтоб не блокировал компиляцию.
#warning в моем gcc почему-то не распознается