Hallo,
Zitat von
zwanzischmark
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.
Code:
'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
Lesezeichen