NOLIST .include "2313def.inc" .include "macro.inc" .include "include.inc" Start: rcall LED0_flash _uart_out_lpm abschluss rcall dly _uart_out_lpm luftrh ;kopfzeile cbi PORTD,Sens_clock ;init clock line sbi DDRD,Sens_clock sbi PORTD,Sens_data ;init data line sbi DDRD,Sens_data main: rcall LED0_flash ldi parameter, PD4 rcall GetTempAndHumid rcall berechne_werte rcall uart_out_sht11 _uart_out_lpm leerzeichen ;4x space ldi parameter, PD5 rcall GetTempAndHumid rcall berechne_werte rcall uart_out_sht11 _uart_out_lpm abschluss ;nächste zeile rjmp main .include "rcalls.inc" GetTempAndHumid: ;INIT PORT D cbi PORTD,Sens_clock ;init clock line sbi DDRD,Sens_clock sbi PORTD,Sens_data ;init data line sbi DDRD,Sens_data cli ;don't interrupt it rcall readsh11 ;read sensor tst trt ;timeout occurred? breq dp_out ;yes, out tst rhrt ;timeout occurred? breq dp_out ;yes, out ;now rh_high i stored at sram 0x80, rh_low at sram 0x81, t_high at 0x82, t_low at 0x83 ;se manual for info how to calculate temp and rel humid!!! rcall led0_flash dp_out: ; sei rcall led1_flash dp_ende: ret ;-------read humidity readsh11: clr trt ;trt for timeout clr rhrt ;rhrt for timeout rcall rdelay ldi counter,10 ;connection reset sequence re1: rcall chigh rcall clow dec counter brne re1 rcall chigh ;transmission start rcall dlow rcall clow rcall chigh rcall dhigh rcall clow ldi data_RxTx,0b00000101 ;send byte: command for 'check RH' rcall sendbyte ;wait for sensor ready re3: ldi zl,10 rcall g_wms sbis PIND,Sens_data rjmp re2 inc rhrt brne re3 ;räknare för hur många timeouts ;re4: rjmp reto ;sensor timed out (512 ms) ;här går den vid timedout så: rjmp out_readsh11 re2: rcall readbyte ;read one byte sts Start_of_temp_rh_data,data_RxTx ;save data cbi PORTD,Sens_data ;low output sbi DDRD,Sens_data ;output rcall rdelay rcall chigh rcall clow sbi PORTD,Sens_data ;use pullup cbi DDRD,Sens_data ;input rcall rdelay rcall readbyte ;readbyte sts Start_of_temp_rh_data+1,data_RxTx ;save data rcall chigh ;skip acknowlegde to end communication, (no crc-byte fetch) rcall clow sbi PORTD,Sens_data ;high output sbi DDRD,Sens_data ;output ;--------read temperature rcall chigh ;transmission start rcall dlow rcall clow rcall chigh rcall dhigh rcall clow ldi data_RxTx,0b00000011 ;send byte: command for 'check temp' rcall sendbyte ;wait for sensor ready rew3: ldi zl,10 rcall g_wms sbis PIND,Sens_data rjmp rew2 inc trt brne rew3 ;räknare för hur många timeouts ;rew4: rjmp reto ;sensor timed out (512 ms) ;här går den vid timedout så: rjmp out_readsh11 rew2: rcall readbyte ;read one byte sts Start_of_temp_rh_data+2,data_RxTx ;save data cbi PORTD,Sens_data ;low output sbi DDRD,Sens_data ;output rcall rdelay rcall chigh rcall clow sbi PORTD,Sens_data ;use pullup cbi DDRD,Sens_data ;input rcall rdelay rcall readbyte ;readbyte sts Start_of_temp_rh_data+3,data_RxTx ;save data ; cpi data_RxTx, 0 ; breq loko ;schlaf: ;rcall led0_on ;sleep ;loko: rcall chigh ;skip acknowlegde to end communication rcall clow out_readsh11: sbi PORTD,Sens_data ;high output sbi DDRD,Sens_data ;output ret ;-----------time out ;reto: movw xl,rel ;£ ; adiw xl,1 ;increase number of timeouts ;£ ; movw rel,xl ;£ ; ret ;------------ readbyte: ldi counter,8 ree1: clc ;Read bit sbic PIND,Sens_data sec rol data_RxTx rcall chigh rcall clow dec counter brne ree1 ret ;---------- sendbyte: ldi counter,8 ;send 8 bits se3: lsl data_RxTx brcc se1 rcall dhigh rjmp se2 se1: rcall dlow se2: rcall chigh rcall clow dec counter brne se3 ;release dataline sbi PORTD,Sens_data ;use pullup cbi DDRD,Sens_data ;input rcall rdelay clc ;check ack sbic PIND,Sens_data ;c=0: ack recieved sec ;c=1: ack not recieved in temp,sreg push temp rcall chigh ;flush ack bit rcall clow pop temp out sreg,temp ret g_wms: ldi timer,70 ;wait zl (1/10)msec (at 4MHz clock) g_wmsa: rcall g_wmsb nop nop nop nop nop dec timer brne g_wmsa dec zl brne g_wms g_wmsb: ret dlow: cbi PORTD,Sens_data ;set data low rjmp rdelay dhigh: sbi PORTD,Sens_data ;set data high rjmp rdelay clow: cbi PORTD,Sens_clock ;set clock low rjmp rdelay chigh: sbi PORTD,Sens_clock ;set clock high rdelay: ldi zl,1 rcall g_wms ret