Pfad: Home => AVR-Übersicht => Anwendungen => Langzeit-Timer   This page in english: Flag EN
Langzeit-Timer mit tn25 Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Langzeit-Timer
Logo

Langzeit-Timer mit einem ATtiny13

Du bist Raucher und möchtest Deinen Rauchkonsum kontrolliert reduzieren? Hier ist die Anwendung dazu für Dich. Stelle diesen Timer auf 30 Minuten und du kannst 32 Zigaretten täglich rauchen. Stelle ihn auf 60 Minuten ein und Du kannst 16 Zigaretten täglich rauchen (natürlich nur, wenn Du ausschließlich in den grünen Pausen rauchst.

Natürlich können das auch Nichtraucher benutzen. Zum Beispiel, um jede Stunde angezeigt zu kriegen, zu der man etwas Bestimmtes tun will. Da es etwas unbequem ist, zu jeder vollen Stunde wieder neu einen Wecker zu stellen, macht der hier diese Intervalle auch selbstständig. Nur einmal Jumper setzen und fertig.

Und das geht so:
  1. Zuerst wählt man mit drei Jumpern oder einem Mäuseklavier die Zeitbasis: ohne Jumper sind das 30 Minuten, mit Jumper 1 werden es 30 Minuten mehr, mit Jumper 2 60 Minuten mehr und mit Jumper 3 120 Minuten mehr.
  2. Mit dem Einschalten und bei jedem Neustart geht eine Duo-LED in rot an. Zuerst in voll, dann in der Helligkeit stetig abnehmend bis Null.
  3. Die letzten 5 Minuten des eingestellten Zeit-Intervalls nimmt die Duo-LED eine zunehmende grüne Farbe an.
  4. Dann schaltet die LED von voll grün auf voll rot, liest wieder die Jumper ein und bleibt dann für die eingestellte Zeit abnehmend auf rot. Das Intervall wiederholt sich, solange Strom auf der Schaltung ist.
Wer was mit Lautsprecher und justierbarem Zeitintervall braucht, ist mit diesem hier besser bedient, muss aber einen ATtiny25 besorgen oder schon haben.

1 Das Schaltbild des Timers

Schaltbild des Langtimers Das ist das schlichte Schaltbild des Timers. Hier gibt es das Schaltbild als LibreOffice-Graphikdatei. Er besteht im Grunde nur aus Die ganze Zeit- und Schaltmaschinerie steckt im ATtiny13.

LED-Vorwiderstand Die Höhe der Betriebsspannung bestimmt den Widerstandswert von R. Bei niedrigen Betriebsspannungen ist der Widerstand kritisch, bei höheren eher nicht. Die Berechnungsformeln für den Widerstand sind im LibreOffice-Calc-Sheet hier angegeben.

Der Spannungsabfall an der LED beträgt ca. 2,0 V. Es kommen weitere 0,22 V für die beiden Ausgangstreiber des ATtiny13 hinzu. Bei der Versorgug der Schaltung aus zwei 1,2V-Akkus bleibt da nicht viel übrig und der Widerstand ist sehr klein. Man kann aber auch drei Akkus nehmen oder sogar vier. Wer das stromsparende Ding aus Batterien betreiben will, ist mit 2 oder drei 1,5V-Batterien dabei. Man kann auch einen einzigen dicken Li-Akku verwenden oder das Ganze aus dem Programmiergerät oder einem Netzteil mit 3,3 oder 5,0 V versorgen.

Die LED nimmt nur bei 2,4 V-Auslegung den nachträglichen Umstieg auf die nächsthöhere Betriebsspannung krumm. Dann sollte man mit einem Jumper und einem weiteren Widerstand vorsorglich vorbauen.

2 Aufbau

Aufbau des Langtimers Alles zusammen passt auf eine klitzekleine Platine von z. B. 20*25 mm Größe. Wer das mit SMD-Bauteilen zusammenlötet, kann es sogar noch kleiner haben.

3 Die Software des Langzeit-Timers

Die Software für den ATtiny13 ist in Assembler geschrieben, den Quellcode gibt es im Assemblerformat hier und für den Internetbrowser im HTML-Format hier.

Wer die Einstellungen der Software ändern möchte, kann dies ab Zeile 64 des Quellcodes tun:

.equ clock = 1200000 ; Taktrate Default in Hz
.equ cTimeBase = 30 ; Zeitslot in Minuten
.equ cTimeGrn = 5 ; Zeit fuer Gruenphase in Minuten
.equ cPresc = 64 ; Vorteiler, kann 1, 8 oder 64 sein

Es ist darauf zu achten, dass cTimeBase immer größer als cTimeGreen eingestellt werden muss und dass bei langen Zeiträumen der Prescaler cPresc auf 64 steht, bei sehr kurzen kann eine entsprechend niedrigerer Prescaler-Wert eingestellt werden.

Nach dem Assemblieren kann der Maschinencode über die ISP6-Schnittstelle in das Flash-Memory des ATtiny13 gebrannt werden. Beim Programmieren darf der Jumper 1 nicht gesetzt sein, sonst hagelt es Fehlermeldungen von der Programmier-Software. Fuses des ATtiny13 müssen nicht geändert werden, der Controller läuft mit den werksseitig eingestellten 1,2 MHz.

3.1 Das Timing des Intervalltimers

Der Intervalltimer arbeitet mit dem 8-Bit-Timer TC0 des ATtiny13. Dieser wird als 8-Bit-Pulsweitenmodulator betrieben, um die Helligkeit der LED zwischen 1 und 256 regeln zu können.

Mit der Einstellung für die Konstante cPresc im Kopf des Quellcodes wird der Vorteiler von TC0 auf 64 (default), 8 oder 1 eingestellt. Das bewirkt folgendes Timing:

Takt (Hz)VorteilerPWM-StufenPWM-Takt (Hz)PWM-Zeit (ms)FarbstufenDurchlaufzeit (s)
1.200.0006425673,2413,652563,494
8585,941,7070,437
14.687,50,2130,054.5


Um längere Zeiten zu erzielen, wird der PWM-Ablauf mit einem 16-Bit-Wert wiederholt. Dieser Wert ist im Registerpaar rCntH:rCntL enthalten. Er wiederholt den PWM-Ablauf zwischen 1 und 65536 mal. Daraus ergeben sich folgende Mindestzeiten (einfacher PWM-Takt) und Maximalzeiten (bei 65.536 Wiederholungen):

VorteilerPWM-Takt (Hz)256 FarbstufenMaximalzeit
6473,243,494 s63,6 Std.
8585,940,437 s7,96 Std.
14.687,50,054.5 s59,53 Min.


Noch höhere Vorteiler-Werte sind nicht zu empfehlen, weil dies auch die PWM-Frequen ändert und daher die PWM-Schaltvorgänge sichtbar werden könnten. 256 ginge gerade noch, aber bei 1.024 blinkt es schon gehörig. Aber wer's mag, kann auch das machen.

Es folgen immer zwei unterschiedlich lange Durchläufe:
  1. Die Rotphase: sie ist am längsten und stellt die Dauer des Intervalls ein. Sie kann je nach Stellung der drei Jumper entweder 25, 55, 85, etc. Minuten lang sein (siehe Tabelle unten).
  2. Die Grünphase: sie ist immer gleich lang (default: 5 Minuten).
Die Dauer der Rot- bzw. Grünphase rechnet sich mit der Formel
rCntH:rCntL = t (min) * 60 (s/min) * Takt (1/s) / Vorteiler / 65.536

in die Größe des 16-Bit-Zählers um. Bei einer Grünphase von 5 Minuten ergibt sich rCntH:rCntL zu 85,8 oder aufgerundet zu 86. Für 25 Minuten ergibt sich das Fünffache, nämlich 429.

Im Default-Fall (unveränderte Software) sind folgende Werte eingestellt.

Takt
MHz
VorteilerJumperIntervall
Minuten
Rotphase
Minuten
PWM-Wechsel
Sekunden
16-Bit-TeilerGrünphasePWM-Wechsel
Sekunden
16-Bit-Teiler
1,264030255,942951,1786
1605512,9944
2908519,91.459
312011527,01.974
415014534,02.489
518017541,03.004
621020548,03.519
724023555,14.034


3.2 Wie die LED gesteuert wird

Die Steuerung der LED erfolgt in den beiden Phasen folgendermaßen:
  1. Rotphase: Die grüne Anode ist low, die rote LED wird eingeschaltet, indem die rote Anode auf Eins geht. Um den Phasenzähler einheitlich aufwärts laufen lassen zu können, wird die Einschaltdauer mit dem invertierten PWM-Signal bestimmt: zu Beginn des PWM-Zyklusses wird der Ausgang ausgeschaltet (low), mit Erreichen des Compare-Wertes eingeschaltet (high).
  2. Grünphase: Die rote Anode ist low, die grüne Anode wird zu Beginn der PWM-Phase eingeschaltet und beim Erreichen von Compare-Match ausgeschaltet.

3.3 Hauptprogramm-Init

In der Init-Phase des Programmes wird
  1. der Stapelzeiger eingerichtet (wird für Interrupts benötigt),
  2. die Richtungen aller Ports werden definiert (LED-Pins sind Ausgänge, Jumper-Anschlüsse sind Eingänge mit eingeschaltetem Pull-Up-Widerstand,
  3. der Timer TC0 wird in den Modus Fast-PWM gebracht, seine Overflow-Interrupts werden eingeschaltet,
  4. der Zähler rCntH:rCntL wird auf Eins gestellt, der PWM-Wert auf 255 und die T-Flagge auf Null. Das provoziert beim ersten Interrupt des Zählers, dass die erste Phase mit rot beginnt (T-Flagge) und die Dauer in rDelayH:rDelayL für rot ermittelt und eingestellt wird (unter Einlesen und Auswertung der Jumper),
  5. zuletzt wird noch der Schlafmodus auf Idle gesetzt und Interrupts eingeschaltet.

3.4 Interrupt-Service-Routine

Flussdiagramm der TC0-OVF-ISR Der gesamte Ablauf ist in der Interrupt-Service-Routine konzentriert. Das Fließdiagramm gibt es als LibreOffice-Graph-Datei hier.

Die Interrupt-Service-Routine des TCO-Überlaufs
  1. zählt den 16-Bit-Zähler abwärts,
  2. erreicht dieser Null, wird der nächste PWM-Wert eingestellt und in die Compare-Register geschrieben, dann wird der Zähler neu geladen,
  3. erreicht der PWM-Wert Null, dann wird je nach dem Inhalt der T-Flagge
Der Umfang der Rotphase ist größer, weil hier die drei Jumper ausgelesen und in Erhöhungen des Verzögerungswertes umgesetzt werden müssen. Bitte beachten, dass die Jumper-Stellungen nur zu Beginn dieser Rotphase gelesen und ausgewertet werden. Änderungen an den Jumpern zwischendurch werden ignoriert.

Die meisten Einträge im Flussdiagramm sind Assembler-Mnemonics, wie SBIW (Subtract Immediate Word) oder INC (Increase). In rot sind die Anzahl notwendiger Maschinentakte aller Instruktionen angegeben. Im Maximalfall (zum Ende einer Grünphase beim Umschalten auf Rot) werden 49 Takte benötigt. Diese Dauer bleibt weit unterhalb der Dauer, die ein ganzer PWM-Zyklus bei einem Vorteilerwert von 1 braucht (256 Takte). Es kann daher trotz der langen Dauer der ISR bei der Rot-Umschaltung kein Overflow-Interrupt verloren gehen.

Da der gesamte Ablauf in der ISR erfolgt und der Loop nur in den Schlafmodus führt, kann auf das Sichern und Wiederherstellen des Statusregisters in der ISR verzichtet werden.

Seitenfang


©2021 by http://www.avr-asm-tutorial.net