Forum: Mikrocontroller und Digitale Elektronik PIC16F876A <=> I2C <=> LM75 / Assembler Routinen


von Atter S. (attersee)


Lesenswert?

Diesmal kein Hilferuf, sondern ein Kurzbericht, der vielleicht auch 
jemand anderem helfen mag, bei einem PIC16F87x die I2C Funktion zu 
benutzen.

Ich benötige in einem (privaten) Projekt mehrere Temperaturmessstellen 
und habe mich für den LM75 (5V Type) entschieden. Ich verwende den 
PIC16F876A als Master, programmiere alles in Assembler und will das auch 
weiter tun. Die I2C Schnittstelle ist / war für mich allerdings Neuland.

Frisch gewagt, versuchte ich es mit den von Sprut für den PIC16F876 
publizierten Routinen. Ich habe die Routinen 1:1 übernommen (copy / 
paste). Leider war mir nur ein Teilerfolg beschert. Manchmal gelang mir 
ein einziger Lesezyklus mit einem vernünftigen Messwert, doch dann hing 
der Bus mit SDA=L. Wohl fand ich im Datenblatt den Hinweis auf 
‚Inadvertent 8-Bit Read from 16-Bit Register where D7 is Zero’, doch bin 
ich nicht sicher, ob der Fehler da zu suchen ist und ich wollte nicht 
noch mehr Zeit in die Sache investieren. Habe auch kein DSO. So habe ich 
schließlich diesen Pfad verlassen und Google sei Dank, ein Link auf 
einen I2C Assemblercode für den PIC18F452 gefunden.

http://0x09.com/physical-computing-tutorials/using-the-i2c-bus

Mit ein paar kleineren Anpassungen für den PIC16F876A funktionierte das 
Auslesen des LM75 auf Anhieb. Durchgeführte Änderungen:
- Umschaltung auf Bank1 bei allen Zugriffen auf die Register TRISC, 
SSPCON2, SSPADD, SSPSTAT.
- Umbenennung von SSPCON1 auf SSPCON.
- Behoben: Subroutine I2C_WriteW überschreibt W durch ‚call I2C_Idle’. 
Maßnahme: Hilfsvariable eingeführt, die vor dem Aufruf der Routine 
beschrieben und in der Routine auf SSPBUF übertragen wird.
- Im Code SCL und SDA durch Bit-# ersetzt (z.B. TRISC, 3).

Sollte jemand erfolgreich die oben erwähnten Sprut Routinen zum Auslesen 
eines (oder mehrerer) LM75 verwendet haben, so interessiert mich das 
sehr wohl, obwohl ich jetzt eine gute Lösung habe. Ich beziehe mich 
jedoch explizit auf die Routinen für den PIC16F876(A) unter Benutzung 
des MSSP Port. Mit der Software-Schnittstelle für den PIC16F628 möchte 
ich mich nicht beschäftigen.

Grüße, attersee

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.