Автоматизированное привязывание портов при программировании на СИ (Mega AVR, собственно, и не только)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ДМ 05 января 2005 г. 22:52

Автоматизированное привязывание портов при программировании на СИ (Mega AVR, собственно, и не только)

Многим знакома процедура перебивки заголовочного файла, когда программа, на пример делалась под Мегу8, а из-за нехватки памяти пришлось поставить Мегу16. В этом случае ICP, превращается из PB0 в PD6, и так далее. Вроде бы пустяк. За полчаса, час, все перебивается, но мне пришлось как-то потратить несколько часов, чтобы выправить все. Самая частая западня – это, когда исправил PORTX, но забыл исправить DDRX, или PINX. Если не обращаться к портам, как к битовых переменным, то все просто, но как же без этого!

И так, если взять пример из дата шита:

__no_init volatile __io union
{
unsigned char Bus;
struct
{
unsigned char Bit0:1;
unsigned char Bit1:1;
unsigned char Bit2:1;
unsigned char Bit3:1;
unsigned char Bit4:1;
unsigned char Bit5:1;
unsigned char Bit6:1;
unsigned char Bit7:1;
} Bus_bits;
} @ 0x18; // PortB

то можно сделать так
#define Red_LED Bus_bits. Bit0
#define Green_LED Bus_bits. Bit1
...
Red_LED = 0;
Green_LED = 1;

или даже так:
#define Red_LED_bit Bit0
#define Green_LED_bit Bit1
#define Red_LED Bus_bits. Red_LED_bit
#define Green_LED Bus_bits. Green_LED_bit

но если попытаться сделать еще:
#define DDR_Bus DDRB
DDR_Bus = 1<< Red_LED_bit | 1<< Green_LED_bit
Разумеется, выдается ошибка.


Пробовал так:

#define bit_def(b) Bit##b
#define Red_LED_bit 0
#define Red_LED Bus_bits.bit_def(Red_LED_bit)

Но компилятор меня не понял, так, как я того хотел, и выдал ошибку, что нет такого поля “ BitRed_LED_bit”. Может быть, как-то можно объяснить компилятору, что надо приклеивать не само определение «Red_LED_bit», а его значение (0). Или, кто-нибудь, может быть, знает еще другие методы, как одним определением назначить и битовую переменную, и число для маски?! Компилятор IAR v2.28

Спасибо!

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru