Ok, hier mal eine Version mit ein paar Kommentaren.
Noch zwei Bemerkungen:
- Das klappt so nur mit den Ports A bis D auf dem ATmega16. Für andere
Controller muss ggf. der Offset 0x30 bei der pinBaseAddr geändert
werden. Die anderen Ports, die z.B. der ATmega128 hat können nicht so
einfach verwendet werden.
- Das ganze ergibt konstante Ausdrücke, die zur Compile-Zeit
ausgewertet werden, so dass es kompakten und schnellen Code ergibt. Das
stimmt aber nicht mehr, sobald die Konstanten in Variablen abgelegt
werden, mit denen dann gearbeitet wird. Die werden dann erst zur
Laufzeit ausgewertet, was weniger effizient ist.
Beispiel:
setPort( PA_BTN1, 1 ); // schnell+kompakt, wird zu einem SBI
unsigned char x;
x = PA_BTN1;
setPort( x, 1 ); // langsamer+umfangreicher, wird erst zur Laufzeit
ausgewertet
Grüße,
Hanno