ATtiny2313RCLichtsteuerungStandard
2013-09-02
|
Timing für das blinken der Lichter. Mehr ...
#include "blink_timer.h"
Funktionen | |
void | init_blink_timer () |
ISR (TIMER1_OVF_vect) | |
Interrupt Service Routine für Timer 1 (Blink Timer) Überlauf. Mehr ... | |
Timing für das blinken der Lichter.
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.
Der 16 Bit Timer wird zum erzeugen der Blinksignale benutzt. Bei einer CPU Frequenz von 1 MHz und ohne Vorteiler benötigt der Timer 0,065 s ((1/f_cpu) * 2^16) bis zum Überlauf. Beim Timer Überlauf wird ein Interrupt ausgelöst und die Variable blktm_oflow um 1 erhöht. Diese Variable bestimmt somit die verstrichene Zeit (Anzahl Timerüberläufe * 0.065 s). Daraus wird dann der aktuelle Status innerhalb der Blinkfolge abgeleitet und die Lichter entsprechend ein oder ausgeschalten.
Durch das zählen der Timerüberläufe ist die kürzest mögliche Zeitperiode = 0,065 s. Dies bedeutet, eine Pause oder die Zeit vom Ein- bis zum Ausschalten (blitzen) eines Ausganges kann nicht kürzer als 0,065 s sein. Für eine originalgetreue Darstellung eines Positionsblitzes sollte dies aber ausreichend kurz sein.
Erklärung zum erstellen eigener Blinkfolgen:
Am besten zeichnet man sich die gewünschte Blinkfolge auf ein Blatt Papier, beginnend mit der Pause nach Ende der vorherigen Blinkfolge. Die Folge unterteilt man dann in 0,065 s lange Abschnitte. Je mehr Abschnitte, desto länger dauert die Folge (desto länger sind die Lichter eingeschalten). Die Abschnitte werden durchnummeriert und anhand der vorher gezeichneten Folge sieht man, ob beim entsprechenden Abschnitt (= Zustand) ein Licht ein oder auszuschalten ist.
Nun braucht man nur mehr bei den case Anweisungen in der ISR die Nummer des Abschnitts und den Befehl zum schalten des Lichtes eintragen. Beim Ausschalten des letzten Lichtes (letzter Zustand = nullter Zustand) noch darauf achten, die Variable blktm_oflow = 0 zu setzen. Beim nächsten Timerüberlauf sind dann wieder 0,065 Sekunden vergangen, wir befinden uns im Zustand 1 und die Blinkfolge beginnt von vorne. Zur Verdeutlichung ein Bild meiner Blinkfolge:
void init_blink_timer | ( | ) |
Überlauf Interrupt für Timer 1 (Blink Timer) einschalten
ISR | ( | TIMER1_OVF_vect | ) |
Interrupt Service Routine für Timer 1 (Blink Timer) Überlauf.
Dieser Interrupt wird bei jedem Überlauf von Timer 1 (Blink Timer) aufgerufen. Innerhalb der Routine wird die Variable blktm_oflow um eins erhöht. Durch die switch Anweisung wird der aktuelle Wert von blktm_oflow überprüft und entsprechend die Lichter ein oder ausgeschalten. Dadurch entsteht die Blinksequenz.