Hi xAmp,

Zitat Zitat von xAmp
... Schwierig .. bei den Controller typischen Sachen wie (PINA & 0x06) | ((PIND>>2)&0x01); oder asm volatile etc. ...
Stimmt - ich raff das heute, nach vielen Monaten C(äh)-Programmiererei, noch nicht wirklich. Das RN-Tutorial zum AvR-Gcc zeigt leider etwas wenig zu Bitmanipulationen, die sind hier besser erklärt:
http://www.mikrocontroller.net/articles/Bitmanipulation

Volatile könnte hier einigermassen verständlich werden:
http://www.mikrocontroller.net/artic..._und_Variablen

Na ja und zu PORTD oder PINC: die IO-Pinne bei den Controllern sind gruppenweise zu 8 Stück zusammengefasst - es gibt (aber) nicht immer alle 8 Pinne - manche controller haben nur eine Untermenge (wenn halt zu wenig Beine da sind *ggg*). Die Ports sind mit Großbuchstaben bezeichnet: PORTA, PORTB, die Pinne heißen (bei den meisten Controllern) dann PC2 - das ist der DRITTE Pin - weil in der IT fast immer von 0 weg gezählt wird.
DDRB ist das DatenRichtungsByte - oder -bit. Jeder Portpin hat ein separates Datenrichtungsbit - ist das 0, so funktioniert der Pin als Eingang, ist das pin-eigene DDRB aber 1, so funktioniert der Pin als Ausgang. Portpinns können also als Ausgang oder Eingang konfiguriert werden (hier ein Beispiel aus einem aktuellen Code von mir:
Code:
// Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
//   A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
  DDRB  = 0b00011111;   // siehe aktuell oben oder Fortschritt/R2D2
  PORTB = 0b00100000;   //    und Port/Pull Ups (1)  aktivieren
                          
  DDRC  = 0b01110000;   // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
  PORTC = 0b00000111;   // Beachte für ADC: PC3 ist ADC-Eingang ##>> OHNE Pullup !!
Nun kann man aber eben auch die Bits nicht nur "im Paket" setzen wie oben in meinem Codebeispiel, sondern man kann sie auch einzeln manipulieren:
PORTB |= (1<<PB5) macht etwa dasselbe wie die einzelne "1" im obigen Beispiel - wenn der Rest des Ports Null ist. Vorteil der Geschichte: es wird nur der eine Portpin verändert, der Rest der Portpinne bleibt wie er vorher war !

Einzulesende Pinne werden aber nicht als PORTB = (PB4) gelesen, sondern etwa so: if (PINB &(1<<PB4)) {}

Sieht anfangs chaotisch aus - leider. Später aber (manchmal) auch noch.

Viel Erfolg. Hoffentlich hilft Dir dies