Der Einstieg ist immer schwierig. Also machen wir mal weiter.

PA3 ist das dritte Bit von rechts in den Portregistern mit der Wertigkeit 2^3 oder 8 bzw. binär 0b00001000. Anhand der binären schreibweise (erkennbar an der vorangestellten 0b) versuche ich mal zu erklären, wie man in einem Byte genau dieses Bit3 löschen kann. Dazu verwenden wir die bitweise Und-Verknüpfung & (UMSCHALT und 6). Diese setzt im Ergebniss nur dann das Bit, wenn in beiden Operanten dieses Bit auch gesetzt war. Operanten sind in diesem Fall der Inhalt des Ausgaberegisters und ein Bitmuster, gewöhnlich nennt man es Maske, das nur dieses eine Bit beeinflusst. Als Programmcode sieht das dann so aus:

PORTA = PORTA & 0b11110111

Alle im Ausgangsregister schon gesetzten Bits bleiben gesetzt außer Bit3 (Zählung beginnt rechts mit 0!).

Um beide Pins "in einem Rutsch" zu ändern kann man die Masken auch kombinieren:

DDRA |= 0b00001001; // PA0 und PA3 als Ausgang betreiben
PORTA |= 1; // High an PA0 ausgeben
PORTA &= ~8 // Low an PA3 ausgeben

- Das Datenrichtungsregister muss man natürlich nur ändern wenn sich auch was geändert hat.
- Die Tilde ~ (ALTGR und +) bewirkt, dass alle Bits im nachfolgenden Wert invertiert werden, aus 1 wird 0, aus 0 wird 1 und aus der Maske 0b00001000 (oder 8) wird 0b11110111 ;)
- Die Kommentare sind für Anfänger, bei einem echten Programm würde ich dich dafür erschlagen! Besser wäre später als Fortgeschrittener z.B.:

// Pins für IR-LEDs auf Ausgang setzen
// Anoden mit 5V versorgen
// Kathoden an 36kHz

oder so ähnlich... ;)

Um das Thema abzurunden vielleicht noch ein paar Zeilen zur Erzeugung der Maske. Die binäre Darstellung ist recht unübersichtlich und fehleranfällig. Deshalb verwendet man häufig die Bitschiebereien mit dem << (oder eher selten >>) -Operator dazu. Erster Operant ist das Bitmuster welches rechtsbündig in die Maske geschrieben wird. Der zweite Operand gibt an, wie oft dieses Muster, entsprechend dem Operator, geschoben wird. Mit

Maske = 1 << 0

schreibt man in Bit 0 der Maske eine 1 und schiebt diese 0 mal nach links, Maske sieht dann so aus: 0b00000001. Ein paar weitere Beispiele:

Maske = 1 << 3 ergibt 0b00001000
Maske = ~(1<<3) ergibt 0b11110111
Maske = (1<<3) | (1<<0) entspricht 0b00001000 | 0b00000001 und ergibt 0b00001001

Wenn man nun noch weiß, wie #define funktioniert und dass in io.h die Portpins PA0 bis PA7 als 0 bis 7 definiert werden, kann man schnell recht übersichtliche Masken erzeugen:

DDRA |= (1<<PA3) | (1<<PA0);
PORTA |= (1<<PA0);
PORTB &= ~(1<<PA3);

So, Ende für Heute ;)

Viel Spass beim Ausprobieren.

mic