PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LM75 auslesen... was ist falsch



zwanzischmark
24.02.2005, 14:27
Hallo,

ich habe einen LM75 Temperatursensor und ein Programm was eigentlich für einen PCF8574 etwas angepasst. Sollte ja von der Idee kein Problem sein, aber es funktioniert nicht wirklich. Vielleicht kann jemand von euch mal drüberschauen, oder mir sagen ob das Program was ich umgeformt hat im ursprung überhaupt funktioniert. Hier ist das Programm:


DEFINE PCFDaten byte
define Zaehler byte
define N byte
define SDA port[9]
define SCL port[10]

SDA = ON
SCL = ON

#schleife
gosub I2C_start
pcfdaten = 144
gosub I2C_schreiben
pcfdaten = 0
gosub I2C_schreiben
gosub I2C_stop
gosub I2C_start
pcfdaten = 145
gosub I2C_schreiben
gosub I2C_lesen
Print "-";
gosub I2C_lesen
print
gosub NoAcknoledgement
gosub I2C_stop
pause 500
GoTo schleife

#I2C_start
SDA = OFF
SCL = OFF
Return

#I2C_stop
SDA = OFF
SCL = ON
SDA = ON
Return

#I2C_schreiben
For N = 1 To 8
SDA = OFF
if (pcfdaten AND 128) = 128 then SDA = ON
pulse SCL
pcfdaten = pcfdaten shl 1 '1 Bit nach links
Next
pulse SCL
Return

#I2C_lesen
pcfdaten = 0
deact SDA ' SDA = Eingang
For N = 1 To 8
pcfdaten = pcfdaten shl 1 '1 Bit nach links
SCL = ON
If SDA Then pcfdaten = pcfdaten + 1
if SDA then Print 1; Else Print 0;
SCL = OFF
Next
Return

#acknowlege
SDA = 0
pulse SCL
Return

#NoAcknoledgement
SDA = 1
pulse SCL
Return

END


danke schonmal für die hilfe =)

Paul

hrei
24.02.2005, 15:47
Hallo,


Hallo,
ich habe einen LM75 Temperatursensor und ein Programm was eigentlich für einen PCF8574 etwas angepasst.


So wird das nix. Passe mal das untenstehende Programm an Deine Bedürfnisse an. Ist von mir zwar für die Micro und den DS 1621/1631 geschrieben, das macht aber in Bezug auf den Sensor keinen Unterschied.
Die SDA/SCL Ports müssen natürlich zurechtgebogen werden
Ach so, es wird Basic++ benutzt, was ich nur jedem empfehlen kann.



'Test für I2C mit Dallas Temperatursensor
'
'
'---- Variablen definieren-----------------------------------------

option ccmicro


define DEV byte
define TEMP byte
define DATA byte
define mask byte
define temperatur byte
define value byte
define nullkomma byte
define flow byte
define i byte
define j byte

define TxD port[1]
define RxD port[2]
define test_ad ad[2]
define taster port[3]
define freqport port[4]
define SCL port[5]
define SDA port[6]

declare FUNCTION IICSEND(d ref DATA)
declare FUNCTION IICREAD()
declare function ACKN()
declare FUNCTION IICSTART()
declare FUNCTION IICSTOP()
declare FUNCTION NACKN()
declare FUNCTION Verzoegerung()

declare function READTEMP()

#INIT
baud r9600
freq = 150 'Torzeit = 3 sek
SDA = off
SCL = off

IICSTOP()

put 0
pause 300
print
print"Micro-Test - 2 sek warten"
pause 200

'--------- HAUPTPROGRAMM -----------------------------------------

#main

'#read1621_1
DEV=158
READTEMP()
print value; & ",";
if nullkomma = 128 then print "5" else print "0"
verzoegerung()
flow = freq
print flow
deact rxd
j = test_ad
print j

goto main
'----------------------------

function READTEMP()

IICSTART()
IICSEND(dev)
IICSEND(EEh) 'Temperaturmessung anstoßen
IICSTOP

IICSTART()
IICSEND(dev)
IICSEND(AAh) 'Temperaturmessung Lesekommando
IICSTOP()

IICSTART()
IICSEND(dev+1)
IICREAD() 'LSB holen
ACKN()
value = data

IICREAD() 'MSB holen
NACKN()
nullkomma = data

IICSTOP()

END FUNCTION



FUNCTION IICSTART()

SDA=off
SCL=off
END FUNCTION
'-------------------------------------------
FUNCTION IICSTOP()

SDA=off
SCL=on
SDA=on
END FUNCTION
'-------------------------------------------
FUNCTION IICREAD()
deact SDA
DATA=0
MASK=80h
#INSHIFT
SCL=on
if SDA=on then DATA=(DATA or MASK)
SCL=off
MASK=MASK shr 1
if MASK <>0 then goto INSHIFT


'---- 9. Takt für ACKN bzw. NACKN ---------

'ACHTUNG! Je nach Erfordernis (letzte Leseoperation
'bei sequenziellem lesen?) muss danach ACKN oder NACKN
'aufgerufen werden! Daher ist (N)ACKN hier NICHT
'Bestandteil der Funktion!

END FUNCTION

'------------------------------------------

FUNCTION IICSEND(d ref DATA)
MASK=80h
#OUTSHIFT
SDA=(DATA and MASK)
SCL=on
SCL=off
MASK=MASK shr 1
if MASK<>0 then goto OUTSHIFT
'---- 9. Takt für ACKN -------------------
deact SDA
SCL = on
SCL = off
i = not SDA 'ackn?
SDA= off

end function
'------------------------------------------

function ACKN()
SDA = OFF
TOG SCL
TOG SCL
END FUNCTION

