недавно для AVR сделал так:
Код
//это просто для красоты. в макросы нужно передавать просто букву A, B, C, D...
#define PORT_A A
#define PORT_B B
#define PORT_C C
#define PORT_D D
//we need it ))
#define PARAMCAT(a, b) a##b
//set pin direction as output
#define GPIO_SET_DIR_OUT(port, pin) \
PARAMCAT(DDR, port) |= (1 << (pin))
//for output pins: set pin to logic high
//for input pins: turn on internal pull-up resistor
#define GPIO_SET_HIGH(port, pin) \
PARAMCAT(PORT, port) |= (1 << (pin))
Ну, дело ясное, что где-то там определены DDRA, DDRB... PORTA, PORTB, PORTC... Я только подставляю буковку в параметр, склеиваю строку и получаю нужное имя регистра. И никакого кода в рантайме. Может быть Вы сможете поступить таким-же образом и у себя...одним макросом любой таймер брать будете)
The truth is out there...