-->

24 Haziran 2010 Perşembe

PIC16C74 NTC Termistör İle Termometre Devresi

ASM Dosyası



list p=pic16c74
__config h’3ffa’ ;HS crystal, 20Mhz
include ;
temp equ 0×20
target equ 0×21 ;target temp value to trigger relay
targdly equ 0×22 ;used to pause display when setting target
flag equ 0×23
cntr equ 0×24
;
org 0 ;reset vector
goto start ;go to beginning of program on reset
;
org 4
btfsc PIR1,TMR1IF ;timer 1 overflowed?
goto timer1
retfie
;
start movlw 0xbf ;’-’ segment value
movwf PORTB ;set output
movwf PORTD ;latches to initial value
clrf PORTA ;clear port a latches
bsf STATUS,RP0 ;select register bank 1
clrf PIE1 ;disable all peripheral interrupts
bsf TRISC,0 ;RC0 needs to be input for osc to function
bsf PIE1,TMR1IE ;enable TMR1 int
movlw b’00000011′ ;RA0=A/D input, RA1=A/D input, RA2=Relay output
movwf TRISA ;porta all input/analog
clrf TRISB ;PORTB/PORTD output to 7-segment LEDs
clrf TRISD
movlw 0×04 ;RA0 and RA1 Analog, RA2 Digital, Vref=Vdd
movwf ADCON1 ;set
bcf STATUS,RP0 ;select register bank 0
bcf T1CON,TMR1ON ;timer 1 not on
movlw 0×80 ;TIM1H:TIM1L = 0×8000 = 1sec
movwf TMR1H
clrf TMR1L
clrf INTCON ;disable all interrupts
clrf PIR1 ;clear all falgs
movlw 0x0e ;T1CKPS1 (Prescale) = 1, T1OSCEN (osc shutoff) = enabled
movwf T1CON ;T1SYNC (ext clk input) = no sync, TMR1CS = external
bsf INTCON,PEIE ;enable peripheral interrupts
bsf INTCON,GIE ;enable global ints
call getAD1 ;get target temp value
movwf target ;save for compare
clrf targdly ;clear target display counter
clrf flag ;to tell which a/d to perform, RA0 or RA1
bsf T1CON,TMR1ON ;turn timer on
sleep
goto $-1
;
timer1 bcf PIR1,TMR1IF ;clear flag
bcf INTCON,GIE ;disable all ints
movlw 0×01 ;halfadd value
xorwf flag,1 ;compute operation to perform
movf flag,0
addwf PCL,1 ;go to proper routine
goto trgsamp
goto temsamp
trgsamp call getAD1 ;get target value
movwf temp
subwf target,0 ;check it
btfsc STATUS,Z ;zero set if equal, same target
goto timerx
movf temp,0 ;get new target value
movwf target
movlw 0×01
movwf flag ;do trigger sample next go around also
goto dispit
temsamp call getAD0 ;get RA0 thermister value
movwf temp
subwf target,0
btfss STATUS,C
bsf PORTA,2 ;trigger relay, temp has reached goal
dispit movlw .186
subwf temp,0 ;end of table values
btfsc STATUS,C
goto valerr ;error, value out of range
movlw .98 ;base of table values
subwf temp,0
btfss STATUS,C ;if carry clear then
goto valerr ;error, value out of range
call temptab ;convert to temp
setleds movwf temp
andlw 0x0f
call ledtab
movwf PORTB
swapf temp,0
andlw 0x0f
call ledtab
movwf PORTD
timerx bcf PIR1,TMR1IF ;clear flag
movlw 0×80
movwf TMR1H
clrf TMR1L
retfie ;enable ints and return to sleep
valerr movlw 0xaa ;0x0a is disp in ledtab to special out of range value
goto setleds

getAD0 movlw b’10000001′ ;fosc/32, chan0 (RA0), ADON
adconv movwf ADCON0
clrf cntr
decfsz cntr,1
goto $-1
clrf cntr
decfsz cntr,1
goto $-1
bsf ADCON0,GO
btfsc ADCON0,NOT_DONE ;check if A/D complete
goto $-1
movf ADRES,0
clrf ADCON0 ;clear reg and shutdown AD logic
return
getAD1 movlw b’10001101′ ;fosc/32, chan1 (RA1), GO, ADON
goto adconv
;
; 7-segment conversion
;
ledtab addwf PCL,1
retlw 0xc0 ;0
retlw 0xfc ;1
retlw 0×92 ;2
retlw 0×98 ;3
retlw 0xac ;4
retlw 0×89 ;5
retlw 0×81 ;6
retlw 0xdc ;7
retlw 0×80 ;8
retlw 0x8c ;9
retlw 0xbf ;-
;
;tempature table
;
temptab addwf PCL,1
retlw 0×99 ;98
retlw 0×98 ;99
retlw 0×98 ;100
retlw 0×97 ;101
retlw 0×96 ;102
retlw 0×95 ;103
retlw 0×94 ;104
retlw 0×93 ;105
retlw 0×93 ;106
retlw 0×92 ;107
retlw 0×91 ;108
retlw 0×90 ;109
retlw 0×89 ;110
retlw 0×89 ;111
retlw 0×88 ;112
retlw 0×87 ;113
retlw 0×86 ;114
retlw 0×86 ;115
retlw 0×85 ;116
retlw 0×85 ;117
retlw 0×84 ;118
retlw 0×83 ;119
retlw 0×82 ;120
retlw 0×81 ;121
retlw 0×80 ;122
retlw 0×80 ;123
retlw 0×79 ;124
retlw 0×78 ;125
retlw 0×78 ;126
retlw 0×77 ;127
retlw 0×76 ;128
retlw 0×76 ;129
retlw 0×75 ;130
retlw 0×74 ;131
retlw 0×73 ;132
retlw 0×72 ;133
retlw 0×71 ;134
retlw 0×70 ;135
retlw 0×70 ;136
retlw 0×69 ;137
retlw 0×69 ;138
retlw 0×68 ;139
retlw 0×67 ;140
retlw 0×67 ;141
retlw 0×66 ;142
retlw 0×65 ;143
retlw 0×64 ;144
retlw 0×63 ;145
retlw 0×62 ;146
retlw 0×62 ;147
retlw 0×61 ;148
retlw 0×60 ;149
retlw 0×59 ;150
retlw 0×59 ;151
retlw 0×58 ;152
retlw 0×58 ;153
retlw 0×57 ;154
retlw 0×56 ;155
retlw 0×55 ;156
retlw 0×54 ;157
retlw 0×53 ;158
retlw 0×53 ;159
retlw 0×52 ;160
retlw 0×51 ;161
retlw 0×51 ;162
retlw 0×50 ;163
retlw 0×49 ;164
retlw 0×49 ;165
retlw 0×48 ;166
retlw 0×47 ;167
retlw 0×46 ;168
retlw 0×45 ;169
retlw 0×44 ;170
retlw 0×44 ;171
retlw 0×43 ;172
retlw 0×42 ;173
retlw 0×41 ;174
retlw 0×40 ;175
retlw 0×39 ;176
retlw 0×39 ;177
retlw 0×38 ;178
retlw 0×37 ;179
retlw 0×37 ;180
retlw 0×36 ;181
retlw 0×35 ;182
retlw 0×34 ;183
retlw 0×33 ;184
retlw 0×32 ;185
retlw 0×32 ;186
end

0 yorum:

Yorum Gönder

Elektronik Devreler Arşivi
 

Bizi Takip Edenler

Blog Arşivi

Elektronik Devreler Copyright © 2009 Blogger Template WoodMag is Designed by Ipietoon for Free Blogger Template