function NACKN()
SDA = ON
TOG SCL
TOG SCL
END FUNCTION

'-------------------------------------------------------------------
FUNCTION Verzoegerung()
for i = 1 to 128
for j = 1 to 255
next j
next i
END FUNCTION
'-------------------------------------------------------------------
end


Für die M-Unit V2 finden sich weitere Beispiele auf meinen Seiten.
http://www.henrik-reimers.de/control/

Viele Grüße
Henrik

zwanzischmark
24.02.2005, 19:31
hi,

ich hab mal deine funktionen zum lesen und schreiben übernommen, der Rest ist ja ohnehin gleich. Beim LM75 kann ja sofort gelesen werden ohne das vorher ein aufruf zum lesen gesendet werden muss. Leider hat sich nichts geändert. Ich bekomme mehr oder weniger wilde zahlen raus. Hat jemand ne idee?

Paul

hrei
24.02.2005, 23:10
hi,

ich hab mal deine funktionen zum lesen und schreiben übernommen, der Rest ist ja ohnehin gleich. Beim LM75 kann ja sofort gelesen werden ohne das vorher ein aufruf zum lesen gesendet werden muss. Leider hat sich nichts geändert. Ich bekomme mehr oder weniger wilde zahlen raus. Hat jemand ne idee?


Upps, der LM75 unterscheidet sich in der Ansteuerung ja doch deutlich vom 1621/31. Habe mir gerade das Datenblatt abngesehen.



#schleife
gosub I2C_start
pcfdaten = 144
gosub I2C_schreiben
pcfdaten = 0
gosub I2C_schreiben
gosub I2C_stop '-----<------ lass' das mal weg
gosub I2C_start '-----<------ hier kommt ein reapeated start zum Zuge
pcfdaten = 145
gosub I2C_schreiben
gosub I2C_lesen

'hier möchtest du doch vermutlich das MSB ausgeben, also
print pcfdaten


Print "-";
gosub I2C_lesen
'nun möchtest du das LSB augeben also wieder
print pcfdaten

print
gosub NoAcknoledgement
gosub I2C_stop
pause 500
GoTo schleife


Es ist etwas schwierig, in unvollständigen, schlecht kommentierten Listings auf Fehlersuche zu gehen.

Güße
Henrik

zwanzischmark
25.02.2005, 09:03
OK ich poste nochmal den abgeänderten Code. Habe versucht das was von mir ist zu kommentieren.
Ich hab jetzt ausserdem mal alles unötige weggelassen, weil der LM75 ja im Templesemodus startet müsste ja eigentlich Leseadresse Senden + 2x Lesen ausreichen. Ich hab mir auch schon mehrere andere Codes die nicht für die C-Control sind angesehen, aber leider werde ich daraus auch nicht schlauer. Ich bekomme als Ausgabe einfach wild wechselde Zahlen :?



DEFINE Daten byte
define Zaehler byte
define N byte
define i byte
define Mask byte
define SDA port[15]
define SCL port[16]

SDA = OFF
SCL = OFF
gosub I2C_stop

#schleife
gosub I2C_start
Daten = 145 'Adresse(zum Lesen) schreiben
gosub I2C_schreiben
gosub I2C_lesen 'MSB Lesen
gosub acknowlege
print Daten; 'MSB Ausgeben
Print "-"; '"MSB-LSB" (nur zum testen)

gosub I2C_lesen 'LSB lesen
gosub NoAcknoledgement
print Daten; 'LSB ausgeben (schon klar das die Ausgabe
print 'von LSB nicht richtig ist aber ich teste ja nur)
gosub I2C_stop
pause 200
GoTo schleife

#I2C_start
SDA = OFF
SCL = OFF
Return

#I2C_stop
SDA = OFF
SCL = ON
SDA = ON
Return

#I2C_schreiben
Mask = &H80
#OUTSHIFT
SDA=(Daten and Mask)
SCL = ON
SCL = OFF
Mask = Mask shr 1
if Mask <> 0 then goto OUTSHIFT
'---- 9. Takt für ACKN -------------------
deact SDA
SCL = ON
SCL = OFF
i = not SDA 'ackn?
SDA= OFF
Return

#I2C_lesen
deact SDA
Daten = 0
Mask = &H80
#INSHIFT
SCL = ON
if SDA = ON then Daten = (Daten or Mask)
SCL = OFF
Mask = Mask shr 1
if Mask <> 0 then goto INSHIFT
Return

#acknowlege
SDA = OFF
TOG SCL
TOG SCL
Return

#NoAcknoledgement
SDA = ON
TOG SCL
TOG SCL
Return

END

hrei
25.02.2005, 16:02
Hallo,

kurz und knapp:

am Programm kann es nun nach menschlichem Ermessen nun nicht mehr liegen.

Bleiben die üblichen anderen Verdächtigen:

Adresseinstellung in Übereinstimmung mit der Hardware?

Wird der Chip angesprochen? (ACK nach dem ersten Schreibbefehl abfragen und nachsehen ob ein ACK gesendet wurde).


Allfällige sonstige Lötfehler (bei LM75 mit seiner Winzbauart nicht ungewöhnlich).

Grüße
Henrik, dem nun auch nicht mehr einfällt.

zwanzischmark
26.02.2005, 10:53
hi,

danke für die Hilfe, aber ich griegs nicht hin...

Adresse sollte mit A0,A1,A2 an GND mit 145 zum lesen richtig sein

Angelötet ist das ding auch richtig (kann sein das es davon auch kaputt is!?!)

und das mit dem ACK war ja in deinem Programm schon drin das gibt mir 255 nach dem Adresse schreiben aus. Komischerweise grieg ich mitlerweile als Temp jetzt nur noch 0 raus...