; ********************************************************************************* ; ; Ansicht von unten: DS18x20 ; ; GND DQ Vdd ; ----------- ; | 1 2 3 | ; \ / ; \_______/ ; ; ********************************************************************************* .equ DS18x20_DDR = DDRB ; DS18x20 .equ DS18x20_IN = PINB ; DS18x20 .equ DS18x20_PORT = PORTB ; DS18x20 .equ DS18x20 = PB0 ; DS18x20 ; ------------------------------------------- .equ CRC_Code = 0b10001100 ; Divisor 0b10001100 ; ldi Temp0, CRC_Code ; CRC Code definieren ; mov Divisor, Temp0 ; CRC 0b10001100 ; ********************************************************************************* .dseg Family_Code: .byte 1 ; Family_Code Serial_Number1: .byte 1 ; Serial_Number1 Serial_Number2: .byte 1 ; Serial_Number2 Serial_Number3: .byte 1 ; Serial_Number3 Serial_Number4: .byte 1 ; Serial_Number4 Serial_Number5: .byte 1 ; Serial_Number5 Serial_Number6: .byte 1 ; Serial_Number6 DS1829_CRC: .byte 1 ; CRC ROM_CRC: .byte 1 ; ROM_CRC OW_Temp_LSB: .byte 1 ; Temperature LSB OW_Temp_MSB: .byte 1 ; Temperature MSB Onewire_Data3: .byte 1 ; TH/User Byte 1 Onewire_Data4: .byte 1 ; TH/User Byte 2 Onewire_Data5: .byte 1 ; reserved Onewire_Data6: .byte 1 ; reserved Count_Remain: .byte 1 ; Count Remain 01 - 16 Count_per_C: .byte 1 ; Count per °C Onewire_Data9: .byte 1 ; CRC RAM_CRC: .byte 1 ; RAM_CRC .cseg ; ********************************************************************************* DS18x20_ROM: ; Read ROM-Command ; ********************************************************************************* rcall OW_RESET ; DS18x20 RESET ldi Temp3, 0x33 ; Temp3 rcall ONEWIRE_WR ; sende ein Kommando ; ------------------------------------------- ldi ZL, low(Family_Code) ; Zeiger auf Adresse ldi ZH, high(Family_Code) ldi Temp1, 8 ; ROM = 8 Byte ; ------------------------------------------- rcall DS18x20_RAM_ROM sts ROM_CRC, Curr_CRC_2 ; CRC Ergebnis ; ------------------------------------------- cbr Fehler_Bit, 1< SRAM: OW_Temp_LSB ... ; ********************************************************************************* ldi Temp3, 0xCC ; skip RAM Command rcall ONEWIRE_WR ; sende ein Kommando ldi Temp3, 0x44 ; convert Temperature Command rcall ONEWIRE_WR ; sende ein Kommando rcall Wait_480us ; Wait 480µs rcall OW_RESET ; DS18x20 RESET ldi Temp3, 0xCC ; skip ROM Command rcall ONEWIRE_WR ; sende ein Kommando ldi Temp3, 0xBE ; read scratchpad Command rcall ONEWIRE_WR ; sende ein Kommando ; ------------------------------------------- ldi ZL, low(OW_Temp_LSB) ; Zeiger auf Adresse ldi ZH, high(OW_Temp_LSB) ; ldi Temp1, 9 ; ROM = 9 Byte ; ------------------------------------------- rcall DS18x20_RAM_ROM sts RAM_CRC, Curr_CRC_2 ; CRC Ergebnis ; ------------------------------------------- cbr Fehler_Bit, 1< 7 LOOP_CRC: mov Temp1, Temp3 ; INTUT Curr_Byte_1 mov Temp2, Curr_CRC_2 ; OUTPUT Curr_CRC_2 lsr Temp3 ; /2 (Verschiebung nach rechts) lsr Curr_CRC_2 ; /2 (Verschiebung nach rechts) eor Temp1, Temp2 ; EXOR-Register ror Temp1 ; Durch Carry nach rechts drehen brcc NOT_EXAR ; Verzweigen, wenn Carry gelöscht ist eor Curr_CRC_2, Divisor ; Exklusive ODER-Register NOT_EXAR: dec Temp0 ; Zähler = 8 brne LOOP_CRC ; Loop wenn nicht letztes Bit erreicht pop Temp3 pop Temp1 ret ; ********************************************************************************* OW_RESET: ; DS18x20 RESET ; ********************************************************************************* ; ; _ ____ _______________ ; RESET | |////| |////////////| ; |________________________|////|_______|////////////| ; <--------480µs----------><-64µs->^--Wait Release--> ; ^ ; ^ ; Sample ;---------------------------------------------------------------------------------- cbi DS18x20_PORT, DS18x20 ; setze Output-Pin ==> 0 rcall Wait_480us ; Wait 480µs sbi DS18x20_PORT, DS18x20 ; setze Output-Pin ==> 1 cbi DS18x20_DDR, DS18x20 ; Pin auf Eingang setzen rcall Wait_70uS ; Wait 70µs sbr Fehler_Bit, 1< DS18x20 ; ********************************************************************************* ; _ ______________________________ ; Write 1 | | ; ------- |_____| ; <-2µS-><----------64 µs-------------> ; ;------------------------------------------------------------------ ; _ _ ; Write 0 | | ; ------- |__________________________________| ; <---------------64µs---------------> ; ;---------------------------------------------------------------------------------- ldi Temp0, 8 ; 8 Bit schreiben Sub_1WireWR: cbi DS18x20_PORT, DS18x20 ; setze Output-Pin ==> 0 rcall Wait_2us ; Wait 2uS ror Temp3 ; DS18x20_BYTE (Temp3) brcc Sub_1WireWR_1 sbi DS18x20_PORT, DS18x20 ; setze Output-Pin ==> 1 Sub_1WireWR_1: rcall Wait_70us ; Wait 70uS sbi DS18x20_PORT, DS18x20 ; setze Output-Pin ==> 1 rcall Wait_2us ; Wait 2uS dec Temp0 ; dec Bit brne Sub_1WireWR ; Loop (8) ret ; ********************************************************************************* ONEWIRE_RD: ; 1 BYTE => DS18x20_BYTE (Temp3) ; ********************************************************************************* ; _ _____________________________________________ ; READ | |///////////////////////////////////////////| ; |______|///////DS18B20 zieht auf Low/High//////////| ; <-2µs-><--4µs-->^<--------------64µs--------------> ; ^ ; ^ ; Sample ;------------------------------------------------------------------ ldi Temp0, 8 ; 8 Bit schreiben Sub_1WireRD: cbi DS18x20_PORT, DS18x20 ; 1-Wire Bus 0-setzen rcall Wait_2us ; Wait 2uS sbi DS18x20_PORT, DS18x20 ; 1-Wire Bus 1-setzen cbi DS18x20_DDR, DS18x20 ; Pin auf Eingang setzen rcall Wait_4us ; Wait 4uS clc sbic DS18x20_IN, DS18x20 ; Teste ob DS1820 den Bus auf 0 setzt sec ror Temp3 ; DS18x20_BYTE rcall Wait_45us ; Wait 45uS dec Temp0 ; dec Bit sbi DS18x20_DDR, DS18x20 ; Pin auf Ausgang setzen brne Sub_1WireRD ; Loop (8) ret ; *********************************************************************************