Hi xAmp,

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
Lesezeichen