реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> WinAvr, вопрос по препроцессору
xelos
сообщение Jun 23 2006, 16:26
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 33
Регистрация: 18-04-05
Из: Paris
Пользователь №: 4 271



вобщем у меня стажер тут, попросил написать ему библиотеку для работы с уартом на 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 почему-то не распознается

Сообщение отредактировал xelos - Jun 23 2006, 16:28
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 23 2006, 16:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(xelos @ Jun 24 2006, 00:26) *
вобщем у меня стажер тут, попросил написать ему библиотеку для работы с уартом на ATMega128.
Посмотрите на http://electronix.ru/forum/index.php?showt...=0&#entry122319 . Там есть мною написанный драйвер USART c командами препроцессора, мож подойдет Вам


--------------------
Go to the top of the page
 
+Quote Post
vet
сообщение Jun 23 2006, 16:46
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



А что, собственно, мешает записать это одной командой?
Код
   #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


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
xelos
сообщение Jun 23 2006, 20:37
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 33
Регистрация: 18-04-05
Из: Paris
Пользователь №: 4 271



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

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

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

Сообщение отредактировал xelos - Jun 23 2006, 20:40
Go to the top of the page
 
+Quote Post
vet
сообщение Jun 23 2006, 21:05
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Скажем, так:
Код
//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;

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


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
xelos
сообщение Jun 23 2006, 21:50
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 33
Регистрация: 18-04-05
Из: Paris
Пользователь №: 4 271



Цитата(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 почему-то нет...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01396 секунд с 7
ELECTRONIX ©2004-2016