ATtiny2313RCLichtsteuerungStandard
2013-09-02
|
Erfassung der Impulslänge des Empfängersignals mit dem Timer0. Mehr ...
#include "input_timer.h"
Funktionen | |
void | init_input_timer () |
Timer0 zur Messung des Empfängersignals einstellen. Mehr ... | |
ISR (INT0_vect) | |
Interrupt Service Routine für externen Interrupt INT0. Mehr ... | |
Erfassung der Impulslänge des Empfängersignals mit dem Timer0.
Copyright 2013, 2014 V. Pippan (webma) ster @vpip pan. at
This file is part of ATtiny2313 RC Lichtsteuerung Standard.
ATtiny2313 RC Lichtsteuerung Standard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or any later version.
ATtiny2313 RC Lichtsteuerung Standard is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ATtiny2313 RC Lichtsteuerung Standard. If not, see
www.gnu.org/licenses.
Das RC Eingangssignal hat eine Periodendauer von ca. 20ms -> f = 50Hz. Die Länge des positiven Pulses schwankt zwischen minimal 0,75ms und maximal 2,25ms, die Standard Länge liegt zwischen minimal 1ms und maximal 2ms, wobei die Neutralstellung bei 1,5ms liegt.
Der uC läuft mit 1MHz = Periodendauer von 1us. Mit f_CPU / 64 erhält man eine Periodendauer von 64us für den Timer Takt. D.h. eine Erhöhung des Timer Zählerstandes um 1 bedeutet eine Verlängerung des RC-Empfänger Pulses um 64us. Der 8bit Timer zählt bis 2^8 (256) -> Eine Periodendauer von 64us * 256 ergibt 16,38ms bis der Timerüberlauf erreicht wird.
Mit dieser Timergeschwindigkeit kann man ohne Timerüberlauf bis zur max. Pulsdauer des RC-Empfängersignals (2,25ms) zählen. Bei minimaler Pulsdauer ergibt sich damit ein Zählerstand von 12, bei max. Pulsdauer ein Zählerstand von 35 (bei Standard Länge der Pulse min. 16 und max. 31), die Neutralstellung liegt bei einem Zählerstand von 23. Das Eingangssignal kann dabei auf 64us genau, dies entspricht 23 (15 bei Standard Pulslängen) Schritten, aufgelöst werden. Was für diesen Zweck hier genau genug sein sollte. Anmerkung: Durch Verwendung des 16bit Timers kann das RC Eingangssignal wesentlich feiner aufgelöst werden, was für eine einfache Schaltanwendung wie hier aber nicht notwendig ist.
RC-Empfängersignal Schaltzeitpunkt (ms) / (64us * 10^-3) = Zählerstand bei dem geschalten wird
Der Watchdog Timer wird nach jedem korrekt erkanntem Eingangsimpuls (negative Flanke) zurückgesetzt. Wenn nach einer negativen Flanke kein weiterer Eingangsimpuls (keine positive Flanke) mehr kommt, dann verbleibt das Programm einfach so lange im aktuellen Zustand, bis der Watchdog anspricht und das Programm in den Standard Zustand (gesamte Beleuchtung aus) versetzt.
Der Fall, daß das Eingangssignal nach der positiven Flanke unterbrochen wird (z.B.: durch abziehen des Steckers, ausschalten der Empfängerstromversorgung) spielt hier keine Rolle. Sobald am Optokoppler nichts mehr anliegt, zieht der Widerstand R16 den Pin auf Masse, was eine fallende Flanke erzeugt. Somit entsteht auch in diesem Fall ein korrekt erkannter (wenn auch zu kurzer) Eingangsimpuls.
void init_input_timer | ( | ) |
Timer0 zur Messung des Empfängersignals einstellen.
ISR | ( | INT0_vect | ) |
Interrupt Service Routine für externen Interrupt INT0.
Diese ISR dient der Erfassung der Pulslänge vom RC-Empfängersignal. Sie wird bei jeder Flanke des Eingangssignals aufgerufen. Das umschalten auf welche Flanke reagiert werden soll erfolgt dabei innerhalb dieser Routine.
Nach einer positiven Flanke (Eingang ist HIGH):
Nach einer negativen Flanke (Eingang ist LOW):