Code:
;Temperatursensor auf PortX, X (Einstellbar)
.equ Wire1_DDR = DDRD
.equ Wire1_PORT = PORTD
.equ Wire1_PIN = PIND
.equ Wire1_IO = 4
;*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X
; Sensoradressen ermittlen
suche_Adressen:
rcall reset
rcall search_rom
ret
;_________________________________________________________
; Temperatur eines Sensors einlesen
read_Temperatur1:
rcall reset
rcall skip_rom
rcall convert_t
rcall reset
rcall skip_rom
rcall read_scratchpad
rcall reset
ret
;_________________________________________________________
; *** Behandelte Unterprogramme ***
;_________________________________________________________
; -reset
; -search_rom* ; Sucht alle angeschlossenen Slaves
; -read_rom ; Liest 64Bit Adresse aus (nur bei einem Slave möglich)
; -match_rom* ; Ansprechen eines bestimmten Slaves
; -skip_rom ; Ansprechen aller Slaves
; -Alarm_search* ; Wie search_rom, nur das alle Slaves mit Alarmen antworten
; -convert_t ; Veranasst den Sensor eine neue Messung zu starten
; -write_scratchpad*; Um einen Slave zu Programmieren (TH, TL, ConfigReg)
; -read_scratchpad ; Liest einen Sensor aus
; -copy_scratchpad* ; Schreibt konfiguration einens Sensors in EEPROM
; -RecallEE* ; Keine Ahnung für was man das jemals braucht
; -Read_Power_Supply*;Keine Ahnung für was man das jemals braucht
; *... noch nicht fertig
;*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X
; Reset Impuls
reset:
sbi Wire1_DDR, Wire1_IO
cbi Wire1_PORT, Wire1_IO
rcall Wait_500us
cbi Wire1_DDR, Wire1_IO
rcall Wait_70us
wait_puls:
sbic Wire1_PIN, Wire1_IO
rjmp wait_puls ;falls bus high zurück
wait_puls_end:
sbis Wire1_PIN, Wire1_IO
rjmp wait_puls_end ;falls bus low zurück
ret
;_________________________________________________________
; Suche
search_rom:
rcall reset
;!?!
ret
;_________________________________________________________
; alle Sensoren
skip_rom:
ldi temp, 0xCC
rcall write_command ;read or write
ret
;_________________________________________________________
; Ein bestimmter Sensor
match_rom:
; !?!
ret
;_________________________________________________________
; read rom 64bits=8byte
read_rom:
ldi temp, 0x33
rcall write_command
; 64Bit abspeichern
ret
;_________________________________________________________
; read_scratchpad(auslesen der 9byte)
read_scratchpad:
ldi temp, 0xBE
rcall write_command
rcall lesen
ret
;_________________________________________________________
; Convert---T temperaturmessung starten im ds
convert_t:
ldi temp, 0x44
rcall write_command
rcall Wait_6us
cbi Wire1_DDR, Wire1_IO
rcall Wait_9us
; rcall w750ms ;unterdrückung 85.00 im disp.
convert_t1:
sbis Wire1_PIN, Wire1_IO
rjmp convert_t1
ret
;*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X
; Unterprogramme
; auslesen
lesen:
rcall read_bit ;0
sts temp_lsb,temp3
rcall read_bit ;1
sts temp_msb,temp3
rcall read_bit ;2
sts th_register,temp3
rcall read_bit ;3
sts tl_register,temp3
rcall read_bit ;4
sts res_byte4,temp3
rcall read_bit ;5
sts res_byte5,temp3
rcall read_bit ;6
sts count_remain,temp3
rcall read_bit ;7
sts count_per_c,temp3
rcall read_bit ;8
sts crc,temp3
ret
;_________________________________________________________
; Unterprogramme
write_command:
ldi temp2, 0x08
write_command1:
sbrs temp,0
rcall write_0
sbrc temp,0
rcall write_1
ror temp
dec temp2
brne write_command1
ret
write_1:
cbi Wire1_PORT, Wire1_IO
sbi Wire1_DDR, Wire1_IO
rcall Wait_6us
cbi Wire1_DDR, Wire1_IO
rcall Wait_64us
ret
write_0:
cbi Wire1_PORT, Wire1_IO
sbi Wire1_DDR, Wire1_IO
rcall Wait_60us
cbi Wire1_DDR, Wire1_IO
rcall Wait_10us
ret
;_________________________________________________________
read_bit:
clr temp3 ;datenwort in temp3
ldi temp4, 0x08
read_bit0:
ror temp3
cbi Wire1_PORT, Wire1_IO
sbi Wire1_DDR, Wire1_IO
rcall Wait_6us
cbi Wire1_DDR, Wire1_IO
rcall Wait_9us
sbis pind,0
rjmp read_bit1 ;0 lesen
ldi temp2, 0x80 ;1 lesen
add temp3,temp2
rjmp read_bit2
read_bit1:
ldi temp2, 0x00
add temp3,temp2
read_bit2:
rcall Wait_55us
dec temp4
brne read_bit0
ret
im Hauptprogramm muss man zusätzlich noch die SRAM speicheradressen initialisieren, und temp-temp4.
Lesezeichen