Hallo, bin langsam am verzweifeln. Ich versuche seit drei Tagen einen Temperatursensor LM75 an einem PIC 16F886 zum laufen zu bekommen. Das Teil sagt aber einfach nix. Noch nicht mal ein ACK kommt zurück. Ich möchte das Teil gern mit dem MSSP Modul (I2C) ansprechen. Programmieren tue ich in Assembler. Hochziehwiderstände sind an SDA und SCL dran (1k8). Verdrahtung ist auch ok (schon 5 mal überprüft). So langsam weis ich nicht mehr weiter. Probiert habe ich schon mit 400kBit und mit 100kBit. Irgendwie sieht es so aus, als ob das Teil nicht antwortet. Das Prog sendet die Startcondition, dann die Adresse mit gesetztem R/W-Bit. Hier wird nun schon nicht das ACK-Bit im STATUS-Register gesetzt. Scheinbar fühlt sich mein LM75 nicht angesprochen. Das Lesen des Datenwortes hängt sich dann auf (er wartet in einer Endlosschleife auf das erste Byte). Hat eventuell jemand einen Link oder eine Idee was ich falsch machen könnte? Im Netz findet man dazu auch nichts. Nur immer die Ansteuerung ohne MSSP Modul oder in C. Danke für die Hilfe Sven
Bist Du sicher dass die Adresse stimmt? In vielen Datenblättern steht die Adresse als 7 Bit Wert drin, den muss man erst ein Bit nach links schieben und dann das R/W Bit als LSB dazutun. Ich hatte bei einigen Bausteinen auch schon mit Adresse 0 Erfolg, das ist wohl so eine Art Brotkasten ähhh broadcast Adresse.
Adresse ist 0x90 bzw 0x91 (wenn man Lesen will) und sollte so stimmen (1001 A2,A1,A0,R/W). Das mit Adresse 0 könnte ich noch testen. Da an den Bus aber noch zwei weitere ICs sollen (EEprom und Busexpander) geht das später nicht mehr, da die 0 tatsächlich als eine Art Broadcast reserviert ist.
Habs gerade mal noch schnell probiert. Mit Adresse 0 antwortet der LM75, sendet allerdings als Temperatur immer nur 0xFF in beiden Bytes. Nun muss ich nur noch rausfinden, warum der auf Adresse 0x90 nicht antwortet. Eventuell haben ja meine 3 Adresspins nicht alle Massekontakt. Werd ich wohl noch mal nachlöten müssen. Für heute ist aber erst mal Schluss. Danke für den Tip. Sven
Ich habe jetzt mal den Sensor getauscht. Anfangs genau das selbe Bild. Nach einigem hin und her habe ich mal das Bit SMP im Register SSPSTAT gesetzt:
1 | In I2C Master or Slave mode: |
2 | 1 = Slew rate control disabled for standard speed mode (100 kHz and 1 MHz) |
3 | 0 = Slew rate control enabled for high speed mode (400 kHz) |
Nun scheint es zu gehen, auch wenn der Sensor scheinbar etwas zu viel anzeigt (ich glaub dem nicht das es in meinem WZ gerade 25°C sind). Wenn mir jetzt noch einer erklären könnte, was es mit dem Bit auf sich hat. Ich kann das nicht so ganz richtig deuten. Scheint eine Art Kontrolle der Flanken im Signal zu sein? Oder habe ich das jetzt falsch übersetzt? Was ich nicht verstehe, der PIC steuert den BUS mit 400kHz an. Laut Datenblatt wäre es nicht richtig dieses Bit zu setzen. Damit geht es aber. Was ist also richtig? Gruß Sven
Super-Erklärung für dieses Bit... Ich habe hier auch lange mit I2C gekämpft und habe jetzt eine Verbindung mit 33kHz (über 5m im Fahrzeug) installiert. Dabei hilft es, mit einem Oszillokop den Kurvenverlauf zu sehen! Und das letzte große Debugging habe ich dann mit einem Logicanalysator (Po.Scope) gemacht. Hat lange gedauert, bis ich rausfand, daß die Compiler-Routinen für das LCD einige TRIS-Bits (immer wieder) setzen, die das MSSP-Modul zum K..... findet. Aber dieses Problem wirst Du nicht haben. Warum 400kHz ?
Hihi, jetzt weis ich wenigstens, warum ich mich innerlich so weigere auf eine Hochsprache umzusteigen. Bei Assembler weiß ich wenigstens welches Bit ich falsch eingestellt habe und muss nicht damit rechnen das der Compiler denkt, er müsste das irgenwie anders machen. Ich muss allerdings auch zugeben, dass ich am Anfang dieses Bit schon einmal umgestellt hatte und es auch nicht ging. Da hatte allerdings das Banking wieder mal zugeschlagen *** grrrrr ***. Ich hatte nicht beachtet das SSPSTAT in Bank 1 liegt..... Im Moment läuft das ganze auf 100kHz. Das Bit ist auch gesetzt. Warum sollte ich nicht 400kHz nehmen? Der Chip kann das eigentlich ab. Ich werde es aber auf 100kHz lassen, da ich auch noch einen Uhrenschaltkreis einen EEPROM und einen Busexpander anschließen will. Der Uhrenschaltkreis kann nur 100kHz. Wenn die dann erst mal alle miteinender spielen, bin ich in meinem Projekt einen Schritt weiter :-) Sven
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.