Weet iemand hoe ik de gegevens van een temperatuursensor, de LM75 of TCN75, via de I²C bus in mn uC krijg en hoe ik dat "opsla" in registers, in C of C++?

Hartelijk bedankt

Kay van Wonderen

P.S. Ik programmeer de MSC1210 van Texas Instruments.

;
;
; Temperatursensor lesen
; Highteil Temperaturwert in R0 , Halbgradbit in A
;
TEL:
LCALL IIC_START ;Startcondition
MOV A,#90H ;Schreibadresse LM 75
LCALL WRITE ;schreiben
MOV A,#00H ;Adresspointer auf Tempwert
LCALL WRITE ;schreiben
LCALL STOP ;Stopcondition
LCALL IIC_START ;Startcondition
MOV A,#91H ;Leseadresse LM 75
LCALL WRITE ;schreiben
LCALL READack ;Temperaturwert lesen
MOV R0,A ;Highwert Temperatur
LCALL READ ;Lowwert Temperatur lesen
LCALL STOP ;Stopcondition
RET
;
; Startcondition fuer den I2C Bus
;
IIC_START:
JNB SCL,IIC_START ;warten auf SCL = high also freigegeben
JNB SDA,IIC_START ;warten auf SDA = high also freigegeben
CLR SDA ;SDA auf Low
LCALL W2US ;Pause 2 us
CLR SCL ;SCL auf Low
LCALL W2US ;Pause 2 US
RET
;
; Stoppcondition fuer den I2C Bus
;
STOP:
CLR SDA ;SDA auf Low
LCALL W2US ;warten 2us
SETB SCL ;SCL auf High
LCALL W2US ;warten 2 us
SETB SDA ;SDA auf High
LCALL W2US ;warten 2 us
RET
;
; Schreiben eines Bits B = Zaehlregister
; Das zu schreibende Bit steht in A
; Es wird danach das ACK gelesen
;
WRITE:
MOV B,#08H ;8 Bits
NWB:
RLC A ;Ausgabebit nach Carry
LCALL W2US
CLR SCL
LCALL W2US
MOV SDA,C ;Bit ausgeben
LCALL W2US ;warten
SETB SCL ;SCL auf High
LCALL W2US ;warten
DJNZ B,NWB ;naechstes Bit
WACK:
CLR SCL
LCALL W2US
SETB SDA ;SDA fuer Bestaetigung setzen
LCALL W2US ;warten
SETB SCL ;Takt fuer ACK
LCALL W2US ;warten
JB SDA,FAIL ;
CLR SCL ;Takt zurueck
LCALL W2US ;warten
RET
;gegenwaertig ohne Fehlerbehandlung
;
FAIL:
CLR SCL
LCALL W2US
CLR SDA
RET
;
; Lesen eines Bytes vom I2C Bus
; B wird als Hilfsregister verwendet
; Wert steht in A
;
READ:
MOV B,#08H ;1 Byte = 8 Bits
NRD:
LCALL W2US
SETB SCL ;Takt auf Low
LCALL W2US ;warten
MOV C,SDA ;Datenltg lesen
RLC A ;A schieben
CLR SCL ;Takt wieder auf High
LCALL W2US ;warten
DJNZ B,NRD ;naechstes Bit
LCALL W2US ;warten
ARD:
SETB SDA
LCALL W2US
SETB SCL ;Takt auf Low
LCALL W2US ;warten
MOV C,SDA ;Ack Bit lesen
LCALL W2US ;warten
CLR SCL ;Takt fuer Acknowledge
LCALL W2US ;warten
RET
;
; Lesen eines Bytes vom I2C Bus
; B wird als Hilfsregister verwendet
; Wert steht in A
; mit ack vom master
;
READack:
MOV B,#08H ;1 Byte = 8 Bits
NRDack:
LCALL W2US
SETB SCL ;Takt auf Low
LCALL W2US ;warten
MOV C,SDA ;Datenltg lesen
RLC A ;A schieben
CLR SCL ;Takt wieder auf High
LCALL W2US ;warten
DJNZ B,NRDack ;naechstes Bit
LCALL W2US ;warten
ARDack:
clr SDA
LCALL W2US
SETB SCL ;Takt auf Low
LCALL W2US ;warten
LCALL W2US ;warten
CLR SCL ;Takt fuer Acknowledge
LCALL W2US ;warten
setb SDA
RET
;
; kurze Pause von 2 us
;
W2US:
NOP
NOP
RET

Helaas geen C, maar ASM.