PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit I2C und LM75



Mad-Onion
05.05.2006, 12:59
Hallo Forum!

Nachdem ich gestern angefangen hab, mich mit I2C zu beschäftigen, steh ich jetzt schon vor einem Problem :(

Ich habe versucht, den LM75 am I2C zum laufen zu bekommen, angesprochen soll das ganze über Bascom werden (nach dieser Anleitung (https://www.roboternetz.de/wissen/index.php/Sensorarten#Temperatur)).

Angeschlossen hab ich das ganze über ein selbstgefrickeltes Adapterkabel am RN-Conrol:

https://www.roboternetz.de/wissen/images/d/d9/Lm75.gif

Pin 1 vom Board an Pin 2 vom LM75
Pin 2 an Pin 4
Pin 3 an Pin 1
Pin 5 an Pin 8
Pin 5 / 6 / 7 am LM75 hab ich auf 5V gelegt, somit sollte die Adresse ja 1001111 lauten, in Hex: 4F

Pin 1 und 3 gehen jeweils über 2,2k auf +5V

Tja, soweit so gut! Nur liefert mir das Bascom-Beispielprogramm immer 9999 zurück, also ein Fehler beim Ansprechen des LM7!?

Hat irgendjemand eine Idee, wo der Fehler liegen kann?



Gruß
Tobias

PicNick
05.05.2006, 13:23
1001111 lauten, in Hex: 4F

Is nicht so ganz. Eigentlich


10011110 lauten, in Hex: 9E (write) 9F (read)

Mad-Onion
05.05.2006, 13:36
Ich benutze diesen Code:


dim Ival as integer
dim Msb as byte
dim Lsb as byte
I2cstart
I2cwbyte &H91 ' Lese-adresse !
If Err = 1 Then
I2cstop ' kein ACK vom LM75 --> irgendein Fehler
Ival = 9999 ' Zeichen, daß der Wert ungültig ist !
Else
I2crbyte Msb , Ack
I2crbyte Lsb , Nack
I2cstop
If Msb.7 = 1 Then
Ival = Makeint(msb , &HFF) ' auffüllen mit den Vorzeichen bits
Else
Ival = Makeint(msb , &H00) ' positiv, also bleibt es so
End If
Ival = Ival * 10 ' erweitern
If Lsb.7 = 1 Then
Ival = Ival + 5 ' fünf Zehntel Grad dazu
End If
End if
wobei ich "I2cwbyte &H91" durch "I2cwbyte &H9E" und auch "I2cwbyte &H9F" ersetzt habe.
In beiden fällen kam als Wert für Ival nur 9999... daran scheint es also nicht zu liegen.

Ist die Verdrahtung wie im 1ten Post beschrieben denn soweit korrekt?

PicNick
05.05.2006, 13:51
Nun, RN-Control hab ich nicht, weiss also die Pin-Nummern nicht, aber zur kontrolle und Vergleich
LM75-1....I2CDATA=SDA
LM75-2....I2CTAKT=SCL
LM75-3....frei lassen
LM75-4....GND
LM75-5....+5V für &H9E
LM75-6....+5V für &H9E
LM75-7....+5V für &H9E
LM75-8....+5V

Zum Auslesen der Temp also I2cwbyte &H9F

Config Scl = Portc.0 'Ports fuer IIC-Bus MEGA32
Config Sda = Portc.1 'Ports fuer IIC-Bus MEGA32

I2CInit ist auch da ?

Mad-Onion
05.05.2006, 14:07
Besten Dank, Robert!


Config Scl = Portc.0 'Ports fuer IIC-Bus MEGA32
Config Sda = Portc.1 'Ports fuer IIC-Bus MEGA32

Daran hätte ich denken sollen ;) Vielleicht sollte das jemand in dem Bascom Beispiel im Wiki ergänzen!

Jetzt bekomme ich zwar einen Wert übergeben, jedoch erscheinen mir -5 Grad bei dem Wetter ziemlich unrealistisch ;)
Hat da jemand eine Idee, woran DAS schonwieder liegen mag?

PicNick
05.05.2006, 15:06
Fällt mir momentan nix ein, denn wenn der LM75 seine Adresse richtig mitkriegt und sein Ack schickt (Err = 0) , sollten die Daten auch stimmen.
Eventuell, schad' nix:
Config I2cdelay = 5
damit den Bus nicht zuuuu schnelle ist. (Bin aber skeptisch)

Noch ein Tip: ganz vorne im Programm
$LIB "I2C_TWI.LBX"
einfügen, dann nimmt er die Hardware-I2C statt der Software.
da mußt du dann aber schreiben
CONFIG TWI = 100000 (für 100 kHz)

config scl etc. kann dann entfallen

Mad-Onion
05.05.2006, 15:10
Danke schonmal!

Habs grad mal auf die Schnelle eingebaut, jetzt misst er -975 Grad :D

Ich werd nachher nochmal alles kontrollieren, muss jetzt erstmal weg...

edit:
Ich dreh langsam am Rad... hier mal der komplette Code, der mir -975 zurückliefert...



$regfile = "m32def.dat"
$crystal = 16000000

'Config Scl = Portc.0 'Ports fuer IIC-Bus MEGA32
'Config Sda = Portc.1 'Ports fuer IIC-Bus MEGA32
Config I2cdelay = 5
CONFIG TWI = 100000

$LIB "I2C_TWI.LBX"


Print "Let's go!"

Do
Dim Ival As Integer
Dim Msb As Byte
Dim Lsb As Byte
I2cstart
I2cwbyte &H9E ' Lese-adresse !
If Err = 1 Then
I2cstop ' kein ACK vom LM75 --> irgendein Fehler
Ival = 9999 ' Zeichen, daß der Wert ungültig ist !
Else
I2crbyte Msb , Ack
I2crbyte Lsb , Nack
I2cstop
If Msb.7 = 1 Then
Ival = Makeint(msb , &HFF) ' auffüllen mit den Vorzeichen bits
Else
Ival = Makeint(msb , &H00) ' positiv, also bleibt es so
End If
Ival = Ival * 10 ' erweitern
If Lsb.7 = 1 Then
Ival = Ival + 5 ' fünf Zehntel Grad dazu
End If
End If
Print Ival
Wait 2
Loop

Ist da irgendwo ein Fehler den ich nicht finde, oder ist etwa der LM75 defekt?!