
Zitat von
Arkon
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
Lesezeichen