Akustische Zahlenausgabe mit AVR-Microcontroller

Seitenübersicht



 www.schramm-software.de

Toll, wenn der Microcontroller aufwendige Berechnungen durchführt, vielleicht sogar analoge Messwerte oder digitale Signale auswertet. Da man aber nicht in den Chip hineinschauen kann, stellt sich die Frage, wie der µC seine "Erkenntnisse" dem Menschen mitteilen kann. Schön ist eine Ausgabe auf 7-Segment-Anzeigen oder gar grafischem Display. Für viele Zwecke ist solch eine Lösung aber einfach zu aufwendig und gar nicht geeignet für eine schnelle Steckboard-Realisierung. Vielfach geht es ja nur darum, ein paar (ganze) Zahlen auszugeben. Dann bietet es sich an, die Ergebnisse akustisch, codiert als Tonfolgen, zu signalisieren. Das ist beinahe wie Morsen, aber viel einfacher.

Man muss schon genau hinhören...

Zunächst wird die Binärzahl in einen "Dezimalstring" verwandelt. So wird bspw. aus binär 1111011 die Bytefolge 1-2-3. Anschließend werden die Ziffern nacheinander als entsprechende Anzahl von Pieptönen über einen Piezo-Schallwandler oder Lautsprecher ausgegeben. Damit die Ziffern gut getrennt werden können, wird zwischen den Pieptongruppen eine deutlich längere Pause eingelegt. Das Beispiel würde also umgesetzt in piep-pause-piep-piep-pause-piep-piep-piep. Wie wird die Null dargestellt? Denkbar wären 10 Piepser, analog zur Pulswahltechnik bei der guten, alten Telefon-Wählscheibe. Wir wählen jedoch einen anderen Weg: Die Null wird durch einen tieferen, längeren Ton codiert. Das spart Zeit und Geduld beim Zuhören, und zwei so unterschiedliche Töne lassen sich mühelos unterscheiden.

Alles klar? Dann am besten gleich ausprobieren! Das beschriebene Verfahren wird im ADC-Testprogramm verwendet. Wer es noch einfacher wünscht, kann dieses schlichte Zählprogramm in der Realisierung wiederum für den ATtiny13 verwenden:

Download

Version 1.1 vom 3.11.2009 mit Energiesparfunktion (Timer + Sleep)

In dieser Version ist das Programm für den ATtiny13 und eine Taktrate von 1,2 MHz (Auslieferungszustand des Tiny13) ausgelegt. Bei höherem Takt wird das Mitzählen zur Herausforderung... Die Anpassung an andere AVR-Typen oder Taktraten sollte leicht möglich sein, da das Programm ausführlich kommentiert ist. Das Programm benötigt die in dieser Rubrik vorgestellten Makros.


Die Schaltung

Schaltbild des Zählers mit akustischer Ausgabe
Schaltbild: Microcontroller-Zähler
mit akustischer Ausgabe

Um etwas hören zu können, wird an die Controller-Pins 5 und 6 (= PB0 und PB1) ein hochohmiger Piezo-Schallwandler angeschlossen. Wem der zu leise ist (vor allem bei geringeren Betriebsspannungen, wie sie der ATtiny13V erlaubt) oder wer einen solchen nicht zur Hand hat, kann auch einen kleinen niederohmigen Standardlautsprecher über einen Reihenwiderstand (je nach Betriebsspannung mindestens 220 bis 470 Ω) verwenden. PB0 und PB1 werden während der Tonausgabe gegenphasig getaktet, so dass die maximal mögliche Lautstärke aus dem Schallwandler herausgekitzelt wird. Achtung: Es dürfen nur einfache Piezo-Schallwandler ohne eingebaute Elektronik benutzt werden, da der µC jede einzelne Tonschwingung selbst erzeugt.

Warum wird der Lautsprecher an PB0 und PB1 angeschlossen; wurden diese zwei von fünf möglichen Chip-Pins willkürlich gewählt? Nein - die Pins sind als Ausgänge nicht gleichwertig! PB0 und PB1 sind mit größeren, kräftigeren Ausgangstransistoren ausgestattet als PB2 bis PB4 (und erst recht PB5; dieser Pin taugt als Ausgang nur sehr bedingt, da er aufgrund seiner potenziellen Reset-Verwendung mit zusätzlichen internen Widerständen beschaltet ist). Wenn also andere Aspekte nicht dagegen sprechen, sollte man PB0 und PB1 zu jenen Ausgängen machen, die den größten Strom zu schalten haben. Die unterschiedliche Wertigkeit der Chip-Pins als Ausgang wird in unserem Bausatz Experimentierwürfel eingehend untersucht.

Was genau macht das Programm?

