Forum: Mikrocontroller und Digitale Elektronik Hilfe bei I2c Baustein


von Mic U. (micyourcontroller)


Lesenswert?

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!

von Pete K. (pete77)


Lesenswert?

Etwas mehr Infos bitte. Datenblatt schon gelesen?

von Karl H. (kbuchegg)


Lesenswert?

Juli An schrieb:

> Verstehe nicht wieso die Kommunikation da nicht funktioniert?

Wir auch nicht :)

Wird halt ein Fehler in deinem Programm sein.

von isidor (Gast)


Lesenswert?

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.

von Mic U. (micyourcontroller)


Lesenswert?

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
von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Ein i2c-Baustein sendet nie seine Adresse zurück.

von Karl H. (kbuchegg)


Lesenswert?

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?

von isidor (Gast)


Lesenswert?

- 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?"

von Joe F. (easylife)


Lesenswert?

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.

von Mic U. (micyourcontroller)


Lesenswert?

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!

von Joe F. (easylife)


Lesenswert?

Hast du auch die 2.2K pullups nicht vergessen?
Und Decoupling Capacitors (min. 100nF) am Sensor?

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

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.

von isidor (Gast)


Lesenswert?

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

von Wilhelm S. (wilhelmdk4tj)


Lesenswert?

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

von Mic U. (micyourcontroller)


Lesenswert?

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
von Werner M. (Gast)


Lesenswert?

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.

von Mic U. (micyourcontroller)


Lesenswert?

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
Noch kein Account? Hier anmelden.