Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAvr, вопрос по препроцессору
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
xelos
вобщем у меня стажер тут, попросил написать ему библиотеку для работы с уартом на ATMega128.

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);


}


что напрягает:
//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 почему-то не распознается
prottoss
Цитата(xelos @ Jun 24 2006, 00:26) *
вобщем у меня стажер тут, попросил написать ему библиотеку для работы с уартом на ATMega128.
Посмотрите на http://electronix.ru/forum/index.php?showt...=0&#entry122319 . Там есть мною написанный драйвер USART c командами препроцессора, мож подойдет Вам
vet
А что, собственно, мешает записать это одной командой?
Код
   #ifdef ODD_PARITY
   UCSRC = (1 << UCSZ0) | (1 <<UCSZ1)|(1<<UPM1) | (1<<UPM0);
   #else
   #ifdef EVEN_PARITY
   UCSRC = (1 << UCSZ0) | (1 <<UCSZ1)|(1<<UPM0);
   #else
   UCSRC = (1 << UCSZ0) | (1 <<UCSZ1);
   #endif
   #endif
xelos
не, вопрос к тому, что, например, битовое поле составить в зависимости от конфигурации. например, каждый бит это есть один параметр, который задается макросом.
и вопрос в том как составить эти макросы, чтобы 1 командой в регистр загружалось, а не несколькими.

UCSRC = (1 << UCSZ0) | (1 <<UCSZ1)|(1<<UPM1) | (1<<UPM0);

макросами я изменять могу длину фрейма (UCSZ0, UCSZ1) и четность (UPM1,UPM0) - вашим методом придется все возможные комбинации описывать, а хотелось бы поизящней как.
vet
Скажем, так:
Код
//asynchronous 8 bit
    #define UCSRC_INIT_BASE (1 << UCSZ0) | (1 <<UCSZ1)

   //Parity bit
   #ifdef ODD_PARITY
   #define UCSRC_INIT UCSRC_INIT_BASE | (1<<UPM1) | (1<<UPM0)
   #endif

   #ifdef EVEN_PARITY
   #define UCSRC_INIT UCSRC_INIT_BASE | (1<<UPM0)
   #endif

   UCSRC = UCSRC_INIT;

хотя, на мой взгляд, обилие препроцессора в исходниках усложняет понимание программы.
xelos
Цитата(vet @ Jun 23 2006, 23:05) *
Скажем, так:
Код
//asynchronous 8 bit
    #define UCSRC_INIT_BASE (1 << UCSZ0) | (1 <<UCSZ1)

   //Parity bit
   #ifdef ODD_PARITY
   #define UCSRC_INIT UCSRC_INIT_BASE | (1<<UPM1) | (1<<UPM0)
   #endif

   #ifdef EVEN_PARITY
   #define UCSRC_INIT UCSRC_INIT_BASE | (1<<UPM0)
   #endif

   UCSRC = UCSRC_INIT;

хотя, на мой взгляд, обилие препроцессора в исходниках усложняет понимание программы.

о, так пойдет - спасиб.
насчет понимания программы - может быть, как использовать... данные же макросы в хедер можно засунуть, куда-нить подальше, и написать чтоб не трогали...
для конфигурации сборки зато - интересная штука.

а насчет вывода сообщений при компиляции? у меня в gcc #error выполняется, а #warning почему-то нет...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.