Zitat Zitat von Arkon Beitrag anzeigen
Also wird unterschieden, ob PORTD oder PORTB beschrieben werden soll und dazu passend aus dem #define das PD5 bzw PB5 ausgewählt?
Nein, sieh dir Mal den Code hier genauer an:

Code:
#define     FWD        (1 << PB5) /* (1 << PD5) */
#define     RWD        (1 << PB4) /* (1 << PD4) */
#define     BREAK      0x00
#define     FREE       (1 << PB4) | (1 << PB5) /* (1 << PD4) | (1 << PD5)*/

void MotorDir(unsigned char left_dir, unsigned char right_dir) {
PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir;
PORTB = (PORTB &~ ((1 << PB4) | (1 << PB5))) | right_dir;
} MotorDir(FWD,FWD);
PB5 wird irgendwo in den Untiefen der avr-libc als 5 definiert, ebenso PD5. Warum? Weil es eben das Bit 5 im entsprechenden Register ist. Der Trick besteht einfach darin, dass die Pinbelegung für Links/Rechts symmetrisch gemacht wurde, damit sind alle Konstanten übertragbar. Aus FWD wird also (1 << 5)

MotorDir setzt jetzt auf beiden Seiten beide Richtungspins auf 0 und "verodert" da dann dein FWD rein. Die Funktion überschreibt also IMMER den Status beider Seiten, MotorDir(FWD, FWD) tut nichts anderes als in den Register PORTD und PORTB jeweils Bit 5 zu setzen. Der Konstanten ist es vollkommen egal, wo sie eingesetzt wird, niemand wählt da irgendwas aus ...

mfG
Markus