|
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'. |
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.
Diese Register lassen sich via I2C-Bus jederzeit auslesen.
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.