Hallo zusammen, ich arbeite derzeit an der I2c Kommunikation mit einem Temperatursensor, dem LM75. Dazu habe ich eine Frage: -> Ich schaffe es, den Sensor über I2c anzusprechen, allerdings sendet dieser mir immer nur seine Adresse zurück, könnt ihr mir da weiterhelfen? Verstehe nicht wieso die Kommunikation da nicht funktioniert? Vielen Dank!
Juli An schrieb: > Verstehe nicht wieso die Kommunikation da nicht funktioniert? Wir auch nicht :) Wird halt ein Fehler in deinem Programm sein.
Juli An schrieb: > Verstehe nicht wieso die Kommunikation da nicht funktioniert? Da musst du uns schon dein Proramm zeigen, denn beim Hellsehen versagen wir immer (meistens) kläglich.
Okay, dann poste ich mal ein bisschen Code:
1 | ....
|
2 | |
3 | PORTB &= ~(1<<0); // LED wird zu Beginn angeschalten |
4 | |
5 | |
6 | variable = i2c_start(lm75add); |
7 | //Start Lesen des LM75, variable ist 1 wenn Vorgang fehlerhaft, sonst null
|
8 | |
9 | PORTB &= ~(1<<2); // zur Überprüfung das der Vorgang des Startens fertig ist |
10 | |
11 | if (variable == 0) |
12 | |
13 | {
|
14 | PORTB &= ~ (1<<7); // zum Anzeigen das Kommunikation |
15 | // funktioniert
|
16 | |
17 | _delay_ms(1000); |
18 | |
19 | msb_temp = i2c_readAck(); //obere Datenbits |
20 | lsb_temp = i2c_readNak(); //untere Datenbits |
21 | |
22 | |
23 | PORTB = 0xFF; // alle Leds ausschalten |
24 | |
25 | _delay_ms(3000); |
26 | PORTB = ~ lsb_temp; //LSbs anzeigen |
27 | |
28 | _delay_ms(3000); |
29 | |
30 | |
31 | }
|
32 | else { //Kommunikation ist fehlerhaft |
33 | |
34 | PORTB &= ~ (1<<5); |
35 | |
36 | }
|
37 | }
|
Der obige Code soll zunächst die Startcondition an die Adresse (mit Makro definiert lmadd) seden, dann die beiden Bytes lesen. Sowohl bei lsb, als auch bei msb bekomme ich jedoch die Adresse zurückgesendet. Ich habe bereits versucht durch Föhnen eine Temperaturänderung zu erhalten, allerdings funktioniert dies nicht; bis darauf gekommen bin, dass der LM immer die Adresse zurücksendet. Stell ich beim LM75 Makro (LM75add) die Adresse falsch ein, so spricht er mir auch nicht an! Daran kann es also nicht liegen! Vielen Dank für Eure Mühe!
:
Bearbeitet durch User
Juli An schrieb: > immer die Adresse zurücksendet. Stell ich beim LM75 Makro (LM75add) die > Adresse falsch ein, so spricht er mir auch nicht an! und im Makro hast du auch das Read/Write Bit richtig gesetzt?
- Welcher Controller? - Welche Port Beschaltung? - Taktfequenz? Und korrekt gesetzt? Am besten gleich ganzen Schaltplan ..... - woher kommen i2c_start(...), i2c_readAck(...), i2c_readNak(...) bzw wie sehen die aus? Immer diese Salamitaktik .... "Hilfe mein Auto fährt nicht, was soll ich tun?"
a) nimm mal die 1 Sekunde Pause zwischen Adresse und 1. Read raus (evtl. timed der Sensor aus). b) Kann der Sensor "repeated start"? Ansonsten Stop-Condition nicht vergessen.
Okay, ich werd mal versuchen auf alle Fragen zu antworten. Jap, im Makro hab ich das Read und Write Bit richtig gesetzt, der LM75 hat folgende Adresskonfigurationsmöglichkeiten 1001XXXR/W ich habe den LM75 auf 1001001R/W konfiguriert. Ich habe sowohl 0x92 (Read) als auch 0x93 (Write) versucht. Wobei mir ehrlich gesagt nicht ganz klar ist, was ich mit dem Write Modus bei einem Sensor bezwecken kann. Interessant ist vielleicht auch, dass ich wenn ich mit 0x92 schreibe bei MSB folgende Bitkombination bekomme: LSB : 10010010 MSB : 10010010 Bei 0x93 jedoch diese hier: LSB: 0111 1111 MSB: 0100 1011 DER LM75 arbeitet mit 8bit Registern, bzw. es gibt pro Temperaturwet 2byte informationen. Ich kann mir kaum vorstellen, dass der Sensor immer den gleichen Temperaturwert sendet :) Es handelt sich um einen ATmega Controller, hab da verschiedene ausprobiert, an denen kann es nicht liegen. SCL und SDL sind schließlich richtig verbunden und ich bekomme ja bei der Start Condition schon mal die richtige Antwort! Massen sind gekoppelt, die Pin Connections sind ebenfalls richtig! Einen Schaltplan habe ich nicht, den müsste ich erst zeichen, sorry. Taktfrequenz des Atmegas ist 16Mhz, die Taktrate von SCL habe ich auf 100khz eingestellt (über makro). Das mit der DElayzeit war ne gute Idee, an dem liegts aber leider nicht! Jap kann der Sensor also repeated start. Brauch ich die Stop Condition nicht erst nach Beenden der Kommunikation. Vielen Dank!
Hast du auch die 2.2K pullups nicht vergessen? Und Decoupling Capacitors (min. 100nF) am Sensor?
:
Bearbeitet durch User
Mic UC schrieb: > Wobei mir > ehrlich gesagt nicht ganz klar ist, was ich mit dem Write Modus bei > einem Sensor bezwecken kann. Lies das Datenblatt (Schreibzugriff auf Configuration Register) Mic UC schrieb: > Jap kann der Sensor also repeated start. Brauch ich die Stop Condition > nicht erst nach Beenden der Kommunikation. Lies das Datenblatt. Repeated Start wird verwendet, wenn du aus anderen Registern als dem default (Temp) Register lesen willst. Du brauchst also eine Stop-Condition nach dem Auslesen des LSB.
Mic UC schrieb: > Ich habe sowohl 0x92 (Read) als auch 0x93 (Write) versucht. Wobei mir > ehrlich gesagt nicht ganz klar ist, was ich mit dem Write Modus bei > einem Sensor bezwecken kann. Ich kann mich meinem Vorredner nur anschliessen: im Datenblatt steht es drin. Demnach wäre auch Lesen und Schreiben genau umgekehrt wie du die Bytes angegeben hast. Richtig ist also (binär): xxxx_xxx1 für Lesen und xxxx_xxx0 für Schreiben
Hallo zusammen
@ MIC
> ich habe den LM75 auf 1001001R/W konfiguriert.
Wirklich auf 1001-001-R/W ?
Also hast du dann A2 und A1 auf Gnd.
Hast du dann auch den Adresspin AO an +Ub?
Wenn nicht, das könnte der Fehler sein.
73
Wilhelm
Hallo ihr! ich hatte das Datenblatt eigentlich gelesen,das Projekt dann aber eine Woche zur Seite gelegt.... und scheinbar die wichtigsten Eigenschaften ausgeblendet. Wie blind kann man sein! Auf jeden Fall einen riesen Dank an euch, es lag tatsächlich an der Stop Condition und der falschen Addressierung!!! Bin ich erleichtert! Ihr habt mir echt den Abend gerettet, vielen vielen Dank für eure Geduld und eure Hilfe; jetzt hab ich wieder was hinzugelernt :) Immer wieder toll, wenn man so schnelle und nette Helfer zur Seite hat. ES FUNKTIONIERT!!! Dankeschön!
:
Bearbeitet durch User
Mic UC schrieb: > Immer wieder toll, wenn man so schnelle und nette Helfer zur Seite hat. > ES FUNKTIONIERT!!! Dann stell den funktionierenden Code(-ausschnitt) doch bitte auch hier rein. Der nicht funktionierende Mic UC schrieb: > Okay, dann poste ich mal ein bisschen Code: nützt niemandem so richtig.
Hier die Funktion zur Darstellung der Temperatur-MSBs auf dem PORTB mittels Leds :
1 | void temp_darstellung_test(void) |
2 | |
3 | {
|
4 | |
5 | PORTB &= ~(1<<0); // Initlicht |
6 | |
7 | uint8_t variable = i2c_start(lm75addresse); |
8 | //Start Lesen des LM75
|
9 | |
10 | |
11 | if (variable == 0) |
12 | |
13 | {
|
14 | PORTB &= ~ (1<<7); // LED zur Kommunikationsüberprüfung |
15 | |
16 | |
17 | msb_temp = i2c_readAck(); // oberes Bit |
18 | lsb_temp = i2c_readNak(); // unteres Bit |
19 | i2c_stop(); // muss unbedingt gesendet werden |
20 | |
21 | _delay_ms(300); //Wartezeit zur Visualisierung |
22 | PORTB = ~ msb_temp; // Ausgabe des MSB auf LEDs |
23 | |
24 | _delay_ms(300); |
25 | |
26 | PORTB = 0xFF; //Ausschalten aller LEDs |
27 | |
28 | _delay_ms(300); |
29 | |
30 | |
31 | }
|
32 | else { |
33 | //Wenn Kommunikation fehlgeschlagen ist
|
34 | |
35 | PORTB &= ~ (1<<5); // Led leuchtet |
36 | |
37 | |
38 | |
39 | }
|
40 | }
|
Info: Diese Datei ist nur ein Funktionscheck, die eigentliche Temperaturkonvertierung des MSB Byte und LSB Byte zu einer richtigen Temperatur muss noch vorgenommen werden! Zu beachten: vor der Funktionsausführung muss die Schnittstelle i2c erst initialisert werden, außerdem müssen auch die Headerfiles eingebunden sein! I2C Bibliotheken kann man sich entweder selbst basteln oder auf welche aus dem Netzt zurückgreifen!
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.