| Weitere Artikel aus dem Elo-Magazin |
Mikrocontroller: Ergänzungen, Tipps und Tricks
Telegraphie-Thermometer
Wer Morsen kann, ist klar im Vorteil: Die vorliegende Schaltung misst die Spannung an einem Spannungsteiler aus Festwiderstand und Kaltleiter, rechnet den Spannungswert in Grad Celsius um und gibt ihn in Morsezeichen aus.
von Ralf Beesner, DK5BU
Die beschränkten Ressourcen des Attiny13 (nur 5 I/O-Ports) machen es umständlich, Messergebnisse oder Zustandsänderungen auszugeben. In vielen Programmbeispielen erfolgt die Ausgabe über eine Software- COM- Schnittstelle, aber für sie wird ein PC mit einem Terminalprogramm benötigt.
Ganzen Artikel lesen...

Ideal wäre die Signalisierung per Tonsignal. Man benötigt nur einen Piezo- Schallwandler, und es wird nur ein Ausgang des Attiny13 belegt. Gibt man Messwerte als Tonhöhe oder als Anzahl von Piepsern aus, ist noch nicht viel gewonnen. Beherrscht man jedoch das Morsealphabet, ist eine elegante Signalisierung möglich, da sich in Morse alle Buchstaben, Zahlen und viele Sonderzeichen ausgeben lassen. Aus dem alten 68er- Spruch "Wer lesen kann, ist klar im Vorteil", den ich als Schüler zu hören bekam, wird so "Wer Morsen kann, ist klar im Vorteil". Die vorliegende Schaltung misst die Spannung an einem Spannungsteiler aus Festwiderstand und Kaltleiter, rechnet den Spannungswert in Grad Celsius um und gibt ihn in Morsezeichen aus.
Codierung von Morsezeichen
Ein effizientes Verfahren, Morsezeichen zu codieren, fand sich im WWW, es ist schon mehr als 10 Jahre alt und wurde von mehreren Autoren aufgegriffen; die Umsetzung erfolgte damals in Assembler auf PIC- Microcontrollern. Eine kompakte Realisierung ist aber auch in Bascom auf einem AVR möglich.
Prinzip der Codierung:
- 1 Byte pro Zeichen, niederwertiges Bit zuerst
- hat das Bit den Wert 0: Morsepunkt (dit)
- hat das Bit den Wert 1: Morsestrich (dah)
- da Morsezeichen unterschiedlich lang sind, ist ein Ende- Zeichen erforderlich; es ist ebenfalls ein 1 - Bit.
- Beispiel Morsezeichen "`a"' (dit dah): &B00000110
- Beispiel Morsezeichen "`9"' (dah dah dah dah dit): &B00101111
- Auslesen der codierten Zeichen: niederwertigstes Bit auslesen, Byte um 1 Stelle nach rechts schieben, niederwertigstes Bit auslesen. Ist der Wert des gesamten Bytes nur noch 1, ist das Zeichen komplett.
Der Spannungsteiler besteht aus einem Widerstand 1 kOhm und einem Kaltleiter KTY81. Dieser hat bei der Nominaltemperatur 25 Grad Celsius einen Widerstand von 1000 Ohm, bei 0 Grad 815 Ohm. Die Kennlinie ist nicht linear, aber im Bereich um die Raumtemperatur kann man mit ausreichender Genauigkeit 8 Ohm Widerstandsänderung pro Grad ansetzen. Der ADC macht (bei 10 bit Auflösung) aus 0 Grad den Ausgangswert 460, pro Grad steigt er um 2 Schritte.
Zu berücksichtigen ist die recht große Fertigungstoleranz der Kaltleiter. Der Hersteller wirft nicht große Teile der Produktion als Ausschuss weg, sondern verkauft sie mit unterschiedlicher Toleranzangabe. Ein KTY81-110 hat 1000 +/- 10 Ohm Widerstand bei 25 Grad, ein KTY81-120 hat 1000 +/- 20 Ohm bei 25 Grad. Wir müssen also das fertige Thermometer bei bekannter Temperatur probelaufen lassen und den Grundwert etwas anpassen (siehe auch das Beispiel im Programmlisting).
Der Mittelabgriff des Spannungsteilers liegt an PB4 / ADC0 (Pin3). Das obere Ende des Spannungsteilers liegt nicht direkt an Plus, sondern wird zwecks Stromersparnis über PB3 (Pin2) nur für die Dauer der Messung geschaltet (auch der ADC wird nur für die Dauer der Messung aktiviert). Der Piezo-Schallwandler liegt an PB0/OC0A (Pin5). Die Betriebsspannung stammt aus einer Lithiumzelle oder 3 Mignonakkus; sie ist mit 220 µF kurzzeitstabilisiert. Der Pluspol ist gut zu isolieren (auch auf der Platinenunterseite) und mit einer Sicherung abzusichern; insbesondere bei Verwendung einer Lithiumzelle (Berstgefahr). PB0 und PB1 sind über je 1 MOhm auf ein definiertes Potential gelegt (Stromersparnis), und an Pin5 liegt ein Resettaster. Eine Andeutung, wie man die Schaltung auf einer Streifenleitungsplatine anordnen kann, findet sich hier:
Das Programmlistung ist ausführlich kommentiert, daher nur eine Übersicht: Zunächst werden die benötigten Morsezeichen in ein Feld eingelesen, dann der Timer0 als Tonquelle konfiguriert.
Die "`Hauptarbeit"' ist in zwei Unterprogramme ausgegliedert
- Auslesen des ADC, Umwandlung in Celsiusgrade und Zerlegung in Einzelziffern
- Erzeugung der Morsezeichen
Das Hauptprogramm gibt zunächst die Buchstaben "`temp "' für "`Temperatur"' aus, verzweigt in die ADC- Routine, holt sich die Zehner- und Einerstelle der Temperatur, sendet sie in Morse und hängt noch ein "`c"' an. Anschließend geht der Prozessor in Powerdown. Eine erneute Ausgabe der Temperatur erfolgt erst nach Drücken des Reset- Tasters.
Download: Morsetemp1
Software 2
Schöner wäre eine Software, die die Temperatur regelmäßig ausgibt, z.B alle 15 Minuten. Leider hat der Attiny13 nur einen Timer, der ja bereits benutzt wird. Ein Workaround ist die Verwendung des Watchdog. Er lässt sich lediglich auf maximal 8 sec Zeitdauer programmieren. Für brauchbare Zeiten muss man also eine zusätzliche Zählschleife verwenden. Standardmäßig läuft der Watchdog im Reset-Modus; eine Zählvariable würde jedoch durch den Reset immer wieder auf den Anfangswert zurückgesetzt. Der Watchdog läßt sich auch im Interrupt- Modus betreiben, allerdings ist dieser nicht über den Bascom-Befehl "Config Watchdog" konfigurierbar, sondern nur durch direktes Beschreiben des Watchdog-Registers.
Weitere Erläuterungen finden sich im Programmlistung. Mit dieser Erweiterung hilft die Schaltung den Tag zu ordnen; ähnlich wie eine alte Uhr mit Schlagwerk meldet sie sich in regelmäßigen (na ja, der Watchdog- Oszillator ist nicht sonderlich frequenzstabil) Zeitabständen. Wünscht man zwischendurch die Ausgabe der Temperatur, reicht ein Druck auf den Reset-Taster ....
Download: Morsetemp2
Das Morse-Thermometer ist nun fast 1 Jahr (immer noch mit der ersten Batterie) im Einsatz.
Als Zimmerthermometer war es genau genug; da ich es vielleicht mal mit einem kleinen Senderchen versehen und als Funk- Außenthermometer verwenden will, habe ich die Ausgabe von Minustemperaturen nachgerüstet und die Genauigkeit verbessert.
Beim größeren Temperaturbereich macht sich der nichtlineare Widerstandsverlauf des KTY81 deutlich bemerkbar. In einer Spannungsteilerschaltung wird er jedoch teilweise kompensiert. Ich habe daher den Widerstands- und den Spannungsverlauf aus dem Datenblatt in eine OpenOffice-Kalkulationstabelle übertragen (siehe xls-Datei), den Vorwiderstand variiert und durch Ausprobieren einen optimalen Wert gesucht.
Der alte Vorwiderstand von 1000 Ohm brachte zwar maximale Spannungsänderungen, aber als günstiger erwies sich ein Vorwiderstand von 1420 Ohm (1200 Ohm und 220 Ohm in Reihe geschaltet). Damit ergibt sich von -20 Grad bis + 20 Grad recht genau eine Zunahme von 2 AD- Schritten pro Grad (siehe Excel- Tabelle). Für 0 Grad C beträgt der AD- Wert 373.
Oberhalb von 20 Grad C werden die Schritte etwas kleiner als 2; will man kompakt mit Bytes weiterrechnen, kann man nicht klassisch interpolieren, also die Kurve durch unterschiedlich steile Geradenstücke annähern, sondern nur den 0-Grad- Basiswert 373 etwas verschieben. Bei +30 Grad, +40 Grad und +50 Grad wird der Basiswert je einen AD- Schritt angehoben (also um etwa ein halbes Grad). Damit ist die Nichtlinearität im Temperaturbereich -25 Grad C bis +55 Grad C recht ordentlich kompensiert.
Der 0 Grad- Basiswert ist nicht exakt 373, sondern muß etwas angepaßt werden, um Toleranzen des KTY81 (und den kleinen Spannungsabfall an PB3) auszugleichen.
Wenn das Thermometer bei Zimmertemperatur etwas abweicht, muß nur die Konstante "Basis" in Zeile 74 etwas angepaßt werden. Die Korrekturwerte für die "Interpolation" werden daraus abgeleitet und brauchen daher nicht geändert zu werden.
Die unbenutzen Eingänge PB1 und PB2 hatte ich ursprünglich über 1 MOhm- Widerstände auf Masse gezogen, damit sie im Powerdown nicht floaten und Strom ziehen. Eleganter ist es, die nicht benötigten Digitaleingänge über das Register DIDR0 dauerhaft abzuschalten (Ausgangsports und die Zweitfunktionen der Pins wie z.B. ADC- Eingänge funktionieren trotzdem).
Da durch die zusätzlichen IF- Then- Schleifen der Flashspeicher knapp wurde, mußte ich den Code an anderer Stelle kompakter machen. Direktes Setzen der Attiny- Register spart einige Bytes gegenüber den komfortablen Basic- Befehlen wie "Powerdown" oder "Stop Watchdog", und " incr x " bzw. " shift x, right,1 " sparen ein paar weitere Bytes gegenüber " x = x+1 " bzw. " x = x/2 ", obwohl sie das gleiche bewirken.
Außerdem ist in der Morsezeichenroutine der nicht benötigte Programmteil für Leerzeichen auskommentiert.
Download: Morsetemp3
![]() | Lernpaket Mikrocontroller Lieferumfang: 15 Bauteile, Platine, Sub-D-9-Kabel, CD-ROM, Handbuch 160 Seiten 49,95 € |













