Hey Leute,
bin derzeit dabei mein erstes Projekt zu realisieren. Hab dazu auch schon eingies im Forum gelesen und mich im Internet informiert.
meine derzeit verwendeten Bauteile:
- IR Sender LED - Osram LD274
- IR Empfänger - TSOP 4836
- LED
- einige Widerstände
Vorerst gehts bei dem Projekt nur um eine einfach Lichtschranke, die allerdings relativ wenig Strom brauchen soll. Deshalb wird die Sende LED nur alle paar ms gepulst. (weitere Sparmaßnahmen wie anderer Arduino, Powersafemodes etc. folgt später).
hier der aktuelle Code dazu:
int ledPin = 10;
int sendPin = 11;
int receivePin = 2;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(ledPin, OUTPUT);
pinMode(sendPin, OUTPUT);
pinMode(receivePin, INPUT);
// set up Timer 2
TCCR2A = _BV(WGM21); // CTC, toggle OC2A on Compare Match
TCCR2B = _BV (CS20); // No prescaler
OCR2A = 221; // compare A register value (222 * clock speed)
// = 13.875 nS , so frequency is 1 / (2 * 13.875) = 36036Hz
}
// the loop routine runs over and over again forever:
void loop() {
noInterrupts();
TCCR2A |= _BV (COM1A0);
delayMicroseconds(800);
if(digitalRead(receivePin) == HIGH)
{
// Startup();
digitalWrite(ledPin, HIGH);
}
else
{
// delay(3000);
digitalWrite(ledPin, LOW);
TCCR2A &= ~_BV (COM1A0);
delay(57);
}
}
so jetzt zu meinen Problemen:
-
Ist die Delayzeit nach dem deaktiveren des Timers (momentan 57ms) kleiner als 57ms funktioniert die Lichtschranke perfekt. wenn ich die delayzeit von (57ms) allerdings auf irgend einen höheren Wert ändere funktioniert die Lichtschranke nicht mehr wenn ich eine Unterbrechung zwischen LED und Receiver mache (es treffen sicher auch keine reflexionen auf den Empfänger!). Zieh ich allerdings den Pin von der Sendeled ab leuchtet die andere LED wie gewollt.
-> warum ist das so? (Abschirmen und Pin ausstecken sollte doch das selbe sein?) -
wird die erste Zeile von der loopschleife gelöscht (noInterrupts()
funktioniert das ganze auch nicht mehr, selbst wenn die delayzeit <57ms ist. Zieh ich allerdings wieder den Pin von der Sendeled, geht sofort die andere an.
-> läuft mein Timer eigentlich weiter wenn ich noInterrupts() mache?!
-> wozu benötige ich diese Zeile in meinem Programm?