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

Langzeit-Timer mit einem ATtiny25

Langzeit-Timer mit ATtiny25 Wer den Langzeit-Timer mit einem ATtiny13 hier noch mit einem zusätzlichen Piepser versehen möchte, um nicht nur auf die LED starren zu müssen, baut sich das hier: ebenfalls in einem winzigen 8-poligen IC, aber mit einem Lautsprecher ausgestattet, der programmierbare Töne (Höhe, Dauer) von sich gibt. Das kann aber ein Tiny13 nicht, weil er nur einen Timer hat. Daher muss hierfür ein ATtiny25 ran, der kann so was.

Hardware

Schaltbild des tn25-Langzeit-Timers Das Schaltbild gibt es hier im LibreOffice-Format als Draw-Datei. Die zugehörigen Berechnungen zu Schaltzeiten finden sich hier.

Die rot-grüne Duo-LED funktioniert genauso wie beim Tiny13-Langzeit-Timer. Die beiden OC0A- und OC0B-Ausgänge treiben die LED. Auch die Widerstandswahl ist exakt die gleiche wie dort.

Die Einstellung der Zeitdauer funktioniert jedoch nicht mit Jumpern sondern analog mit einem 10-Gang-Trimmer. Höhere Spannungen am ADC3-Eingang verlängern die Zeit bis zu der in der Software eingestellten maximalen Zeit.

Lautsprecher Der Lautsprecher wird über einen Elko gleichspannungsmäßig entkoppelt. Ich habe einen klitzekleinen Visaton K16-50 genommen, den ich seitlich an den ISP6-Stecker angeklebt habe. Es gehen aber auch alle anderen Lautsprecher, sie sollten nur etwas mehr Ω haben als nur 4 oder 8.

Mit dem gesteckten Jumper J1 lassen sich alle Phasen um das 64-fache beschleunigen (Zeitraffer-Modus). Das kann man zum Justieren der Poti-Einstellung verwenden. Wer also das Zeitintervall auf zwei Stunden einstellen will, teilt die zwei Stunden durch 64, kriegt 1,875 Minuten oder 112,5 Sekunden oder 1:52,5 heraus. Eine Stunde wird beim Beschleunigen mit 64 zu 56,25 Sekunden, was sich bequem mit der Stoppuhr verfolgen lässt. Nun kann das Einstellpoti so justiert werden, dass es von rot über grün bis wieder rot genau diese Zeit lang dauert. Bei einer Stunde in der 2-Stunden-Einstellung waren das bei 2,74 V Betriebsspannung aus zwei AA-Akkus genau 1,17 V am ADC3-Eingang.

Seitenansicht Andere AVR-Typen als ATtiny25, 45 oder 85 gehen mit dieser Software NICHT, denn die haben entweder gar keinen TC1 (ATtiny13 etc.) oder keinen 8-Bit-Timer-TC1 noch dessen umfangreichen Vorteiler-Park wie der Tiny25/45/85. Wer das unbedingt auf einem anderen AVR machen möchte, muss die gesamte Ton-Erzeugung auf einen 16-Bit-TC1 umbauen.

Software

Software-Download

Den Quellcode im Assembler-Format gibt es hier, den Quellcode im Browser hier. Die dazu gehörige Include-Datei mit den Tonleiterfrequenzen gibt es als Include-Datei hier und im Browser hier.

Wer statt des ATtiny25 einen 45 oder 85 einsetzen will, ändert nur die def-inc Include-Zeile. Alles andere (Setzen des Stapelzeigers SPH) übernimmt der Assembler mit .IFDEF.

Das Assemblieren geht mit jedem AVR-Assembler, der .IF-, .IFDEF-, .ERROR- und .MESSAGE-Direktiven beherrscht. Der Assembler 2 im Studio ab 4.19 kann das, meiner (gavrasm) auch. Wer mit einem anderen Assembler unterwegs ist, der das nicht kann, muss den Quellcode entsprechend umbauen.

Beim Programmieren müssen die werksseitigen Fuse-Einstellungen nicht geändert werden. Es muss aber in jedem Fall vorher der Jumper 1 entfernt werden, damit die Programmierimpulse vom SCK-Eingang auch im ATtiny25 ankommen.

Software-Hilfen zum Testen der Hardware

In der Software sind eine Reihe von Testroutinen untergebracht, die beim Prüfen der Hardware sinnvoll und nützlich sind. Diese können aktiviert werden, wenn die folgenden Schlüsselwörter auf Eins stehen. Natürlich sollte nur jeweils eine der vier Optionen Eins sein, die anderen, dahinter liegenden, werden dann sowieso nicht mehr ausgeführt.

Software-Ablauf

Timing des ATtiny25 Die Zeitdauer und die Steuerung der LED erfolgt genauso wie beim Tiny13-Langzeit-Timer.

Der gesamte Ablauf der Software erfolgt interrupt-gesteuert. Insgesamt vier Interrupts wirken dabei zusammen:
  1. Das gesamte Timing und die LED-Steuerung erfolgt wie bisher im TC0OVF.
  2. Das Abholen und Verarbeiten der AD-Wandler-Werte erfolgt im ADCC-Interrupt.
  3. Die Tondauer-Messung und Überwachung erfolgt mittels des OC1B-Interrupts.
  4. Die Überwachung des PCINT2 erfolgt mittels PCINT-Interrupt.
