zoligen subotica
Član broj: 59732 Poruke: 81 *.sksyu.net.
|
LIST P=16F84, R=DEC ;
include "p16f84.inc"
CBLOCK 0X00C
TMP0 ;definisanje registara
TMP1
TMP2
POLA
DSMAG
DSSIGN
TP
TP1
TP2
ENDC
DSBIT EQU 4 ;########
#DEFINE BANK0 BCF STATUS,5
#DEFINE BANK1 BSF STATUS,5
DQLOW: MACRO ; rutina za nizak nivo na DQ pinu
bcf PORTA,DSBIT
bsf STATUS,RP0
bcf TRISA,DSBIT
bcf STATUS,RP0
endm
DQHIZ: MACRO ; rutina za visok nivo na DQ pinu
bsf STATUS, RP0
bsf TRISA, DSBIT
bcf STATUS, RP0
endm
PAUSE MACRO DLYF
movlw (DLYF / 5) - 1
movwf TMP0
call DLY5N
endm
ORG 0X00 ;POCETAK PROGRAMA
GOTO MAIN
MAIN:
BANK1 ;PRELAZAK U BANK1
MOVLW B'11000'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
BANK0 ;VRACAM SE U BANK0
CLRF PORTA ;PORTOVI A I B SU 0
CLRF PORTB
LLL: CALL PAUZA
call NEWTEMP
MOVF DSMAG,W ; KAD SE VRATI IZ RUTINE NEWTEMP VREDNOST JE U DSMAG REGISTRU
MOVWF PORTB ;
GOTO LLL
;----------------------------------
; RUTINA ZA KOMUNIKACIJU SA SENZOROM
NEWTEMP:
call DSRX8 ; Check DS1820 status.
addlw 1 ; 255=READY => 0=READY.
btfss STATUS, Z ; Z set = READY.
return ; W non zero = not ready.
GETEMP:
call DSRESET ;
movlw H'CC' ; Skip PROM.
call DSTX8 ;
movlw H'BE' ; Read scratch pad.
call DSTX8 ;
call DSRX8 ; Magnitude.
movwf DSMAG ;
call DSRX8 ; Sign (FF=-VE, 00=+VE).
movwf DSSIGN ;
call DSRESET ; Seen enough, restart.
movlw H'CC' ; Skip PROM.
call DSTX8 ;
movlw H'44' ; Start convert.
call DSTX8 ;
clrw ; W = 0 : data ready.
return ;
DLY5N ; RUTINA ZA PAZU
nop ;
nop ;
decfsz TMP0, f ;
goto DLY5N ;
return ;
DSRESET:
DQLOW ;
PAUSE 600 ; ;
DQHIZ ;
PAUSE 65 ; Wait 67us for RESP bit.
nop ;
nop ;
movf PORTA, W ;
andlw 1 << DSBIT ;
movwf TMP1 ;
PAUSE 300 ;
movf TMP1, W ; Response in W.
return ;
DSTX8:
movwf TMP2 ; Data to TX.
movlw 8
movwf TMP1 ; Loop counter.
DSTXLP: ;
DQLOW ;
PAUSE 10 ;
rrf TMP2, f ;
btfsc STATUS, C ;
bsf PORTA, DSBIT ; DQ HI if bit was 1.
PAUSE 70 ;
DQHIZ ;
nop ;
decfsz TMP1, f ;
goto DSTXLP ;
return ;
DSRX8:
movlw 8 ;
movwf TMP1 ;
DSRXLP: ;
DQLOW ;
PAUSE 10 ;
DQHIZ ;
nop ;
nop ;
movf PORTA, W ;
andlw 1 << DSBIT ; ->0 if data bit low.
addlw 255
rrf TMP2, f
PAUSE 60
decfsz TMP1, f
goto DSRXLP
movf TMP2, W
return
;************************
PAUZA MOVLW 0X10 ;
MOVWF TP ;
L2 MOVLW 0XFF
MOVWF TP1
L3 MOVLW 0XFF
MOVWF TP2
L4 DECFSZ TP2,F
GOTO L4
DECFSZ TP1,F
GOTO L3
DECFSZ TP,F ;
GOTO L2 ;
RETURN
END
|