DECLARE FUNCTION LM75! () '-- lm75-min.bas ----------------------------------------------- >>fst'02<< - ' - liest den 9-Bit Temperatursensor LM75 ueber den Parallelport aus ' - Minimalbeispiel ' - Verbindungen: (Bauanleitung im Internet; s.u.) ' -- LM75 -- -- LPT ----------- -- Zweck ------------------------- ' Pin1 (SDA) --o-< Pin14 (AUTO FEED) = Datenleitung vom PC ' +-> Pin10 (ACKNOWLEDGE) = Datenleitung zum PC ' Pin2 (SCL) -< Pin 1 (STROBE) = Takleitung ' Pin3 (O.S.) nicht verbunden = Schaltausgang LM75 ' Pin4 (GND) - Pin18-25 (GND) = Masse ' Pin5 (A2) - Pin18-25 (GND) = Slave-Adress Einsteller 2 ' Pin6 (A1) - Pin18-25 (GND) = Slave-Adress Einsteller 1 ' Pin7 (A0) - Pin18-25 (GND) = Slave-Adress Einsteller 0 ' Pin8 (+Vs) - Pin 9 (DATA7) = Versorgungsspannung '-- V 20050411 ------------------------------- http://www.FrankSteinberg.de - DEFINT A-Z WIDTH 40 PRINT PRINT "LM75 am Parallelport >>fst'02<<"; DO LOCATE 13, 15 PRINT USING "####.#øC"; LM75! LOOP WHILE INKEY$ = "" FUNCTION LM75! 'Basisadresse (=Datenregister) des Parallelports aus BIOS-Datenbereich holen: DEF SEG = 0 BA0 = PEEK(&H408) + PEEK(&H409) * 256 'Basisadresse von LPT 1 'BA0 = PEEK(&H40A) + PEEK(&H40B) * 256 'Basisadresse von LPT 2 BA1 = BA0 + 1 'Status-Register an Offset 1 BA2 = BA0 + 2 'Steuer-Register an Offset 2 DIn = 64 'Bytewert fuer SDA -> ACKNOWLEDGE high ChDh = 0 'Bytewert fuer STROBE -> SCL high / AUTO FEED -> SDA high ClDh = 1 'Bytewert fuer STROBE -> SCL low / AUTO FEED -> SDA high ChDl = 2 'Bytewert fuer STROBE -> SCL high / AUTO FEED -> SDA low ClDl = 3 'Bytewert fuer STROBE -> SCL low / AUTO FEED -> SDA low 'Zwei Timerspruenge warten (55-110 ms): T1 = PEEK(&H46C): DO: LOOP WHILE T1 = PEEK(&H46C) T1 = PEEK(&H46C): DO: LOOP WHILE T1 = PEEK(&H46C) 'Spannungsversorgung EIN: OUT BA0, 128 'Spannungsversorgung fuer LM75 ein 'Grundstellung: OUT BA2, ChDl 'SCL high OUT BA2, ChDh 'SDA high 'Zwei Timerspruenge warten (55-110 ms): T1 = PEEK(&H46C): DO: LOOP WHILE T1 = PEEK(&H46C) T1 = PEEK(&H46C): DO: LOOP WHILE T1 = PEEK(&H46C) DEF SEG 'Start: OUT BA2, ChDl 'SDA low OUT BA2, ClDl 'SCL low 'Adressbyte senden: OUT BA2, ClDh 'Bit7 = 1 'Bit7/Bit6/Bit5/Bit4: feste Adresse des LM75 = 1001 OUT BA2, ChDh 'SCL high OUT BA2, ClDh 'SCL low OUT BA2, ClDl 'Bit6 = 0 OUT BA2, ChDl 'SCL high OUT BA2, ClDl 'SCL low OUT BA2, ClDl 'Bit5 = 0 OUT BA2, ChDl 'SCL high OUT BA2, ClDl 'SCL low OUT BA2, ClDh 'Bit4 = 1 OUT BA2, ChDh 'SCL high OUT BA2, ClDh 'SCL low OUT BA2, ClDl 'Bit3 = 0 'Bit1/Bit2/Bit3: variable Adresse des LM75, wie OUT BA2, ChDl 'SCL high 'Pin5/Pin6/Pin7 = A2/A1/A0 verbunden; hier = 000 OUT BA2, ClDl 'SCL low OUT BA2, ClDl 'Bit2 = 0 OUT BA2, ChDl 'SCL high OUT BA2, ClDl 'SCL low OUT BA2, ClDl 'Bit1 = 0 OUT BA2, ChDl 'SCL high OUT BA2, ClDl 'SCL low OUT BA2, ClDh 'Bit0 = 1 'Bit0: 0 = Master (PC) schreibt anschliessend OUT BA2, ChDh 'SCL high ' 1 = Master (PC) liest anschliessend OUT BA2, ClDh 'SCL low 'LM75 sendet Acknowledge (hier nicht ausgewertet): OUT BA2, ClDl 'SDA low OUT BA2, ChDl 'SCL high OUT BA2, ClDl 'SCL low 'Datenbyte 1 lesen: OUT BA2, ClDh 'SDA high OUT BA2, ChDh 'SCL high IF (INP(BA1) AND DIn) THEN ByteW = 128 OUT BA2, ClDh 'SCL low OUT BA2, ChDh 'SCL high IF (INP(BA1) AND DIn) THEN ByteW = ByteW + 64 OUT BA2, ClDh 'SCL low OUT BA2, ChDh 'SCL high IF (INP(BA1) AND DIn) THEN ByteW = ByteW + 32 OUT BA2, ClDh 'SCL low OUT BA2, ChDh 'SCL high IF (INP(BA1) AND DIn) THEN ByteW = ByteW + 16 OUT BA2, ClDh 'SCL low OUT BA2, ChDh 'SCL high IF (INP(BA1) AND DIn) THEN ByteW = ByteW + 8 OUT BA2, ClDh 'SCL low OUT BA2, ChDh 'SCL high IF (INP(BA1) AND DIn) THEN ByteW = ByteW + 4 OUT BA2, ClDh 'SCL low OUT BA2, ChDh 'SCL high IF (INP(BA1) AND DIn) THEN ByteW = ByteW + 2 OUT BA2, ClDh 'SCL low OUT BA2, ChDh 'SCL high IF (INP(BA1) AND DIn) THEN ByteW = ByteW + 1 OUT BA2, ClDh 'SCL low 'Acknowledge vom Master senden: OUT BA2, ClDl 'SDA low OUT BA2, ChDl 'SCL high OUT BA2, ClDl 'SCL low OUT BA2, ClDh 'SDA high 'Hoechstwertiges Bit vom 2. Datenbyte lesen: OUT BA2, ChDh 'SCL high IF (INP(BA1) AND 64) THEN BitW = 1 'Brutalversion; Spannung abklemmen (wir haben alle Daten): OUT BA0, 0 'Spannung AUS / SCL low 'Temperaturwert in øC erzeugen: IF (ByteW AND 128) THEN 'Vorzeichen-Bit (Byte1,Bit7) auswerten Tmp! = ByteW - 256 'Temperatur unter Null ELSE Tmp! = ByteW 'Temperatur Null oder drueber END IF IF BitW THEN Tmp! = Tmp! + .5 'Halbgrad-Bit (Byte2,Bit7) auswerten LM75! = Tmp! END FUNCTION