Ganz einfach: Es durchläuft eine Endlosschleife, in der nach einer einsekündigen Pause der Inhalt des Registerpaares Z dezimal "gemorst" und anschließend um eins erhöht wird. Da Z eine Breite von 16 Bit aufweist, folgt auf 65535 wieder 0.

Mit welcher Zahl startet das Programm? Das ist noch eine kleine Besonderheit. Z wird vom Programm nicht initialisiert. Daher kann mit diesem Programm nebenher endlich die drängende Frage geklärt werden, ob die Arbeitsregister nach dem Einschalten des Controllers tatsächlich alle null sind, so wie es der Simulator des AVR-Studios anzeigt. Ist der Startwert immer gleich? Macht es einen Unterschied, ob der Controller per Reset zurückgesetzt, für kürzere oder längere Zeit von der Spannungsquelle getrennt wird? Probieren Sie es aus und lassen Sie sich überraschen!

Es dürfte schon deutlich geworden sein, dass die Zahlenausgabe in dieser Beispielanwendung auf 16bit ausgelegt ist. Für viele Anwendungen sollte das ausreichen, aber sicher gibt es auch Applikationen, die mit größeren natürlichen Zahlen hantieren. Dann müssen die Unterprogramme bin2dec und x_min_y sowie die Dezimalzahltabelle zehnerpot angepasst werden.

Sparsamer Nervtöter oder Kinderbelustigung?

Immer wieder erstaunlich und erfreulich ist, wie energetisch sparsam solche Microcontroller-Schaltungen sind. In den tonlosen Pausen 'schläft' die CPU des Microcontrollers. Es arbeitet dann nur noch der Timer, der die CPU etwa 18mal pro Sekunde aufweckt (durch den Overflow-Interrupt). Die Stromaufnahme dieser Schaltung ist daher ziemlich gering, bei 2,4 Volt Betriebsspannung (zwei NiMH-Akkus) und Verwendung eines Piezo-Wandlers rund 0,3 mA im Mittel. Ein Akkusatz reicht also für mehrere Tausend Stunden Betrieb. Das prädestiniert dieses Gerätchen, das sich leicht auf einer winzigen Lochrasterplatine oder einfach in 'fliegender Verdrahtung' aufbauen lässt, zu weiteren Anwendungen: Wie lange dauert es, bis jemand - nur durch Hören - auf den Piepser aufmerksam wird, der heimlich auf einem Schrank platziert wurde? Allerdings muss es in diesem Raum ansonsten sehr ruhig zugehen. Oder als Idee für den nächsten Kindergeburtstag: Wer hat das beste Gehör und findet das im Zimmer versteckte Gerät? - Einmal etwas Anderes als die gewohnte Schatzsuche, aber wohl nur als "Indoor-Aktivität" geeignet.

Eine kleine Beispielapplikation für den ATMega8

Mit kleinen Anpassungen eignet sich die Tonsignalausgabe auch für Anwendungen auf anderen Mikrocontrollern, z. B. dem ATMega8. Der Sourcecode eines Assemblerprogramms für den ATMega8 findet sich hier. Der Piezo-Piepser wird diesmal an PC5 und GND angeschlossen. Unmittelbar geeignet ist dieses Programm z. B. für die myAVR-ATMega8-Entwicklungsboards. Dort ist der benötigte Piezo-Piepser sogar schon 'on board'.

Das Dezimalzahl-Morsen bewährt sich auch in der Entwicklungsphase von Projekten. Wenn bspw. der Controller mit einer anderen Hardware kommuniziert, deren Dokumentation Interpretationsspielraum hinsichtlich des Aufbaus übertragener Datenpakete lässt, kann die Tonausgabe zu deren Analyse eingesetzt werden. Der nur eine benötigte Ausgabe-Pin steht entweder noch zur Verfügung, oder es wird notfalls ein bereits belegter Pin vorübergehend zweckentfremdet.

Wir haben genau so verfahren, um die Rückmeldungen eines Touch-Screens (EA eDIPTFT43-ATP) zu ergründen. Ein Display zur komfortableren Ausgabe stand auf der Platine nicht zur Verfügung, denn die Anzeige sollte natürlich der Touch-Screen übernehmen - hier hätte sich also die Katze in den Schwanz gebissen. Der oben verlinkte Sourcecode stellt einen Ausschnitt aus diesem Programm dar.

Es geht auch optisch

Teilschaltbild des Zählers mit optischer Ausgabe

Wer lieber genau hinschauen als genau hinhören mag, kann die Ausgabe auch über eine LED realisieren. Die LED wird einfach über einen Vorwiderstand zwischen PB0 oder PB1 und Masse geschaltet. Da der Pegel am Port während der (eigentlich) Tonausgabe schnell zwischen Plus und Minus wechselt, brennt / flimmert die Leuchtdiode nur in halber Intensität.


Zurück zur Übersicht