28/11/2008 Time 11:10am location PF 46
Appendix 2: PIC Code
list p=16f877A
include <p16f877A.inc>
DelayCount1 equ 0x20 DelayCount2 equ 0x21
Temp equ 0x22
Temp1 equ 0x23
Temp2 equ 0x24
Temp3 equ 0x25
Temp4 equ 0x26
Temp5 equ 0x27
Temp6 equ 0x28
Temp7 equ 0x29
Temp8 equ 0x30
Temp9 equ 0x31
org 0x00 goto start org 0x04 goto ISR org 0x10
start: clrf PORTB bsf STATUS,RP0
bsf PORTB,0 ;CLK high (start up, while data is high toggle bsf PORTB,1 ;DATA high (clk 9 or more times,reset) call softdelay
bcf PORTB,0 ;CLK low bsf PORTB,1 ;DATA high call softdelay
bsf PORTB,0 ;CLK high bsf PORTB,1 ;DATA high call softdelay
bcf PORTB,0 ;CLK low bsf PORTB,1 ;DATA high
call softdelay
bsf PORTB,0 ;CLK high bsf PORTB,1 ;DATA high call softdelay
bcf PORTB,0 ;CLK low bsf PORTB,1 ;DATA high call softdelay
bsf PORTB,0 ;CLK high bsf PORTB,1 ;DATA high call softdelay
bcf PORTB,0 ;CLK low bsf PORTB,1 ;DATA high call softdelay
bsf PORTB,0 ;CLK high bsf PORTB,1 ;DATA high call softdelay
bcf PORTB,0 ;CLK low ******9th time bsf PORTB,1 ;DATA high
call softdelay
bcf PORTB,1 ;DATA low, before clock change******
bsf PORTB,0 ;CLK high, now clock changes call softdelay
bsf PORTB,0 ;CLK high ;transmission start bsf PORTB,1 ;DATA high
call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bcf PORTB,0 ;CLK low bcf PORTB,1 ;DATA low call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bsf PORTB,0 ;CLK high bsf PORTB,1 ;DATA high call softdelay
bcf PORTB,0 ;CLK low bsf PORTB,1 ;DATA high call softdelay
bcf PORTB,1 ;DATA low, before clock change******
bsf PORTB,0 ;CLK high, now clock changes call softdelay
bcf PORTB,0 ;CLK low bcf PORTB,1 ;DATA low
call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bcf PORTB,0 ;CLK low bcf PORTB,1 ;DATA low call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bcf PORTB,0 ;CLK low bcf PORTB,1 ;DATA low call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bcf PORTB,0 ;CLK low
bsf PORTB,1 ;DATA high humidity '000001..' call softdelay
bsf PORTB,0 ;CLK high bsf PORTB,1 ;DATA high call softdelay
bcf PORTB,0 ;CLK low
bcf PORTB,1 ;DATA low humidity '0000010.' call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bcf PORTB,0 ;CLK low
bsf PORTB,1 ;DATA high humidity '00000101' call softdelay
bsf PORTB,0 ;CLK high bsf PORTB,1 ;DATA high call softdelay
bsf STATUS,RP0 ;PORTB set for input movlw 0x02 ;*******************
movwf TRISB ;*******************
bcf STATUS,RP0 ;*******************
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low call softdelay
bcf PORTB,0 ;CLK low \\\\changed here 4clock off////
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bcf PORTB,0 ;CLK low call softdelay
bcf PORTB,0 ;CLK low call softdelay
bcf PORTB,0 ;CLK low call softdelay
bcf PORTB,0 ;CLK low call softdelay
bcf PORTB,0 ;CLK low call softdelay
bcf PORTB,0 ;CLK low \\\\\\\\resume clock/////////
call softdelay movlw 0x08 movwf Temp3 clrw
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
clrf TRISB ; FOR OUTPUT
bcf STATUS,RP0 ;*****************
call softdelay
bcf PORTB,1 ;pull data line low for acknowledge bsf PORTB,0 ;CLK high*** acknowledge pulse (9th) call softdelay
bcf PORTB,0 ;CLK low
bsf STATUS,RP0 ;*******************
movlw 0x02 ; SET PORTB movwf TRISB ; FOR INPUT
bcf STATUS,RP0 ;*******************
clrf Temp
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low
call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low
clrf PORTB ;******************
bsf STATUS,RP0 ; SET PORTB clrf TRISB ; FOR OUTPUT
bcf STATUS,RP0 ;*****************
bcf PORTB,1 ;pull data line low for acknowledge call softdelay
bsf PORTB,0 ;CLK high*** acknowledge pulse (9th) call softdelay
bcf PORTB,0 ;CLK low
bsf STATUS,RP0 ;*******************
movlw 0x02 ; SET PORTB movwf TRISB ; FOR INPUT
bcf STATUS,RP0 ;*******************
call softdelay
; call sendout
call sendout ;send last 8bits to TX
bsf PORTB,0 ;CLK high...check sum first pulse call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high..end of check sum (8th pulse) call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low goto readtemp
Loop: btfss PORTB,0 ;store the first 8 bits
bcf STATUS,C ;***************************
movfw PORTB ;***************************
andlw 0x02 ;***************************
movwf Temp ;***************************
rrf Temp,0 ;***************************
andlw 0x0F ;***************************
iorwf Temp2,1 ;***************************
decf Temp3 ;***************************
btfss STATUS,Z ;***************************
rlf Temp2,1 ;***************************
return
Loop2: btfss PORTB,0 ;store the second 8 bits
bcf STATUS,C ;***************************
movfw PORTB ;***************************
andlw 0x02 ;***************************
movwf Temp ;***************************
rrf Temp,0 ;**********************
andlw 0x01 ;***************************
iorwf Temp4,1 ;***************************
decf Temp3 ;***************************
btfss STATUS,Z ;***************************
rlf Temp4,1 ;*************************
return
softdelay: clrf DelayCount1 movlw 0xC0
movwf DelayCount2 Delayloop: decfsz DelayCount1,F
goto smalldelay goto exitdelay
smalldelay: decfsz DelayCount2,F goto smalldelay
goto Delayloop exitdelay: Return
TXsetup: bsf STATUS,RP0
movlw .207 ;1200 baud rate
movwf SPBRG ;load value into SPBRG movlw b'10100100' ;async high baud rate movwf TXSTA ;transmit config register bcf STATUS,RP0
movlw b'10000000' ;Enable serial port open movwf RCSTA
return
sendout: bcf STATUS,RP0
movfw Temp2 ;move temp2 to w-reg movwf TXREG ;move w-reg to tx nop nop
bsf STATUS,RP0 ;switch to bank1 bsf TXSTA,TXEN ;enable transmission nop
bcf STATUS,RP0 ;switch to bank0 btfss PIR1,TXIF ;check tx empty goto $-1
nop
movfw Temp4 ;Same code again movwf TXREG ;only this time its for nop ;sending second byte
nop
movlw 'X' ; character sent out to make up 8 bits movwf TXREG
nop nop
movlw 'X' ; character sent out to make up 8 bits movwf TXREG
nop nop
movlw 'X' ; character sent out to make up 8 bits movwf TXREG
nop nop
movlw 'X' ; character sent out to make up 8 bits movwf TXREG
nop nop return
bsf STATUS,RP0 ;switch to bank1 bsf TXSTA,TXEN ;enable transmission nop
bcf STATUS,RP0 ;swictch to bank0 btfss PIR1,TXIF ;check tx empty goto $-1
nop
movfw Temp9 ;Same code again movwf TXREG ;only this time its for nop ;sending second byte
nop readtemp: clrf PORTB
bsf STATUS,RP0
bsf PORTB,0 ;CLK high ;transmission start bsf PORTB,1 ;DATA high
call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bcf PORTB,0 ;CLK low bcf PORTB,1 ;DATA low call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bsf PORTB,0 ;CLK high bsf PORTB,1 ;DATA high call softdelay
bcf PORTB,0 ;CLK low bsf PORTB,1 ;DATA high
call softdelay
bcf PORTB,1 ;DATA low, before clock change******
bsf PORTB,0 ;CLK high, now clock changes call softdelay
bcf PORTB,0 ;CLK low bcf PORTB,1 ;DATA low call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bcf PORTB,0 ;CLK low bcf PORTB,1 ;DATA low call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bcf PORTB,0 ;CLK low bcf PORTB,1 ;DATA low call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bcf PORTB,0 ;CLK low bcf PORTB,1 ;DATA low call softdelay
bsf PORTB,0 ;CLK high bcf PORTB,1 ;DATA low call softdelay
bcf PORTB,0 ;CLK low
bsf PORTB,1 ;DATA High Temperature command call softdelay
bsf PORTB,0 ;CLK high
bsf PORTB,1 ;DATA low temperature command bit high call softdelay
bcf PORTB,0 ;CLK low
bsf PORTB,1 ;DATA high temperature command line stays high call softdelay
bsf PORTB,0 ;CLK high
bsf PORTB,1 ;DATA high temprature line still high (final bit) call softdelay
bsf STATUS,RP0 ;PORTB set for input movlw 0x02 ;*******************
movwf TRISB ;*******************
bcf STATUS,RP0 ;*******************
bcf PORTB,0 ;CLK low bsf PORTB,0 ;CLK high
call softdelay
bcf PORTB,0 ;CLK lo call softdelay
bcf PORTB,0 ;CLK low call softdelay
bcf PORTB,0 ;CLK lo call softdelay
bcf PORTB,0 ;CLK low call softdelay
bcf PORTB,0 ;CLK lo call softdelay
bcf PORTB,0 ;CLK low \\\\\\\\resume clock/////////
call softdelay
movlw 0x08 ;move 8 into w-reg
movwf Temp3 ;move w-reg to Temp3 to count number of bits saved clrw
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high
call Loop call softdelay
bcf PORTB,0 ;CLK low
clrf PORTB ;******************
bsf STATUS,RP0 ; SET PORTB clrf TRISB ; FOR OUTPUT
bcf STATUS,RP0 ;*****************
call softdelay
bcf PORTB,1 ;pull data line low for acknowledge
bsf PORTB,0 ;CLK high********** acknowledge pulse (9th) call softdelay
bcf PORTB,0 ;CLK low
bsf STATUS,RP0 ;*******************
movlw 0x02 ; SET PORTB movwf TRISB ; FOR INPUT
bcf STATUS,RP0 ;*******************
clrf Temp
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call Loop2
call softdelay
bcf PORTB,0 ;CLK low
clrf PORTB ;******************
bsf STATUS,RP0 ; SET PORTB clrf TRISB ; FOR OUTPUT
bcf STATUS,RP0 ;*****************
bcf PORTB,1 ;pull data line low for acknowledge call softdelay
bsf PORTB,0 ;CLK high********** acknowledge pulse (9th) call softdelay
bcf PORTB,0 ;CLK low
bsf STATUS,RP0 ;*******************
movlw 0x02 ; SET PORTB movwf TRISB ; FOR INPUT
bcf STATUS,RP0 ;*******************
call softdelay
call sendout ;send bits to TX
bsf PORTB,0 ;CLK high...check sum first pulse call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low
call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high...end of check sum (8th pulse) call softdelay
bcf PORTB,0 ;CLK low call softdelay
bsf PORTB,0 ;CLK high call softdelay
bcf PORTB,0 ;CLK low goto start ;Loop back to start
ISR: retfie ;Dummy interruptservice routine End