Tere,
Käsil üks projekt, milles kasutan dallase DS18S20 temperatuurisensorit. Kirjutasin temperatuuri lugemiseks programmi, aga see ei taha funktsida - äkki keegi leiab vea(d) üles, ma ise seda juba tükk aega mudinud, aga nagu ei saa aru, kust katki.
Kood ise selline (PIC jaoks, assembleris):
Tänud ette.
P.S. tmr1_viide on 530 ms, ülejäänud on nii pikad, kui nimigi ütleb
Käsil üks projekt, milles kasutan dallase DS18S20 temperatuurisensorit. Kirjutasin temperatuuri lugemiseks programmi, aga see ei taha funktsida - äkki keegi leiab vea(d) üles, ma ise seda juba tükk aega mudinud, aga nagu ei saa aru, kust katki.
Kood ise selline (PIC jaoks, assembleris):
Kood:
; ------------------------------------------------------------ ;************** Termomeeter*************************************** ;-------------------------------------------------------------- get_temp_w: call init_1wire ;teeme reseti ja kontrollime kas termomeeter on liinil btfsc temperr goto termo_error ; kui termomeeter ei vasta, siis välja. bsf LED call tmr1_viide call tmr1_viide bcf LED movlw 0xCC call send_byte_termo ; skip rom movlw .15 movwf counter movlw 0x44 call send_byte_termo ; algatame temperatuuri konversiooni call termo_kuulama oota_veel: ; bsf LED call tmr1_viide call tmr1_viide ; bcf LED decfsz counter goto testi_seisu goto termo_error ;aitab küll, kaua läheb testi_seisu: call read_termo btfss read_bit ; kui 1 siis on konversioon korras ja võib minna edasi, kui 0 siis oodatakse veel goto oota_veel read_scratch: movlw 0xBE ;read scratchpad käsk call send_byte_termo call read_byte_termo ;esimesena saame temperatuuri väärtuse movwf digitemp call read_byte_termo; teisena saame märgi btfss rcv_byte,0 ;kas märgis on ühed või nullid goto plusstemperatuur ; nullid goto miinustemperatuur ; ühed plusstemperatuur: call reset_termo bcf sign bcf CARRY rrf digitemp,F ;kaotame 0,5 kraadi koha movf digitemp,W return miinustemperatuur: call reset_termo bsf sign comf digitemp,F bcf CARRY rrf digitemp,F ;kaotame 0,5 kraadi koha movf digitemp,W return termo_error: clrf digitemp clrw ; bcf LED bcf temperr return ;*************************************1-wire rutiinid*********************************************************** init_1wire: ;init bcf temperr call termo_saatele bcf Termo call v500_us bsf Termo call termo_kuulama call v60_us btfsc Termo goto init_err ; bsf LED call tmr1_viide ; bcf LED return init_err: call v500_us bsf temperr return reset_termo: call termo_saatele bcf Termo call v500_us bsf Termo call termo_kuulama call v500_us return write_termo_1: ; Kirjutab 1, väljund peab enne olema kirjutamisasendis call termo_saatele bcf Termo call v5_us bsf Termo call v60_us return write_termo_0: ; Kirjutab 0, väljund peab enne olema kirjutamisasendis call termo_saatele bcf Termo call v5_us call v60_us bsf Termo return read_termo: ; Loeb, väljund peab enne olema kirjutamisasendis call termo_saatele bcf Termo call v5_us bsf Termo call termo_kuulama ;(7us) bcf read_bit nop nop btfsc Termo bsf read_bit call v60_us call termo_saatele call v5_us return send_byte_termo: movwf sendbyte ; tööregister saatepuhvrisse movlw 0x08 movwf send_count call termo_saatele next_bit_termo: rrf sendbyte,F bcf write_temp_bit btfsc CARRY bsf write_temp_bit ; dataväljundbitile carry väärtus btfsc write_temp_bit ;kui väljundbitt kõrge call write_termo_1 ;siis kirjutame 1 btfss write_temp_bit ; kui madal call write_termo_0 ; siis 0 decfsz send_count goto next_bit_termo rrf sendbyte,F ; algsesse seisu return read_byte_termo: movlw 0x07 movwf rcv_count clrf rcv_byte next_bit_rcv: call read_termo btfsc read_bit bsf rcv_byte,7 btfss read_bit bcf rcv_byte,7 rrf rcv_byte,F decfsz rcv_count goto next_bit_rcv call read_termo ; viimane kord veel, kõik ülejäänud on õigel kohal, aga viimase biti väärtus vaja paika saada btfsc read_bit bsf rcv_byte,7 btfss read_bit bcf rcv_byte,7 movf rcv_byte,W return termo_saatele: ; Termomeetri jalg väljundiks ja kõrgeks (8us) bsf Termo bsf pank bcf Tris_Termo bcf pank bsf Termo return termo_kuulama: ; Termomeetri jalg sisendiks (7us) bsf pank bsf Tris_Termo bcf pank return
P.S. tmr1_viide on 530 ms, ülejäänud on nii pikad, kui nimigi ütleb
Comment