mikrocontroller.net

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


Autor: Atter See (attersee)
Datum:

Bewertung
0 lesenswert
nicht 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...

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.