Außerhalb der Interrupt-Service-Routinen erfolgen keine Tätigkeiten und der Tiny wird nur wieder schlafen gelegt. So schläft er mehr als 95% der Zeit, was den Akkus zugute kommt.

Zeiten bei verschiedenen Vorteilern Der Timer lässt sich vorzugsweise mit dem voreingestellten Prescalerwert von 64 betreiben. Das ergibt eine PWM-Frequenz von 61 Hz und ist gut für die LED-Ansteuerung. Bei höheren Vorteilern flackert bzw. blinkt die LED. Wer kürzere Zeiten braucht, nimmt 8 oder 1 als Vorteilerwert, dasd ergibt kürzere Zeiten.

Der Einstellbereich durch den 10-Gang-Einstelltrimmer kann mit dem Faktor cDurMax verlängert werden. Im Minimum ist bei einem Vorteiler von 64 eine Stunde möglich, jede Erhöhung um Eins bringt eine weitere Stunde. Maximal kann cDurMax auf bis zu 63 erhöht werden, was den Timer auf mehrere Tage Zählzeit einstellen würde. Per Default sind zwei Stunden voreingestellt.

Der AD-Wandler wird bei jedem TC0-Overflow angestoßen (ADATE in ADCSRA = 1, ADTS in ADCSRB = 4). Bei der Default-Einstellung von 64 im Prescaler von TC0 ist dies 61 mal pro Sekunde. Die per Software eingestellte Anzahl an Messungen (Konstante cAdcSum) wird aufsummiert. Dieser Wert wird durch 16 geteilt und ergibt die Gründauer. Vom ursprünglichen Summenwert wird die Gründauer subtrahiert und als Rotdauer eingestellt.

Die Beschleunigung mit dem Jumper J1 funktioniert über den PCINT2: wird der Jumper gesetzt oder entnommen, wird der PCINT ausgelöst. Die ISR des Interrupts setzt den Vorteiler auf 1 (Jumper gesetzt) oder auf 64 (Jumper offen). Das funktioniert auch im laufenden Betrieb.

Zur Ausgabe der beiden Töne wird der Timer TC1 verwendet. Dieser bestimmt mit zwei Größen die Tonhöhe:
  1. Er ist als CTC eingestellt (Clear-Timer-on-Compare). Sein Register OCR1C enthält den CTC-Wert.
  2. Der Vorteiler des TC1 kann auf Zweierpotenzen zwischen 1 und 16.384 eingestellt werden. Für den hörbaren Tonbereich sind 1 (ab 1.950 Hz aufwärts), 2 (ab 980 Hz), 4 (ab 490 Hz), 8 (ab 245 Hz), 16 (ab 122 Hz), 32 (ab 61,6 Hz) und 64 (ab 30,5 Hz) sinnvoll einsetzbar.
Für die beiden Wunschtöne werden deren Frequenzen in Milli-Hertz in die Konstanten fG2R (Ton bei Grün-nach-Rot-Wechsel) und fR2G (Ton bei Rot-nach-Grün-Wechsel) eingetragen. Der Eintrag kann entweder direkt oder aus der in der Include-Datei gamut.inc angegebenen Tonleiter-Frequenzen erfolgen. In gamut.inc sind alle Tonleiter-Frequenzen ftn in Milli-Hertz als Konstanten definiert, mit denen sich die Töne t (C bis H) in der Oktave n (0..8) darstellen lassen. Das Originaldokument als LibreOffice-Tabelle gibt es hier. Wer die Tonleiter nicht braucht und Frequenzen lieber direkt einträgt, kann die entsprechende Include-Direktive im Quellcode auch löschen.

Aus den beiden Frequenzen ermittelt der Assembler die folgenden abgeleiterten Größen (? = R oder G): Alle Werte sind ganzzahlen-gerundet berechnet. Damit lassen sich alle Töne zwischen 27,5 Hz und 18,79 kHz komfortabel auswählen und ausgeben. Die Abweichung der Töne vom Sollwert beträgt dabei ca. +/-0,5%, also deutlich weniger als die Toleranz des internen RC-Oszillators im ATTiny25.

Beim Anstoßen der Tonausgabe in der TC0OVF-ISR wird
  1. der cDur-Wert 16-bittig in das Registerpaar XH:XL geschrieben,
  2. der cd-Wert in die Register OCR1C und OCR1B geschrieben,
  3. der cTc1-Wert in das Register TCCR1 geschrieben,
  4. das Torkeln des OC1B-Ausgangs im Register GTCCR eingeschaltet, und
  5. das Interrupt-Enable-Bit OCIE1B im Timer-Interrupt-Masken-Register TIMSK gesetzt.
In der ISR dieses Interrupts wird der Zähler im Registerpaar XH:XL abwärts gezählt. Erreicht dieser Null, wird der OC1B-Ausgang auf Clear gesetzt und die Interrupts werden abgeschaltet.

Zum Seitenfang


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