;programm für 2313 @ 8MHz zur ansteuerung eines ds18s20-temp-sensors (bzw ds1820) ;anschluss des ds18s20an pind0 ;an den ds1820 müss noch ein pull-up widerstand von 4,7kohm nach +5V ; angeschlossen werden .include "d:\avr\2313def.inc" .def befehl = r0 ;enthält den auszugebenden 8bit-befehl .def temp1 = r16 .def temp2 = r17 .def temp3 = r18 .def delay1 = r19 .def delay2 = r20 .def delay3 = r22 .equ temperature_lsb = 0x060 ;speicherstellen definieren .equ temperature_msb = 0x061 .equ TH_register = 0x062 .equ TL_register = 0x063 .equ res_byte4 = 0x064 .equ res_byte5 = 0x065 .equ count_remain = 0x066 .equ count_per_c = 0x067 .equ crc = 0x068 reset: ldi temp1, 0 ;register und speicherstellen auf 0 ldi temp2, 0 ldi temp3, 0 ldi delay1, 0 ldi delay2, 0 sts temperature_lsb, temp1 sts temperature_msb, temp1 sts TH_register, temp1 sts TL_register, temp1 sts res_byte4, temp1 sts res_byte5, temp1 sts count_remain, temp1 sts count_per_c, temp1 sts crc, temp1 ldi temp1, ramend ;stack einrichten out spl, temp1 ser temp1 out ddrb, temp1 ;portb als ausgang fürs lcd ;****************************************************************************** ; Hauptschleife ;****************************************************************************** main: rcall reset_pulse rcall skip_rom rcall convert_t rcall reset_pulse rcall skip_rom rcall read_scratchpad rcall reset_pulse ;jetzt müssten die werte in den ;entsprechenden speicherstellen stehen main1: rjmp main1 ;****************************************************************************** ;****************************************************************************** ;ds18s20 routinen ;****************************************************************************** reset_pulse: sbi ddrd, 0 ;pd0 als ausgang cbi portd, 0 rcall wait500us ;mcu hält bus für mindestens 480us low cbi ddrd, 0 ;lässt den bus los, geht in rx-mode rcall wait70us ;wartet 70 us wait_presence_pulse: sbic pind, 0 rjmp wait_presence_pulse ;wartet auf presence pulse wait_presence_pulse_end: sbis pind, 0 rjmp wait_presence_pulse_end ;wartet bis presence pulse fertig rcall wait410us ;wartet 412 us ret ;****************************************************************************** write_1: ;schreibt eine 1 cbi portd, 0 sbi ddrd, 0 ;bus auf low rcall wait6us ;wartet 8us (maximum sind 15us) cbi ddrd, 0 ;lässt bus los, nun durch ext R auf high rcall wait64us ;slot muss mind. 60us lang sein ret ;****************************************************************************** write_0: ;schreibt eine 0 cbi portd, 0 sbi ddrd, 0 ;bus auf low rcall wait60us cbi ddrd, 0 ;lässt bus los, nun durch ext R auf high rcall wait10us ;slot muss mind. 60us lang sein ret ;****************************************************************************** write_command: ;gibt einen befehl aus, lsb zuerst sbrs befehl, 0 rcall write_0 sbrc befehl, 0 rcall write_1 ror befehl ;nächstes bit ldi temp1, 7 write_command_1: sbrs befehl, 0 rcall write_0 sbrc befehl, 0 rcall write_1 ror befehl dec temp1 brne write_command_1 ret ;****************************************************************************** skip_rom: ;gibt den befehl "Skip Rom" an den ldi temp1, 0xCC ; sensor aus mov befehl, temp1 rcall write_command ret ;****************************************************************************** convert_t: ;gibt den befehl "Convert T" an den ldi temp1, 0x44 ; sensor aus mov befehl, temp1 rcall write_command cbi portd, 0 sbi ddrd, 0 ;bus low für 6us rcall wait6us cbi ddrd, 0 ;bus loslassen rcall wait9us ;nach 9us samplen convert_t_1: sbis pind, 0 ;wartet bis conversion zu ende ist rjmp convert_t_1 ret ;****************************************************************************** read_scratchpad: ;gibt den befehl "Read Scratchpad" ldi temp1, 0xBE ; an den sensor aus mov befehl, temp1 rcall write_command rcall read_bit ;nach dem befehl werden alle 9 byte sts temperature_lsb, temp3 ; geschickt und eingelesen rcall read_bit sts temperature_msb, temp3 rcall read_bit sts TH_register, temp3 rcall read_bit sts TL_register, temp3 rcall read_bit sts res_byte4, temp3 rcall read_bit sts res_byte5, temp3 rcall read_bit sts count_remain, temp3 rcall read_bit sts count_per_c, temp3 rcall read_bit sts crc, temp3 ret ;***************************************************** read_bit: ldi temp3, 0 ;temp3 auf 0 ldi temp1, 8 ;8mal durchführen read_bit_0: ror temp3 cbi portd, 0 sbi ddrd, 0 ;bus low für 6us rcall wait6us cbi ddrd, 0 ;bus loslassen rcall wait9us ;nach 9us samplen sbis pind, 0 ;schaut nach ob nun eine 0 anliegt rjmp read_bit_1 ;wenn ja, springe weiter ldi temp2, 128 add temp3, temp2 rjmp read_bit_2 read_bit_1: ldi temp2, 0 add temp3, temp2 read_bit_2: rcall wait55us dec temp1 brne read_bit_0 ;zum schluss steht das fertige byte in tmp3 ret ;****************************************************************************** wait500us: ldi delay2, 6 ldi delay1, 200 wait500us_1: inc delay1 brne wait500us_1 dec delay2 brne wait500us_1 ret ;****************************************************************************** wait410us: ldi delay2, 5 ldi delay1, 185 wait410us_1: inc delay1 brne wait410us_1 dec delay2 brne wait410us_1 ret ;****************************************************************************** wait70us: ldi delay1, 185 wait70us_1: dec delay1 brne wait70us_1 ret ;****************************************************************************** wait64us: ldi delay1, 170 wait64us_1: dec delay1 brne wait64us_1 ret ;****************************************************************************** wait60us: ldi delay1, 160 wait60us_1: dec delay1 brne wait60us_1 ret ;****************************************************************************** wait55us: ldi delay1, 141 wait55us_1: dec delay1 brne wait55us_1 ret ;****************************************************************************** wait10us: ldi delay1, 26 wait10us_1: dec delay1 brne wait10us_1 ret ;****************************************************************************** wait6us: ldi delay1, 13 wait6us_1: dec delay1 brne wait6us_1 nop nop ret ;****************************************************************************** wait9us: ldi delay1, 21 wait9us_1: dec delay1 brne wait9us_1 nop nop ret ;******************************************************************************