;**************************************************************************
; PIC12F629 + DS18B20                                (C)Pandatron.cz, 2008
;--------------------------------------------------------------------------
;
; Processor : PIC12F629
; Clock : INTOSC (4MHz)
;
;**************************************************************************

        LIST P=12F675, R=DEC
        INCLUDE<P12F675.INC>
        
        __CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

UARTREG equ     0x20            ; odesilani dat do PC
UARTCNT equ     0x21
UARTROT equ     0x22
PAUS1   equ     0x23            ; 10s pauza
PAUS2   equ     0x24
PAUS3   equ     0x25
DSDL1   equ     0x26            ; komunikace s DS18B20
DSREG1  equ     0x27
DSREG2  equ     0x28
TEMPL   equ     0x29
TEMPH   equ     0x2A
TEMPNM  equ     0x2B            ; ???,  °C
TEMPDP  equ     0x2C		;    ,? °C

#define UART    GPIO,0          ; UART pin
#define DSPIN   GPIO,2		; DS18B20 pin

D550US  equ     200             ; 550us
D90US   equ     25              ; 90us
D1US    equ     1               ; 3us

SPEED   equ     34              ; SPEED -  Baud
                                ;  145  -  2400
                                ;   71  -  4800
                                ;   34  -  9600
                                ;   21  - 14400
                                ;   15  - 19200
                                ;    5  - 38400



; ========================================================================
; Start procesoru
;
        org     0x00
        goto    INIT

INIT    MOVLW   0x7             ; komparator off
        MOVWF   CMCON
        
        GOTO    START

START   CALL    DSSTART         ; start prevodu teploty v cidlu
        CALL    PAUSE           ; 10s
        CALL    DSREAD          ; vyètení teploty z cidla
        CALL    TMPCNV          ; prevod binarni teploty na hodnotu
        CALL    TEMPSND         ; odeslani teploty do PC
        GOTO    START



; ========================================================================
; DS18B20 rutiny
;
DSSTART CALL    DSPINL          ; start prevodu teploty
        MOVLW   D550US          ; reset pulse
        CALL    DSDEL
        CALL    DSPINH
        MOVLW   D90US
        CALL    DSDEL
        BTFSC   DSPIN
        RETURN                  ; bez odpovedi - konec
        MOVLW   D550US
        CALL    DSDEL
        MOVLW   0xCC
        CALL    DSSEND
        MOVLW   0x44
        CALL    DSSEND
        RETURN
        
;---------------------

DSREAD  CLRF    TEMPL           ; vycteni teploty z cidla
        CLRF    TEMPH
        CALL    DSPINL
        MOVLW   D550US          ; reset pulse
        CALL    DSDEL
        CALL    DSPINH
        MOVLW   D90US
        CALL    DSDEL
        BTFSC   DSPIN
        RETURN                  ; bez odpovedi - konec
        MOVLW   D550US
        CALL    DSDEL
        MOVLW   0xCC
        CALL    DSSEND
        MOVLW   0xBE
        CALL    DSSEND
        CALL    DSREC
        MOVWF   TEMPL
        CALL    DSREC
        MOVWF   TEMPH
        RETURN
        
;---------------------
        
DSPINL  BSF     STATUS,RP0      ; pin DSPIN do L
        BCF     DSPIN
        BCF     STATUS,RP0
        BCF     DSPIN
        RETURN

;---------------------
        
DSPINH  BSF     STATUS,RP0      ; pin DSPIN do H (pull-up)
        BSF     DSPIN
        BCF     STATUS,RP0
        RETURN
        
;---------------------
        
DSDEL   MOVWF   DSDL1		; prodleva pro komunikaci
        DECFSZ  DSDL1,1
        GOTO    $-1
        RETURN

;---------------------

DSSEND  MOVWF   DSREG1          ; odeslani jednoho bytu z W do DS18B20
        MOVLW   8
        MOVWF   DSREG2
DSSND1  CALL    DSPINL
        BTFSC   DSREG1,0
        CALL    DSPINH
        MOVLW   D90US
        CALL    DSDEL
        CALL    DSPINH
        RRF     DSREG1,1
        DECFSZ  DSREG2,1
        GOTO    DSSND1
        MOVLW   D90US
        CALL    DSDEL
        RETURN
        
;---------------------
        
DSREC   CLRF    DSREG1          ; vycteni jednoho bytu z DS18B20 do W
        MOVLW   8
        MOVWF   DSREG2
DSREC1  RRF     DSREG1,1
        CALL    DSPINL
        CALL    DSPINH
        MOVLW   D1US
        CALL    DSDEL
        BCF     DSREG1,7
        BTFSC   DSPIN
        BSF     DSREG1,7
        MOVLW   D90US
        CALL    DSDEL
        DECFSZ  DSREG2,1
        GOTO    DSREC1
        MOVLW   D90US
        CALL    DSDEL
        MOVF    DSREG1,0
        RETURN


        
; ========================================================================
  Prevod binarni hodnoty ziskane z cidla na velikost teploty
