Go Down

Topic: Kann mir jemand den Codeschnipsel erklären (Read 149 times) previous topic - next topic

Mutscheid1

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?

Quote
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

Doc_Arduino

#1
Mar 24, 2016, 06:25 pm Last Edit: Mar 24, 2016, 07:40 pm by Doc_Arduino
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  http://www.arduino.cc/en/Reference/HomePage

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.

Code: [Select]
/*
 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();
}      


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

Quote
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.

Doc_Arduino

Hallo,

ja okay, da gibts einen feinen Unterschied. Habs im Code geändert. Danke für den Hinweis.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy