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
while (IRpin_PIN & (1 << IRpin))
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 ...
vor 45 weeks 4 days
"#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