PIC-Lernbeispiel: Thermometer mit LM75 über I2C

am  PIC16F628

zurück zu Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage


Allgemeines
Messbereich: -55°C .. +125°C
Fehler im Bereich -25°C .. +100°C < 2 K
Fehler im Bereich   -55°C .. +125°C < 3 K
Auflösung der Anzeige:    0,5 K
anklicken zum Vergrößern

Aufgrund eines Softwarebugs geht die Schaltung z.Z. nicht für negative Temperaturen.

Nicht alle PICs haben ein SSP-Port, das sich direkt als I2C-Schnittstelle nutzen lässt. Aber auch an andere PICs lassen sich I2C-Schaltkreise anschließen. Allerdings muss die gesamte Funktion der I2C-Schnittstelle dann in Software nachvollzogen werden.

Zum Erproben einer softwaremäßigen I2C-Emulation, habe ich einen Temperatursensor vom Typ LM75 über I2C an einen 16F628 angeschlossen. Der 16F628 liest über Software-I2C die Temperatur aus dem LM75 aus, und zeigt den Temperaturwert auf einem LCD-Display an. Das ergibt ein einfaches Thermometer. Für ein Thermometer ist diese Lösung natürlich eigentlich zu teuer, aber als lehrreiches I2C-Demo ist sie genau richtig. (ein billigeres Thermometer findet man hier)
 
 
Zum Verständnis der Funktion sollte man sich zunächst meine I2C-Beschreibung (bis einschließlich 'Datenfluss allgemein') durchlesen und das LM75-Datenblatt vom Hersteller (National Semiconductor) downloaden. Den LM75 gibt es in 2 Varianten. Eine Variante ist auf 3,3V Betriebsspannung kalibriert, und die andere auf 5V. Beide Schaltkreise laufen zwar bei beiden Spannungen, aber die Temperaturmessgenauigkeit ist nur bei der jeweiligen auf dem Chip aufgedruckten Spannung garantiert.

Auf dem nebenstehendem Foto ist ein 5V Typ zu sehen. Das erkennt man  an der Aufschrift 'CIM5'.

Foto des LM75

 



Aufbau
Als Sensor wird ein LM75 verwendet. In der Beschreibung des I2C-Busses habe ich darauf hingewiesen, dass die I2C-Ausgänge aller am Bus angeschlossenen Schaltkreise Open-Drain-Ausgänge (OD) sein müssen. RA4 wäre der einzige OD-Ausgang des PIC,  er eignet sich aber aufgrund der RA4-Falle nicht besonders gut als I2C-Ausgang. Für ein vollwertiges I2C-Interface verwende ich deshalb die Pins RA0..RA3

RA0 dient als Datenausgang des PIC. Durch eine Diode mache ich ihn zu einem OD-Ausgang, der die SDA-Leitung auf low ziehen kann. Als Dateneingang verwende ich das parallel dazu angeschlossene Pin RA2.
Auch die Taktleitung ist an einen Eingang (RA1) und einen Ausgang (RA3) angeschlossen. RA3 ist ebenfalls kein OD-Ausgang, und wird auch erst durch eine Diode zu einem solchen. Er kann die SCL-Leitung nur auf low ziehen, sie aber nicht auf high treiben. RA1 überwacht die SCL-Leitung für den Fall, dass ein Slave den Master durch eine künstliche Verlängerung der SCL-Low-Zeit bremsen möchte.

Die Taktgeschwindigkeit meiner Software-I2C-Routinen beträgt 210 kHz bei 10 MHz-PIC-Takt. Wenn low-speed-Geräte angeschlossen werden sollen, kann man den PIC-Takt auf 4 MHz verringern, wodurch sich der I2C-Takt auf 83 kHz verringert. Bei 20 MHz PIC-Takt erreicht der I2C-Takt 420 kHz, was etwas zu schnell ist. Durch Einfügen von NOP-Befehlen lässt sich der Takt aber beliebig verlangsamen.

Das LCD-Display ist am Port B angeschlossen. Der Anschluss von LCD-Displays wurde bereits in anderen Projekten/Lernbeispielen ausreichend erläutert. Die Anzeige erfolgt in der 1. Zeile des Displays, und ist nur 7 Stellen lang. Es eigent sich alsoo jedes Dot-Matrix-Display. selbst ein einzeiliges mit nur 8 Stellen reicht aus.


Temperatur-Messung
Der LM75 misst die Temperatur etwa 10 mal pro Sekunde mit 0,5 K Auflösung, und legt sie als 9-Bit (Zweierkomplement) in zwei internen Registern ab. Die oberen 8 Bit stehen dann in einem Register, und das letzte Bit steht als höchtwertiges Bit im 2. Register.
Das erste Register enthält also den ganzzahligen Grad-Wert, im 2. Register steht nur ein Bit, wenn die gemessene Temperatur auf ',5' endet.

Diese Register lassen sich via I2C-Bus jederzeit auslesen.



Berechnungen
Negative Temperaturen müssen zunächst aus dem Zweierkomplement in eine normale Zahl umgerechnet werden. Dazu muss der Wert zunächst invertiert, und dann um 1 erhöht werden.

Der binäre Temperaturwert muss für die Anzeige am LCD-Display zunächst in eine BCD-Zahl (Dezimalzahl) gewandelt werden. Die einzelnen Stellen müssen für die Anzeige dann noch von BCD nach ASCII gewandelt werden.



Programmablauf einer Messung
  1. Übernahme des I2C-Busses durch den 16F628
  2. Auslesen der Temperatur aus dem LM75
  3. Freigabe des I2C-Busses
  4. Wandeln negativer Temperaturen aus dem Zweierkomplement in 'normale' Zahlen.
  5. Ausgabe der ganzen Gradzahl auf dem Display
  6. Fall ein ',5'-Wert vorliegt am Display noch ',5 °C' ausgeben
  7. ansonsten ',0 °C' ausgeben
  8. 1/4 Sekunde Pause einlegen
  9. Wieder zum Schritt 1 springen

Download
Hier liegt




mögliche Erweiterungen
Es sind noch genug  digitale Pins frei, um einige Erweiterungen vorzunehmen. Möglich wäre z.B.
  1. Ausgabe der Temperatur über RS232
  2. Anschluss von bis zu 7 zusätzlichen LM75-Sensoren und 8 Auswahltasten
Der Einsatz eines 16F84 anstelle des 16F628 ist bei kleinen Softwareänderungen möglich.

zurück zu Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 23.09.2003
letzte Änderung: 05.12.2003