Hi,
es geht um Pin Change Interrupts. Auf folgender Seite habe ich eine Anleitungen, welche ich bis auf den unten stehenden Teil soweit verstanden habe: Pin Change Interrupt
Was genau passiert bei diesem Code Teil?
byte PVal; // Port value (8 Bits)
byte IRQ1ActVal; // Actual IRQ1 value
byte IRQ2ActVal; // Actual IRQ2 value
long unsigned IRQ1ActTime;
long unsigned IRQ2ActTime;
PVal = PINB; // Read port D (8 bit)
IRQ1ActVal = PVal & (1<<PCINT3); // Mask out all except IRQ1
IRQ1ActVal = IRQ1ActVal >> PCINT3; // shift to right for bit0 position
IRQ2ActVal = PVal & (1<<PCINT4); // Mask out all except IRQ2
IRQ2ActVal = IRQ2ActVal >> PCINT4; // shift to right for bit0 position
Hallo,
das sind alles Bit Operationen bzw. Bit Manipulationen. Man muß aufpassen das die Bitnamen der Register auch dazu passen was man machen möchte. Sonst kommt am Ende vielleicht nur Müll raus.
http://www.mikrocontroller.net/articles/Bitmanipulation
Bitwise Operators Arduino - Home
PINB ist wohl der neue Name für den Port. Gebräuchlich und älter ist PORTB. Für den gesamten Port.
Der Kommentar ist auch falsch. Es wird Port.B gelesen nicht Port.D
Port.B wird ausgelesen und in PVal gepeichert.
Dann soll das 3. Bit UND verknüft werden und das Ergebnis in IRQ1ActVal gespeichert.
Danach werden die Bits von IRQ1ActVal um 3 stellen nach rechts verschoben.
Also landet das 3. Bit an die Stelle von Bit.0
Die letzten beiden Zeilen machen das gleiche nur mit dem 4. Bit.
Um das zu sehen kannste dir das im seriellen Monitor formatiert ausgeben lassen.
/*
Doc_Arduino - german Arduino Forum
IDE 1.6.8
Arduino Mega2560
*/
byte PVal; // Port value (8 Bits)
byte IRQ1ActVal; // Actual IRQ1 value
byte IRQ2ActVal; // Actual IRQ2 value
void setup() {
Serial.begin(9600);
PVal = PINB; // Read port B (8 bit)
zeigeFormatiertesByte(PVal);
IRQ1ActVal = PVal & (1<<PCINT3); // Mask out all except IRQ1
zeigeFormatiertesByte(IRQ1ActVal);
IRQ1ActVal = IRQ1ActVal >> PCINT3; // shift to right for bit0 position
zeigeFormatiertesByte(IRQ1ActVal);
IRQ2ActVal = PVal & (1<<PCINT4); // Mask out all except IRQ2
zeigeFormatiertesByte(IRQ2ActVal);
IRQ2ActVal = IRQ2ActVal >> PCINT4; // shift to right for bit0 position
zeigeFormatiertesByte(IRQ2ActVal);
}
void loop() {
} // loop Ende
// ****** Funktionen ******* //
void zeigeFormatiertesByte (byte &value)
{
for (int i=7;i>=0;i--) Serial.print(bitRead(value,i)); // von jurs, formatiert Byte in Binärform
Serial.println();
}
PINB ist wohl der neue Name für den Port.
Gebräuchlich und älter ist PORTB. Für den gesamten Port.
??!?!
PINB ist das Eingangs-Register. PORTB ist das Ausgangs-Register.
Die Konstruktion "Wert & (1 << Bit") liefert zurück ob das entsprechende Bit gesetzt ist oder nicht. Nichts anderes macht auch das Arduino Makro bitRead(). Es liefert aber nicht 0 oder 1, sondern 1 oder irgendwas ungleich 0.
Hallo,
ja okay, da gibts einen feinen Unterschied. Habs im Code geändert. Danke für den Hinweis.