Mein Freund und ich möchten eine universelle lernende Fernbedienung wie diese für Lernzwecke entwerfen . Grundsätzlich wollen wir Infrarot-Impulse speichern und wiedergeben.
Wir wollen 36kHz-, 38kHz- und 40kHz-Signale erkennen. Ein 40kHz - Signal wird über einen Zeitraum von 25 hat s.
Wir möchten einen 8-Bit-PIC-Mikrocontroller verwenden, für den wir PIC16F616 ausgewählt haben, der mit einem 20-MHz-Hochgeschwindigkeits-Quarzoszillator betrieben wird. Wir haben zwei Möglichkeiten:
- Verwenden Sie das
Interrupt On Change
Modul. - Verwenden Sie den Erfassungsmodus des CCP-Moduls.
Die erste Option lautet wie folgt:
Angenommen , ein Register gesetzt als: unsigned char _10_us = 0;
. Dieses Register enthält die Uhrzeit. TMR2 Modul mit Periodenregister gesetzt ist ein Interrupt alle 10 bis schaffen sec. Wenn ein Interrupt auftritt, erhöht er das Register und verlässt es. Dies ergibt eine maximale Zeit von 2,55 ms. Wenn mehr Zeitmessung benötigt wird, können zusätzliche Register definiert und nach Bedarf erhöht werden._10_us
_1_ms
Jedes Mal, wenn eine Unterbrechung durch eine Änderung (von hoch nach niedrig oder von niedrig nach hoch) erzeugt wird, notiert das Programm die aktuelle Zeit, dh den Wert des _10_us
Registers. Nach einer Weile, wenn der nächste Interrupt erzeugt wird, subtrahiert das Programm den gespeicherten Wert vom _10_us
Register und somit die zwischenzeitlich abgelaufene Zeit mit einer Einheit von 10 .
Diese Option lässt mich meinen Kopf kratzen; TMR2-Interrupt tritt etwa alle 50 Anweisungen auf. Für die Interrupt-Behandlung werden ca. 20 Anweisungen benötigt. Ich habe noch 30 Anweisungen, um den Zeitraum zu berechnen und in einem Array zu speichern. Funktioniert diese Methode?
Die zweite Option lautet wie folgt:
Richten Sie den Erfassungsmodus des CCP-Moduls so ein, dass ein Interrupt generiert wird, wenn ein Ereignis (High-to-Low) am CCP1-Pin auftritt. In der Interruptroutine wird ein Flag gesetzt, damit eine Task im Programm (falls erforderlich) den Wert von CCPR1H (wahrscheinlich nicht erforderlich) und CCPR1L berechnen und speichern kann. Dann werden wir die Konfiguration des Erfassungsmodus so ändern, dass er den Interrupt auslöst, wenn eine Low-to-High-Flanke auftritt. Und dann wird es auf das nächste Ereignis warten. Ich kann die Leistung dieser Methode nicht einschätzen, da ich sie nie verwendet habe.
Andere Option?
Wir können einen Infrarot-Demodulator-IC wie die TSOP17xx- Serie verwenden. Das würde unser Problem komplett lösen. Es kommen jedoch einige Fragen in den Sinn.
Unsere Anforderung an die Lesedistanz ist nicht viel. 1 Meter. Wenn wir einen TSOP1738 auswählen, der in 38 kHz arbeiten soll, wie gut funktioniert dies mit 36 kHz- und 40 kHz-Signalen?
Seite 4 des Datenblattes der TSOP17xx-Serie zeigt das Diagramm "Frequenzabhängigkeit der Empfindlichkeit". Soweit wir verstanden haben;
- 40 kHz, dh 1,053 von 38 kHz, ergeben eine relative Empfindlichkeit von 0,6.
- 36 kHz, dh ~ 0,95 von 38 kHz, ergeben eine relative Empfindlichkeit von ~ 0,65.
Was bedeuten diese Werte? Können wir ein TSOP1738 verwenden und in Ordnung sein?