Beim Entwurf dieses Assemblerprogramms wurden folgende Kriterien berücksichtigt:
Auflösung 10 Bit
Da der ADC eine Auflösung von 10 Bit ermöglicht, sollte diese auch genutzt werden. Das ergibt 1024 Werte (0..1023).
Nutzung der internen Referenzspannung
Die AVR-intern verfügbare Referenzspannung beträgt 1,1 V. Sie unterliegt zwar starken Exemplarstreuungen (lässt sich durch Verändern des Skalierfaktors kalibrieren), ist ansonsten aber recht stabil. Der Messbereich von 1 V erlaubt die volle Nutzung das Anzeigebereichs der dreistelligen Ziffernanzeige. Das Nutzen der internen Referenz macht das Modul auch Batteriebetriebstauglich. Es kann daher mit drei oder vier Akkuzellen NiCd oder NiMH betrieben werden, oder auch mit einer Li-Ion- bzw. LiPo-Zelle.
Ausblendung von Zahlen oberhalb des Messbereiches
Da mit drei Dezimalstellen nur Werte bis 999 dargestellt werden können, soll die Software alle Werte über 0,999 V als "---" darstellen. Dies vermeidet Falschinterpretation von Messwerten, bei denen die nicht darstellbare vierte Ziffer "1" ist.
Mittelwertbildung über 256 Messungen
Durch eine gleitende Mittelwertbildung über 256 Messungen wird eine Beruhigung des Messwertes erreicht. Unvermeidliche Messwert-Ausreißer werden damit eliminiert. Der Algorithmus ist so effizient, dass die Mittelwertbildung im ADC-Interrupt erfolgen kann.
Schnelles und flexibles Multiplexing der drei Ziffern
Durch Ablegen der Bitmuster für Segmente und Digits in einer Tabelle im SRAM ist ein sehr schneller Zugriff auf die Daten der nächsten Ziffer möglich. Dies erlaubt das Multiplexing nebenbei im ADC-Interrupt. Da beide Bitmuster (Segmente und Digits) 16-bittig (11-bittig nutzbar) behandelt werden, ist eine freie Zuweisung der Segmente und Digits zu den Portpins möglich, was die Hardware erheblich vereinfacht.
Skalieren des Anzeigewertes
Der Wertebereich des ADC beträgt 0 bis 1023, die interne Referenzspannung beträgt etwa 1100 mV. Da erreicht werden soll, dass bei 999 mV auch "999" angezeigt werden soll, muss der ADC-Wert skaliert werden. Dies erfolgt im Prinzip durch eine Multiplikation mit 1,074. Dies entspricht dem Bruch 275/256, was dem AVR die Fließkomma-Berechnung erspart. Da der Tiny24 keine Hardware-Multiplikation hat und das Ausgabetempo sowiso bebremst werden muss, bietet sich statt der Multiplikation das Kumulieren (Aufsummieren) des Messwertes an. Die Division durch 256 wird durch Byteshifting (Wegwerfen des unteren Ergebnisbytes) erreicht.
Bremsen des Anzeigetempos
Zu schnelles Anzeigen neuer Werte verschlechtert die Lesbarkeit, das Tempo der Bereitstellung neuer Messwerte (nicht aber das Multiplexing-Tempo) musste also gedrosselt werden. Die bereits genannte Kumulation des Messwertes reicht dazu aber noch nicht aus. Deshalb wurde eine zusätzliche Verzögerung eingebaut, die die Berechnung (bzw. jeweils einen Schritt davon) nur jede x-te Runde der Mainloop aufruft.
Nutzung des Tiny24 im Auslieferungszustand
Der Tiny24 sollte im Auslieferungszustand (intern erzeugter CPU-Takt von 1 MHz) benutzt werden, um das unnötige Verstellen der Fusebits zu vermeiden. Auch der Reset-Pin sollte erhalten bleiben, damit der Tiny24 ISP-tauglich bleibt.
Da der Quelltext der Software recht üppig kommentiert ist, halte ich weitere Erklärungen erstmal für überflüssig.
Zu Demonstrationszwecken wurde auch etwas mit BASCOM experimentiert, das sieht dann so aus: BASCOM-Quelltext Es ist zur Schaltung des ersten Versuchs kompatibel.
Wie immer ist private Nutzung der Software für den Eigenbedarf ohne Rückfragen erlaubt, gewerbliche Nutzung allerdings nicht.