;
TMPCNV  CLRF    TEMPNM
        CLRF    TEMPDP
        BTFSS   TEMPH,7
        GOTO    $+5
        COMF    TEMPH,1
        COMF    TEMPL,1
        MOVLW   200
        MOVWF   TEMPNM
        
        MOVF    TEMPDP,0
        BTFSC   TEMPL,1
        ADDLW   1
        BTFSC   TEMPL,2
        ADDLW   2
        BTFSC   TEMPL,3
        ADDLW   5
        MOVWF   TEMPDP
        
        MOVF    TEMPNM,0
        BTFSC   TEMPL,4
        ADDLW   1
        BTFSC   TEMPL,5
        ADDLW   2
        BTFSC   TEMPL,6
        ADDLW   4
        BTFSC   TEMPL,7
        ADDLW   8

        BTFSC   TEMPH,0
        ADDLW   16
        BTFSC   TEMPH,1
        ADDLW   32
        BTFSC   TEMPH,2
        ADDLW   64
        MOVWF   TEMPNM
      
        RETURN
        
        

; ========================================================================
; Odeslani jednoho bytu z W do UARTU
;
USEND   MOVWF   UARTREG
        BSF     STATUS,RP0
        BCF     UART
        BCF     STATUS,RP0
        BSF     UART
        CALL    UARTDEL
        NOP
        NOP
        NOP
        MOVLW   8
        MOVWF   UARTROT
        BTFSS   UARTREG,0
        GOTO    $+3
        BCF     UART
        GOTO    $+3
        BSF     UART
        NOP
        CALL    UARTDEL
        RRF     UARTREG,1
        DECFSZ  UARTROT,1
        GOTO    $-9
        BCF     UART
        CALL    UARTDEL
        BSF     STATUS,RP0
        BSF     UART
        BCF     STATUS,RP0
        RETURN
        
UARTDEL MOVLW   SPEED
        MOVWF   UARTCNT
        DECFSZ  UARTCNT,1
        GOTO    $-1
        RETURN



; ========================================================================
; Odeslani textu a teploty do PC
;
TEMPSND MOVLW   'T'             ; T
        CALL    USEND
        MOVLW   'e'             ; e
        CALL    USEND
        MOVLW   'p'             ; p
        CALL    USEND
        MOVLW   'l'             ; l
        CALL    USEND
        MOVLW   'o'             ; o
        CALL    USEND
        MOVLW   't'             ; t
        CALL    USEND
        MOVLW   'a'             ; a
        CALL    USEND
        MOVLW   ':'             ; :
        CALL    USEND
        MOVLW   ' '             ;  
        CALL    USEND
        
        MOVLW   200
        SUBWF   TEMPNM,1
        BTFSS   STATUS,C
        GOTO    $+4
        MOVLW   '-'             ; -
        CALL    USEND
        GOTO    $+2
        ADDWF   TEMPNM,1

        MOVLW   100
        SUBWF   TEMPNM,1
        BTFSS   STATUS,C
        GOTO    $+4
        MOVLW   '1'             ; 100°C
        CALL    USEND
        GOTO    $+2
        ADDWF   TEMPNM,1
        
        CLRF    TEMPH
        MOVLW   10
        SUBWF   TEMPNM,1
        BTFSS   STATUS,C
        GOTO    $+3
        INCF    TEMPH,1
        GOTO    $-4
        ADDWF   TEMPNM,1
        MOVF    TEMPH,0
        ADDLW   0x30
        CALL    USEND           ; 10°C
        
        CLRF    TEMPH
        MOVLW   1
        SUBWF   TEMPNM,1
        BTFSS   STATUS,C
        GOTO    $+3
        INCF    TEMPH,1
        GOTO    $-4
        ADDWF   TEMPNM,1
        MOVF    TEMPH,0
        ADDLW   0x30
        CALL    USEND           ; 1°C
        
        MOVLW   ','             ; ,
        CALL    USEND
        
        CLRF    TEMPH
        MOVLW   1
        SUBWF   TEMPDP,1
        BTFSS   STATUS,C
        GOTO    $+3
        INCF    TEMPH,1
        GOTO    $-4
        ADDWF   TEMPDP,1
        MOVF    TEMPH,0
        ADDLW   0x30
        CALL    USEND           ; 0,1°C
     
        MOVLW   '°'             ; °
        CALL    USEND
        MOVLW   'C'             ; C
        CALL    USEND
        
        MOVLW   0x0A
        CALL    USEND           ; Enter
        MOVLW   0x0D
        CALL    USEND
        RETURN



; ========================================================================
; Prodleva cca. 10s
; ------------------------------------------------------------------------
PAUSE   MOVLW   50
        MOVWF   PAUS3
        CLRF    PAUS2
        CLRF    PAUS1
        DECFSZ  PAUS1,1
        GOTO    $-1
        DECFSZ  PAUS2,1
        GOTO    $-3
        DECFSZ  PAUS3,1
        GOTO    $-5
        RETURN
        

        END
