Я работаю в C на устройстве Arduino, где контакты помечены по-разному. Я использую PLAIN C, а не «язык» Arduino.
Каждый вывод определяется своим портом (например, PORTB
) и выводом (битом) в порту (например, PB0
).
Я хотел бы кратко назвать контакты, чтобы я мог создавать макросы или функции, похожие на то, что использует Arduino:
pin_direction(D2, 1); // D2 as output
set_pin(D2, 0); // write zero to D2
pin_direction(D3, 0); // D3 as input
enable_pullup(D3, 1); // enable D3 pullup
Вместо этого (атм) я должен использовать что-то уродливое вроде этого:
#define D0 0
#define D1 1
#define D2 2
#define D3 3
...
#define D10 2
#define D11 3
#define PORT_D0 PORTD
#define PORT_D1 PORTD
#define PORT_D2 PORTD
#define PORT_D3 PORTD
...
#define PORT_D10 PORTB
#define PORT_D11 PORTB
// the same for PIN_xx and DDR_xx
И тогда я могу использовать макросы для выполнения работы:
#define sbi(port, bit) (port) |= _BV(bit)
#define cbi(port, bit) (port) &= ~ _BV(bit)
sbi(DDR_D2, D2); // D2 to output
cbi(PORT_D2, D2); // D2 to output
sbi(DDR_D3, D3); // D3 as input
sbi(PORT_D3, D3); // D3 pullup enable
Теперь это работает, но это очень грязно. Любая идея, как - без чудовищных накладных расходов на что-то вроде огромного switch
- сделать это лучше - больше похоже на мой первый пример? Как-то перечислить все биты, а затем разрешить правильный регистр на лету?
Я использую avr-gcc с avr-libc.