Bauplan Schaltplan Quellcode LM75A Thermometer in Assembler

Ganz schön heisser Tag heute...

Als Industriestandard für digitale Temperatursensoren haben sich die LM75 und kompatible Typen etabliert. Sie sind preiswert, lassen sich über ein I2C Interface leicht an Mikrocontrollerschaltungen anschliessen und bieten eine gute Genauigkeit sowie eine hohe Auflösung. Für diese Software habe ich den LM75A verwendet, welcher im Gegensatz zu den 0.5 Grad Auflösung eines LM75 sogar eine vierfach höhere Auflösung von 0.125 Grad bietet.

Im Internet finden sich zahlreiche Beispielprogramme für den LM75 bzw den LM75A, allerdings fast ausschliesslich in C oder BASCOM Basic geschrieben. Für Atmel AVR Assembler konnte ich auch keine Software finden, welche Interruptgesteuert das TWI Interface abfrägt, aber gerade das wäre interessant, und für viele weitere Sensoren zu verwenden.

Also habe ich selbst eine kleine Thermometer Software geschrieben, welche in der von mir gewünschten Art und Weise funktioniert. Als Anzeige habe ich mein kleines Text Display Board verwendet (Beschreibung hier). Der LM75A Temperatursensor hängt direkt am I2C Bus, mit 4k7 Pullup Widerständen.

Die Software funktioniert wie folgt:

Der Quellcode zu dieser Anwendung findet sich hier. Die Anwendung wurde mit einem MEGA32 auf dem STK500 erstellt, als Takt dient der interne RC Oszillator mit 2MHz.

Die benötigten Ports sowie das LCD Display werden initialisiert. und die Startmeldung wir ausgegeben, Der Timer 0 läuft auf langsamster Stufe und erzeugt dabei periodische Overflow Interrupts. Der LM75 kann etwa alle 100ms einen Temperaturwert liefern, was aber für den Menschen viel zu schnell wäre, um das ablesen zu können. Also wurde mit einem Software Counter der Timer Interrupt noch weiter verlangsamt (Natürlich hätte man auch gleich einen 16 Bit Timer verwenden können), so dass etwa alle 0.5 Sekunden eine Messung vorgenommen wird.

Über ein Flag teilt die Timer Interrupt Routine dem Hauptprogramm mit, dass eine Temperaturlesung stattfinden soll. Das Hauptprogramm startet daraufhin den Auslesezyklus und begibt sich wieder in Wartestellung.

Die TWI Schnisstelle erzeugt nach jeder Operation einen eigenen Interrupt. Nach jedem Schritt wird geprüft, ob dieser das erwartete Ergebnis liefert und danach wird der nächste Schritt angestossen. Wurden alle Schritte zum Lesen des LM75A durchlaufen, steht der Wert des Temperaturregisters in zwei Speicherzellen, und die TWI Interruptroutine meldet dem Hauptprogramm, dass ein gültiges Ergebnis vorliegt.

Geht während der Wandlung etwas schief, meldet die ISR dies ebenfalls ans Hauptprogramm, welches eine entsprechende Fehlermeldung anzeigt.

Wurde der Wert korrekt gelesen, steht jetzt die Umwandlung in einen lesbaren Wert an. LM75A Sensoren liefern ihren Temperaturwert als 11Bit Binärzahl im Zweierkomlement. Zuerst wird geprüft, ob es sich um einen negativen Temperaturwert handelt. (Das Höchstwertige Bit ist dann 1)

Wenn Ja, wird das Zweierkomplement berechnet und ein '-' ausgegeben. Ansonsten wird ein Plus ausgegeben. Jedes Bit des Temperaturwertes entspricht 0.125 Grad, wir müssen also den Binärwert geeignet multiplizieren, um ein anzeigbares Ergebnis zu erhalten. Hier wird der Originalwert durch 4 geteilt und nochmal zum Originalwert addiert, dies entspreicht einer Multiplikation mit 1.25, damit haben wir den Temperaturwert schon passend skaliert.

Anschliessend folgt einfach noch die Ausgabe des Temperaturwertes als Dezimalzahl, die Umwandlung erfolgt durch mehrfaches Subtrahieren von 10000,1000,100,10 und 1, wie es in Assembler recht üblich ist. Nach der Ausgabe der einzelnen Stellen wird noch ein Grad-Zeichen und ein C angehängt, und dann legt das Hauptprogramm sich wieder auf die Lauer nach dem nächsten Innterrupt-Ereignis.

Bauteile für dieses Projekt - Anzeigen:
Aktive Bauelemente

Passive Bauelemente


Weitere Informationen,Grundlagen,Bauanleitung,Schaltplan, Links zum Thema
Anzeigen:

Neueste Artikel
Anzeigen:
Aktuelle Newsbeiträge
Sie sind Besucher Nr. 1211979