Raw pin mapping (Verständnis)

vor 45 weeks 4 days von Freeeduino

Hallo,

ich habe mich mal an das Auslesen und die Programmierung einer Infrarotfernbedienung gesetzt und versucht das Programm von adafruit zu verstehen (siehe unten).

/* Raw IR decoder sketch!
 
 This sketch/program uses the Arduno and a PNA4602 to 
 decode IR received. This can be used to make a IR receiver
 (by looking for a particular code)
 or transmitter (by pulsing an IR LED at ~38KHz for the
 durations detected 
 
 Code is public domain, check out <a href="http://www.ladyada.net" title="www.ladyada.net" rel="nofollow"><a href="http://www.ladyada.net">www.ladyada.net</a></a> and adafruit.com
 for more tutorials! 
 */
 
// We need to use the 'raw' pin reading methods
// because timing is very important here and the digitalRead()
// procedure is slower!
//uint8_t IRpin = 2;
// Digital pin #2 is the same as Pin D2 see
// <a href="http://arduino.cc/en/Hacking/PinMapping168" title="http://arduino.cc/en/Hacking/PinMapping168" rel="nofollow">http://arduino.cc/en/Hacking/PinMapping168</a> for the 'raw' pin mapping
#define IRpin_PIN      PIND
#define IRpin          2
 
// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000
 
// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 20 
 
// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2];  // pair is high and low pulse 
uint8_t currentpulse = ; // index for pulses we're storing
 
void setup(void) {
  Serial.begin(9600);
  Serial.println("Ready to decode IR!");
}
 
void loop(void) {
  uint16_t highpulse, lowpulse;  // temporary storage timing
  highpulse = lowpulse = ; // start out with no pulse length
 
 
//  while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {
     // pin is still HIGH
 
     // count off another few microseconds
     highpulse++;
     delayMicroseconds(RESOLUTION);
 
     // If the pulse is too long, we 'timed out' - either nothing
     // was received or the code is finished, so print what
     // we've grabbed so far, and then reset
     if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
       printpulses();
       currentpulse=;
       return;
     }
  }
  // we didn't time out so lets stash the reading
  pulses[currentpulse][] = highpulse;
 
  // same as above
  while (! (IRpin_PIN & _BV(IRpin))) {
     // pin is still LOW
     lowpulse++;
     delayMicroseconds(RESOLUTION);
     if ((lowpulse >= MAXPULSE)  && (currentpulse != 0)) {
       printpulses();
       currentpulse=;
       return;
     }
  }
  pulses[currentpulse][1] = lowpulse;
 
  // we read one high-low pulse successfully, continue!
  currentpulse++;
}
 
void printpulses(void) {
  Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
  for (uint8_t i = ; i < currentpulse; i++) {
    Serial.print(pulses[i][] * RESOLUTION, DEC);
    Serial.print(" usec, ");
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
    Serial.println(" usec");
  }
 
  // print it in a 'array' format
  Serial.println("int IRsignal[] = {");
  Serial.println("// ON, OFF ");
  for (uint8_t i = ; i < currentpulse-1; i++) {
    //Serial.print("\t"); // tab
    Serial.print("pulseIR(");
    Serial.print(pulses[i][1] * RESOLUTION , DEC);
    Serial.print(");");
    Serial.println("");
    //Serial.print("\t");
    Serial.print("delayMicroseconds(");
    Serial.print(pulses[i+1][] * RESOLUTION , DEC);
    Serial.println(");");
 
  }
  //Serial.print("\t"); // tab
  Serial.print("pulseIR(");
  Serial.print(pulses[currentpulse-1][1] * RESOLUTION, DEC);
  Serial.print(");");
 
}

Da allerdings die Methoden von digital.Read() zu langsam sind um die Impulse lesen zu können wird ja hier der Pin als Bedingung einer while Schleife direkt ausgelesen mit den Befehlen

Quote:
while (IRpin_PIN & (1 << IRpin))
und
Quote:
while (! (IRpin_PIN & _BV(IRpin)))

nur verstehe ich nicht so ganz, wie die beiden Befehle zustande kommen, da der erste ja nur überprüft ob der bin HIGH ist und der zweite Befehl, ob der Pin LOW ist , die sich aber beide von der Syntax her komplett unterscheiden. habe aber auch keine Raw-Befehle im netz gefunden...

wäre nett wenn ihr mir das erklären könntet ...

Ähnliche Posts

2 Antworten auf “Raw pin mapping (Verständnis)”


Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
  1. uwe sagt:

    "#define IRpin_PIN PIND " ersetzt "IRpin_PIN" durch "PIND".
    und "#define IRpin 2" ersetzt danach "IRpin" mit "2";
    Dadurch wird aus
    while (IRpin_PIN & (1 << IRpin))
    das:
    while (PIND & (1 << 2))
    und
    while (! (PIND & _BV(2)))

    PIND ein schlüsselwort des Compilers und ist der Wert des Input Ports D

    http://playground.arduino.cc/Learning/PortManipulation
    und http://playground.arduino.cc/Code/BitMath

    _BV(x) ist ein Makro und shiftet eine 1 x Stellen nach links. also das gleiche wie "(1 << 2)"

    http://urbanhonking.com/ideasfordozens/2009/05/18/an_tour_of_the_arduino...

    Ja, man kann einiges Schierige noch undurchaubarer machen. Das ist böse.

    Grüße Uwe

    Login or register to post comments

  1. Freeeduino sagt:

    vielen dank ;)

    Habe es erstmal so in mein eigenes Programm übernommen aber jetzt verstehe ich es wenigstens auch!

    Noch eine kurze Frage zum Schluss,
    wenn man eine Library schreibt in der einige Funktionen von dem eigentlichen Sketch abgespeichert sind, dann wird das Programm mit dieser eingebundenen Library doch nicht kleiner oder ?

    Login or register to post comments