Would appreciate it if someone could take a look at this code and help me out. I'm using 20Mhz external oscillator. DQ line from DS18S20 connected to PORTB,5 with a 5k pullup on there.
Code: Select all
LIST R=DEC ; Sets number base to decimal
INCLUDE "p16f628.inc" ; Includes microchip configuration for this processor
__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON & _LVP_OFF & _MCLRE_ON
; CP - Copy protection (off)
; WDT - Watchdog timer (off)
; HS_OSC - I'm using a high speed oscillator (20Mhz)
; PWRTE - Power up timer delay (on), leaves a delay for voltages to stabilise
; LVP - Low voltage programming (off)
; MCLRE - Holds MCLR pin high if on (on)
CBLOCK 0x20 ; Declare variable addresses starting at 0x20
DELAY,DELAYTMP,CONTRAST,ORIGCONTRAST,RECTEMP,PDBYTE
ENDC
;##### Macros #####
BANK0 macro
bcf STATUS,RP1
bcf STATUS,RP0
endm
BANK1 macro
bcf STATUS,RP1
bsf STATUS,RP0
endm
DELAY_MILLI macro TIME
movlw TIME
movwf DELAY
call DELAY_MS
endm
DELAY_MICRO macro TIME
movlw TIME
movwf DELAY
call DELAY_US
endm
SENDDATA macro DATA
movlw DATA
call TRANSMIT
endm
CLEARSCREEN macro
movlw 0xFE
call TRANSMIT
movlw 0x58
call TRANSMIT
endm
HOMECURSOR macro
movlw 0xFE
call TRANSMIT
movlw 0x48
call TRANSMIT
endm
HOMECURSOR2 macro
movlw 0xFE
call TRANSMIT
movlw 0x47
call TRANSMIT
movlw 0x01
call TRANSMIT
movlw 0x02
call TRANSMIT
endm
SETCONTRAST macro CONTRAST
movlw 0xFE
call TRANSMIT
movlw 0x50
call TRANSMIT
movlw CONTRAST
call TRANSMIT
endm
OW_HIZ macro
bsf STATUS,RP0
bsf TRISB,5
bcf STATUS,RP0
endm
OW_LO macro
bcf STATUS,RP0
bcf PORTB,5
bsf STATUS,RP0
bcf TRISB,5
bcf STATUS,RP0
endm
;##### Program Code #####
ORG 0
goto MAIN
;##### Subroutines #####
OW_RESET
OW_HIZ
clrf PDBYTE
OW_LO
DELAY_MICRO 250
DELAY_MICRO 250
OW_HIZ
DELAY_MICRO 70
btfss PORTB,5
incf PDBYTE,F
DELAY_MICRO 400
retlw 0
NO_OW_DETECT
CLEARSCREEN
SENDDATA 'N'
SENDDATA 'o'
SENDDATA ' '
SENDDATA '1'
SENDDATA '-'
SENDDATA 'W'
SENDDATA 'i'
SENDDATA 'r'
SENDDATA 'e'
SENDDATA ' '
SENDDATA 'D'
SENDDATA 'e'
SENDDATA 'v'
SENDDATA 'i'
SENDDATA 'c'
SENDDATA 'e'
SENDDATA 's'
SENDDATA '!'
return
SECDELAY
DELAY_MILLI 250
DELAY_MILLI 250
DELAY_MILLI 250
DELAY_MILLI 250
return
DELAY_US ; busy wait of DELAY us
nop ; (1)
nop ; (2)
decfsz DELAY,f ; test DELAY count (3)
goto DELAY_US ; loop if not done (4,5)
return ; gtfo (4,5)
DELAY_MS ; busy wait of DELAY ms
movf DELAY,w
movwf DELAYTMP ; save DELAY time
DELAY_MS_LOOP ; inner loop
movlw 245 ; load 245 (1)
movwf DELAY ; into DELAY (2)
call DELAY_US ; wait 245us (3-249)
movlw 245 ; load 245 (250)
movwf DELAY ; into DELAY (251)
call DELAY_US ; wait 245us (252-498)
movlw 245 ; load 245 (499)
movwf DELAY ; into DELAY (500)
call DELAY_US ; wait 245us (501-747)
movlw 246 ; load 246 (748)
movwf DELAY ; into DELAY (749)
call DELAY_US ; wait 246us (750-997)
decfsz DELAYTMP,f ; test DELAYTMP count (998)
goto DELAY_MS_LOOP ; loop if not done (999,1000)
return ; gtfo (999,1000)
INIT
bsf STATUS,RP0 ; RAM PAGE 1
movlw b'00000010' ; RB1(RX)=input, others output
movwf TRISB
movlw 0x40 ; 0x40 = 19.2kbps
movwf SPBRG
movlw b'00100100' ; brgh = high (2)
movwf TXSTA ; enable Async Transmission, set brgh
bcf STATUS,RP0 ; RAM PAGE 0
movlw b'10010000' ; enable Async Reception
movwf RCSTA
call SECDELAY
movlw 0x5B
movwf ORIGCONTRAST
CLEARSCREEN
return
TRANSMIT
movwf TXREG ; send data in W
bsf STATUS,RP0 ; RAM PAGE 1
TRANSMITTEST
btfss TXSTA,TRMT ; (1) transmission is complete if hi
goto TRANSMITTEST
bcf STATUS,RP0 ; RAM PAGE 0
return
RECEIVE
btfss PIR1,RCIF ; check for received data
goto RECEIVE
movf RCREG,W ; save received data in W
movwf RECTEMP ; save received data in RECTEMP
return
MAIN
call INIT
call SPLASH
call SECDELAY
call SECDELAY
CLEARSCREEN
call OW_RESET
decfsz PDBYTE,0
call NO_OW_DETECT
ENDLOOP
goto ENDLOOP
END