You are on page 1of 37

Dson

Thanh ghi (Register): Thanh ghi c t trong PIC, n c th c ghi, c. Hy tng tng cc thanh ghi ging nh cc mu giy m chng ta c th c hay vit thng tin ln n. Hnh bn di m t file thanh ghi (register file) c nh x vo PIC16F84. PIC c chia lm 2 phn, Bank0 v Bank1. Bank1 dng iu khin cc hot ng ca PIC, v d nh ni cho n bit nhng bit no trn PortA l i vo (Input) v nhng bit no xut ra (Output). Bank0 dng thao tc trn d liu, v d ta mun lm cho bit no trn PortA ln mc cao, u tin ta ta phi chuyn n Bank1 set 1 bit ca 1 chn c th no trn PortA tr thnh Output, sau ta chuyn n Bank0 v gi mc 1 ti chn . Nhng thanh ghi thng thng nht trn Bank1 m chng ta s s dng l cc thanh ghi STATUS, TRISA and TRISB. u tin chng ta hy quay vo Bank1, thanh ghi TRISA cho php ta chn chn no trn PortA lm ng Output hay Input, thanh ghi TRISB cho php ta chn chn no trn PortB lm ng Output hay Input, thanh ghi STATUS cho php chn s dng Bank0 hay Bank1. STATUS: thay i t Bank0 sang Bank1 ta s dng thanh ghi trng thi STATUS, set bit5 ca thanh ghi trng thi ln1 chn Bank1 hoc xo bit5 v 0 chn Bank0, thanh ghi STATUS c a ch 03H. TRISA v TRISB: 2 thanh ghi TRISA and TRISB t ti a ch 85H v 86H, lp trnh cho cc chn trn 2 thanh ghi ny thng thng ngi ta gi mc 0 hay 1 n cc bit tng ng trn thanh ghi, c th lm iu ny trong c 2 dng hoc l bng s binary (bin) hay hex. Dng kiu binary th r rng hn l kiu hex nhng m trng lm thm hn !. Trn PortA ta c 5 chn tng ng 5 bit, nu mun t 1 trong 5 chn ny thnh Output ta phi gi 1 n bit tng ng vi n, nhng bt ny c tn bit ng chnh xc vi tn ca n, ni cch khc bit0 l RA0, bit1 l RA1, bit2 l RA2. Hy xem v d: Nu ta mun set RA0, RA3 v RA4 thnh Output v RA1, RA2 thnh Inputs, ta phi gi 00110 (=06h), nn nh bit thp nm bn phi, xem hnh: Port A Pin Bit Number Binary RA4 4 0 RA3 3 0 RA2 2 1 RA1 1 1 RA0 0 0

Dson

Tng t chng ta cng lm nh vy cho TRISB. PORTA v PORTB: lm cho 1 trong nhng chn Output ln mc cao ta gi 1 n bit tng ng trn thanh ghi PORTA hoc PORTB, ging nh cch lm trn thanh ghi TRISA v TRISB, c th kim tra li trn tng chn ca Port. Thanh ghi W: Thanh ghi W l l thanh ghi mch ch chung m c th t ln n bt k gi tr no ta mun, khi gn cho thanh ghi W mt gi tr no , ta c th cng n vi 1 gi tr khc hoc c th copy n (Mov). Nu bn gn 1 gi tr no ln thanh ghi W th ni dung trc ca n s b ghi ln. Xem v d s dng PortA: u tin chng ta cn chn Bank0 hoc Bank1 bng cch set trn thanh ghi STATUS, a ch ca STATUS l 03H v hy set bit5 ca n ln 1 theo cch sau: BSF 03h,5

BSF c ngha l Bit Set F, t F ngha l chng ta s s dng mt v tr no trong memory hoc trong thanh ghi, 2 con s 03H sau cu lnh BSF ngha l a ch ca thanh ghi STATUS, con s 5 tc l bit5 ca n, nh vy ngha ca cu lnh trn l set bit5 ca STATUS ln 1. By gi chng ta thao tc trong Bank1. MOVLW b'00110'

Ta t gi tr binary 00110 vo trong thanh ghi mch ch chung W, ch b c ngha l binary, d nhin ta cng c th vit li trong dng s hex, n nh sau: MOVLW 06h

MOVLW c ngha l l Move Literal Value Into W tm dch l di chuyn gi tr ca Literal vo thanh ghi W, r rng hn ta c th ni l t gi tr trc tip sau y (06H) vo trong thanh ghi W By gi ta tip tc t gi tr vo trong thanh ghi TRISA thit lp trng thi cho Port: MOVWF 85h

Lnh ny c ngha l MOV ni dung ca W vo (thanh ghi c) a ch 85h, trong trng hp ny con tr a ch s tr ti TRISA, thanh ghi TRISA by gi cha gi tr 00110, xem li m t cc cu lnh bng hnh sau: Port A Pin Binary Input/Output RA4 0 O RA3 0 O RA2 1 I RA1 1 I RA0 0 O

By gi chng ta s thit lp cc chn trn PORTA, hy quay v Bank0 thao tc trn cc d liu. BCF 03h,5

Dson

Lnh BCF th i nghch vi BSF, n c ngha l Bit Clear F tm dch l xo bit no trong vng memory hay trong thanh ghi no , trong trng hp ny l thanh ghi STATUS (v a ch ca n l 03H) v lnh ny xo bit5 ca STATUS. Bn di l on code: BSF MOVLW MOVWF BCF 03h,5 06h 85h 03h,5 ; vo Bank 1 ; t gi tr 00110 vo W ; Move 00110 vo trong TRISA ; Quay tr v Bank 0

Hy c k on code trn cho n khi no bn hiu n ang lm ci g. Ghi ln Port: Trong phn trn chng ta ni n lm th no thit lp cc chn ca Port tr thnh Input hay Output, trong phn ny ta s ni tip lm sao c th gi data ti Port v trong phn k tip chng ta s kt thc vi mt on code lm cho n Led chp tt vi c s mch c th hiu r con Pic lm vic chnh xc n mc no, ng c th compile v np on code vo con Pic ca bn v n ch l v d m thi. u tin hy setup bit2 ca Port A thnh Output. Bsf Movlw Movwf bcf 03h,5 00h 85h 03h,5 ; Vo Bank 1 ; t gi tr 00000 vo trong W ; Copy 00000 vo trong TRISA, tt ; c cc chn by gi s tr ;thnhOutput ; Quay tr v Bank0

on code trn l nhng g ni trong phn trc, ch khc l by gi ta set tt c cc chn ca PortA tr thnh Output bng cch gi gi tr 0 n thanh ghi w (thanh ghi W l loi thanh ghi c 3 trng thi tri-state register). By gi nhng g m ta mun con Pic phi lm l bt tt c Led ln, lm iu ny ta phi gi mc 1 n cc chn Led, hy xem lm nh th no y: movlw 02h ; Ghi 02h vo thanh ghi W. n l 00010 nu ; vit theo dng binary, nh vy n t 0 vo ; bit 2 (chn 18) trong khi gi cc chn khc ; ;mc 0. ;By gi copy ni dung ca W (02H) vo ;PortA (a ch l 05H).

movwf

05h

Con Led by gi bt on, chng ta th tt n xem: movlw movwf 00h 05h ; Ghi 00h vo thanh ghi W. n l 00000 nu ; vit theo dng binary, nh vy n t 0 vo ; tt c cc chn. ; By gi copy ni dung ca W ( 02H) vo ; PortA

By gi Led b tt. lm cho led sng, tt lin tc chng ta phi lm cho chng trnh quay tr li im bt u bng cch t nhn cho chng trnh v ni cho n bit l im bt u m n phi quay li thc hin ln na. Rt n gin, hy t 1 ci nhn c tn l START ngay ti im bt u ca on code.

Dson

Start movlw movwf movlw movwf goto By gi hy xem li on code: Bsf Movlw Movwf bcf Start movlw Movwf Movlw Movwf Goto 03h,5 00h 85h 03h,5 02h 05h 00h 05h Start 02h 05h 00h 05h Start ; Write 02h to the W register. In binary ; this is 00010, which puts a 1 on pin2 ; while keeping the other pins to 0 ; Now move the contents of W (02h) ; onto the PortA, whose address is 05h ; Write 00h to the W register. This puts a ; 0 on all pins. ; Now move the contents of W (0h) onto ; the Port A, whose address is 05h ; Goto where we say Start

Chng ta ch nhn thy ton nhng con s, bn mun hiu c n th phi nh ht tt c nhng a ch ca cc thanh ghi, cc Port . Nhng ngay c khi bn nh c tt c th mt on code ngn nht nh trn cng c th lm bn bi ri, gii quyt vn ny hy gn cho cc con s a ch bng 1 ci tn bng lnh EQU. EQU n gin l thay mt ci g bng mt ci g !, n khng phi l cu lnh ca con PIC m n l cu lnh ca assembler, vi lnh EQU bn c th gn bt k a ch thanh ghi no bng 1 ci tn gi nh hoc gn mt ci tn cho mt hng s trong on chng trnh. Hy th gn vi hng s bng nhng ci tn bn s thy n d c n nh th no. STATUS TRISA PORTA equ equ equ 03h 85h 05h ; this assigns the word STATUS to the value of 03h, ; which is the address of the STATUS register. ; This assigns the word TRISA to the value of 85h, ; which is the address of the Tri-State register for ; PortA ;This assigns the word PORTA to 05h which is the ; address of Port A.

By gi hy thip lp cc gi tr hng s v t chng vo chng trnh, cc gi tr hng s phi c nh ngha trc khi t vo chng trnh v hy nh phi lun t chng vo v tr bt u ca chng trnh. By gi hy xo ht cc ghi ch sau cc cu lnh, bn th nhn xem c d dng hiu c on code trn khi khng c cc dng ghi ch: STATUS TRISA PORTA equ equ equ 03h 85h 05h

Dson

Bsf movlw movwf bcf Start movlw Movwf movlw movwf goto

STATUS,5 00h TRISA STATUS,5 02h PORTA 00h PORTA Start

Hy vng rng bn c th hiu c on code trn ngay c khi khng c cc ghi ch cho cc cu lnh. Delay Loops. C mt cht rc ri v on code chp tt n led m ta xem bn trn. Mi lnh thc thi mt 1 chu k xung clock, nu ta s dng thch anh 4MHz th mi lnh mt 4/4MHz hay 1us, trong on code trn, ta s dng 5 lnh nh vy mt 5us thc thi hon ton, qu nhanh mt ngi c th nhn thy n led chp tt trong khang thi gian ngn ngi nh vy, ci m ta cn l lm cho khong thi gian gia sng v tt ca led ko di ra, ni cch khc l lm tr (Delay). C bn ca 1 chng trnh Delay l cho m ngc li gi tr t trc , v khi n n zero (0) th ta cho dng b m, gi tr zero bo cho bit dng chng trnh delay v s tip tc thc thi li nu ta mun. u tin chng ta phi nh ngha mt hng s dng trong b m, tm thi chng ta gi l hng s COUNT, k n chng ta phi xc nh b m s thc hin m bao nhiu, s ln nht m ta c th dng cho b m l 255 hoc s hex l FFh. Lnh EQU gn 1 gi tr cho 1 thanh ghi, iu ny c ngha l bt k con s no m ta gn cho COUNT th COUNT s c gi tr bng vi ni dung ca a ch . Nu th gn gi tr FFh cho COUNT ta s nhn c thng bo li khi compile chng trnh bi v a ch FFH c dng cho mch ch khc v chng ta khng th truy cp ti n, nh vy chng ta phi gn mt con s nh th no cho hp l ?, bn ng lo lng, s c cch gii quyt. Nu chng ta gn COUNT cho 1 a ch no , v d 08h, n s tr ti v tr thanh ghi mch ch chung, nhng m gi tr mc nhin sau khi m ngun ca nhng v tr khng dng n l FFh v vy nu COUNT tr ti 08h th n s c gi tr FFh. By gi ti li ang nghe bn khc rng lm sao m gn COUNT bng mt s no c gi tr trng vi 1 trong cc a ch ca cc thanh ghi s dng?, khng sao, nu vy th iu m chng ta phi lm l MOV gi tr ca bn ti v tr ny, gi s nu bn mun COUNT c gi tr l 85h, chng ta khng th lm: COUNT EQU 85h

Bi v 85h l v tr ca thanh ghi xut (out) 3 trng thi (Tri-State register) ca PORTA. Ci m chng ta phi lm l: Movlw Movwf 85h 08h ; u tin t gi tr 85h vo thanh ghi W. ; K n copy gi tr ti thanh ghi 08h.

By gi, khi chng ta ni: COUNT equ 08h

Th COUNT s tng ng vi gi tr 85h. Tht l qu quyt, c phi khng ?!

Dson

Tip tc, u tin ta nh ngha cho mt hng s COUNT equ 08h

k n gim COUNT xung 1 cho n khi n = 0, ch cn 1 lnh n lm vic ny vi s h tr ca lnh GOTO v mt ci nhn, lnh n c dng l: DECFSZ COUNT,1

Lnh DECFSZ s gim thanh ghi ( trong trng hp ny l COUNT) xung mt n v c in sau du phy (,), trong v d ny n v l 1. Nu n gim ti zero chng trnh s b qua lnh k tip nhy n thc thi lnh th 2. Mt nhiu li gii thch cho 1 lnh n c phi khng?, hy xem ci g xy ra khi ta t n vo chng trnh. COUNT equ 08h LABEL decfsz COUNT,1 Goto LABEL Carry on here. : : : iu m chng ta phi lm u tin l gn hng s COUNT = 255, k n t 1 ci nhn ngay bn cnh lnh defsz. Lnh decfsz COUNT,1 s gim gi tr ca COUNT xung 1 v lu gi tr gim tr vo trong COUNT, n cng s kim tra xem COUNT = 0 cha, nu cha n s cho chng trnh thc thi lnh k tip, trong v d ny n s thc thi lnh GOTO quay v li im bt u ( l LABEL), nu COUNT = 0 th n s cho chng trnh b qua lnh k tip v nhy n lnh th 2, trong v d ny chng trnh s nhy n ni c ch Carry on here. Nh bn thy, chng ta lm cho chng trnh lu li mt thi gian trc khi n tip tc lm vic g tip theo, ci ny gi l vng tr (Delay loop), nu chng ta mun thi gian tr ln hn chng ta phi lm mt vng tr kiu khc, nhng m cng d dng hiu ra rng c nhiu Loop hn th thi gian s tr lu hn, chng ta cn t nht l 2 Loop nh trn nu mun nhn thy n Led chp. By gi hy t chng vo trong chng trnh v kt thc chng trnh, nh thm cc ghi ch. ;*****Set up the Constants**** STATUS TRISA PORTA COUNT1 COUNT2 equ equ equ equ equ 03h 85h 05h 08h 09h ;Address of the STATUS register ;Address of the tristate register for Port A ;Address of Port A ;First counter for our delay loops ;Second counter for our delay loops

;****Set up the Port**** bsf movlw movwf STATUS,5 00h TRISA ;Switch to Bank 1 ;Set the Port A pins ;to Output.

Dson

bcf

STATUS,5

;Switch back to Bank 0

;****Turn the LED on**** Start movlw movwf 02h PORTA ;Turn the LED on by first putting ;it into the w register and then ;on the Port ;Subtract 1 from 255 ;If COUNT is zero, carry on. ;Subtract 1 from 255 ;Go back to the start of our loop. ;This delay counts down from ;255 to zero, 255 times

;****Start of the delay loop 1**** Loop1 decfsz Goto Decfsz Goto COUNT1,1 Loop1 COUNT2,1 Loop1

;****Delay finished, now turn the LED off**** movlw movwf 00h PORTA ;Turn the LED off by first putting ; it into the w register and then onthe Port

;****Add another delay**** Loop2 decfsz Goto decfsz goto COUNT1,1 Loop2 COUNT2,1 Loop2 ;This second loop keeps the ;LED turned off long enough for ;us to see it turned off ;

;****Now go back to the start of the program goto ;****End of the program**** end ;Needed by some compilers, ;and also just in case we miss ;the goto instruction. Start ;go back to Start and turn LED ;on again

Bn c th cpmpile chng trnh ny v np n vo con PIC, d nhin l bn s mun th cho n hot ng, y c sn s mch cho bn. Xin chc mng, bn va mi vit xong 1 chng trnh cho con PIC v lm cho n hot ng theo mong i. Cho n by gi bn hc c 7 trong s 35 lnh ca con PIC ri y, nhng m nh vy bn vn cha th iu khin c cc Port I/O ca n. Ti sao bn khng th thay i Delay Loop cho n nhanh hn bit gi tr Delay Loop ti thiu m mt ngi c th nhn thy n Led chp tt v thay i tc chp tt ca Led, v d mi ln l 1 giy. Trong trng hp ny bn cn phi th thay i cc gi tr hng s COUNT khc nhau ca mi Delay Loop. Trong phn tip theo chng ta s bn n ci g gi l th tc con (subroutine) gip chng ta tip tc vit cc chng trnh nh v thng thng nht. Th tc con (subroutine):

Dson

Mt th tc con l mt phn ca mt on code hay mt phn ca mt chng trnh m bn c th gi n thc thi bt k lc no cn thit. Mt th tc con c s dng khi m bn mun thc thi mt chc nng no nhiu hn 1 ln, tc l lm i lm li chc nng , v d nh Delay Loop. Ci thun tin ca mt th tc con l bn c th thay i gi tr bn trong n sau mi ln thc thi, v d bn c th thay i 10 ln ga tr ca n nu cn thit, nhng quan trng nht ca mt th tc con l bn c th tit kim b nh chng trnh chim ng trong con Pic. Hy xem mt subroutine sau: ROUTINE LABEL RETURN u tin chng ta phi t cho subroutine mt ci tn, ti chn tn ROUTINE, sau vit on chng trnh m ti mun n thc hin, ti vit li chng trnh Led chp tt nh phn trn, cui cng ti kt thc subroutine bng lnh RETURN. Bn c th t subroutine ny bt c ni no trong chng trnh chnh (MAIN) v khi mun n thc thi bn ch cn gi n bng lnh CALL theo sau l tn ca subroutine. Subroutine s thc thi on code bn trong n cho n khi n gp lnh RETURN th dng li, chng trnh s t ng quay v chng trnh chnh ng ti ni m n gi subroutine v thc thi lnh k tip sau lnh CALL. Bn c th CALL nhiu ln thc thi cng mt subroutine nu bn mun, l l do ti sao ngi ta s dng subroutine gim di ca chng trnh. Tuy nhin c hai th m bn phi ngh n, th nht l bt k hng s no cng phi c khai bo trc khi bn s dng n nhng m trong trng hp subroutine bn c th khai bo ngay trong bn thn n hoc ngay ti u chng trnh chnh nh thng thng, tuy nhin ti li khuyn bn nn khai bo mi th ti u chng trnh chnh v nh bn bit, mi th cng mt ni th d tm kin hn, c phi khng?. Vn th hai rt quan trng l bn phi bo m t subroutine sau lnh RETURN ca chng trnh chnh tr phi trong chng trnh chnh bn dng lnh GOTO nhy qua subroutine, nu khng n s thc thi bt k lnh no m n bt gp bt k bn c mun hay khng bi v con Pic khng phn bit c u l chng trnh chnh u l subroutine. Hy xem li on chng trnh chp Led nhng m ln ny ta s dng subroutine cho Delay Loop bn s thy chng trnh n gin n mc no v xem subroutine lm vic ra sao. ;*****Set up the Constants**** STATUS TRISA PORTA COUNT1 COUNT2 equ equ equ equ equ 03h 85h 05h 08h 09h ;Address of the STATUS register ;Address of the tristate register for Port A ;Address of Port A ;First counter for our delay loops ;Second counter for our delay loops COUNT decfsz Goto equ 255 COUNT,1 LABEL

;****Set up the Port****

Dson

bsf movlw movwf Bcf

STATUS,5 00h TRISA STATUS,5

;Switch to Bank 1 ;Set the Port A pins ;to Output. ;Switch back to Bank 0 02h ;Turn the LED on by first putting it PORTA ;into the w register and then on the Port

;****Turn the LED on**** Start movlw movwf

;****Add a delay call Delay ;****Delay finished, now turn the LED off**** movlw movwf 00h PORTA ;Turn the LED off by first putting it ;into the w register and then on the Port

;****Add another delay**** call Delay ;****Now go back to the start of the program goto Start ;****Here is our Subroutine Delay Loop1 decfsz Goto Decfsz Goto Return COUNT1,1 Loop1 COUNT2,1 Loop1 ;This second loop keeps the LED ;turned off long enough for us to ;see it turned off ; ;go back to Start and turn LED on again

;****End of the program**** end

;Needed by some compilers, and ;also ;just in case we miss the goto instruction.

R rng kch thc chng trnh gim i nhiu khi s dng subroutine cho Delay Loop, mi ln ta mun thc hin Delay lm cho Led ON hoc cho Led Off, ta ch cn gi subroutine Delay. Ti im kt thc subroutine chng trnh s quay tr v ngay sau dng lnh CALL. Nu khng s dng subroutine chng trnh chp Led trn c th cn n 120byte b nh chng trnh, nhng khi s dng subroutine n ch cn cn 103byte, tht ra s byte chnh lch nh vy cng khng phi l vn quan trng lm, nhng m bn ch c 1024byte cha chng trnh trong con Pic th vic tit kim c s byte nh vy qu l khng ung cng nn c lm subroutine, c phi khng Trong phn k tip chng ta s tm hiu lm sao m c c Port. c Port (Reading from the I/O Ports): Cho n by gi bn c th ghi ln Port lm cho Led chp tt, cn tip theo chng ta s tm cch c li ni dung trn chn I/O ca Port. Trc tin cn kt ni cc chn Port ti mch bn ngoi v theo di hot ng ti y.

Dson

10

Nu bn cn nh nhng th ni n trong cc phn trc, setup I/O Port chng ta phi chuyn t Bank0 sang Bank1, hy lm ci ny trc: STATUS TRISA PORTA Bsf equ 03h equ 85h equ 05h STATUS,5 ;Address of the STATUS register ;Address of the tristate register for Port A ;Address of Port A ;Switch to Bank 1

gn cho Port tr thnh Output, chng gi 0 vo thanh ghi TrisA v n tr thnh Input ta phi gi 1 n thanh ghi TrisA, qu n gin !. Movlw Movwf Bcf 01h TRISA STATUS,5 ;Set the Port A pins ;to Input. ;Switch back to Bank 0

By gi chng ta t bit0 ca PortA tr thnh Input, ci m ta phi lm by gi l kim tra li xem chn ny ang mc cao hay thp (mc1 hay mc 0), lm c iu ny ta s dng lnh BTFSC v lnh BTFSS. Lnh BTFSC c ngha l lm ng tc th xem 1 bit c ch nh trn thanh ghi c = 0 hay khng, nu l 0 th b qua lnh k tip. Lnh BTFSS th ngc li, n c ngha l lm ng tc th xem 1 bit c ch nh trn thanh ghi c = 1 hay khng, nu l 1 th b qua lnh k tip. Chng ta s s dng lnh no?, ci ny cn tu thuc vo bn mong i chng trnh c c ci g trn Port. V d: Nu bn ang mong i ng Input l 1 th hy dng lnh BTFSS, hy xem ci ny: Code here : BTFSS PortA,0 Goto start Carry on here : : Chng trnh s ch nhy n dng Carry on here nu bit0 ca PortA = 1. By gi bn hy vit li chng trnh n Led chp 1 tc c nh, nhng m nu ng 1 ci Switch no th n Led s chp chm hn .. Bn hon ton c th t lm c m, ng c nhn vo on Code bn di xem sao. Chng ta s dng cng mt mch ging nh phn trn nhng m thm mt ci Switch c mt u ni vo chn RA0 ca con Pic cn u kia mc ln ngun. ;*****Set up the Constants**** STATUS equ 03h TRISA equ 85h PORTA equ 05h COUNT1 equ 08h COUNT2 equ 09h ;****Set up the Port**** bsf STATUS,5 movlw 01h movwf TRISA ;Address of the STATUS register ;Address of the tristate register for Port A ;Address of Port A ;First counter for our delay loops ;Second counter for our delay loops ;Switch to Bank 1 ;Set the Port A pins: ;bit 1to Output, bit 0 to Input.

Dson

11

Bcf STATUS,5 ;****Turn the LED on**** Start movlw Movwf 02h PORTA

;Switch back to Bank 0

;Turn the LED on by first putting it ;into the w register and then on the Port ;Get the value from PORT A ;BIT 0. If it is a zero ;a zero, carry on as normal.If is is a 1, ;then add an extra delay routine

;****Check if the switch is closed BTFSC PORTA,0 call Delay

;****Add a delay call Delay ;****Delay finished, now turn the LED off**** movlw 00h ;Turn the LED off by first putting it movwf PORTA ;into the w register and then on the Port ;****Check if the switch is still closed BTFSC PORTA,0 ;Get the value from PORT ABIT 0. If it is a zero, Call Delay ;carry on as normal.If is a 1, then add anextra delay ;routine ;****Add another delay**** call Delay ;****Now go back to the start of the program goto Start ;go back to Start and turn LED on again ;****Here is our Subroutine Delay Loop1 Decfsz COUNT1,1 ;This second loop keeps the LED Goto Loop1 ;turned off long enough for us to decfsz COUNT2,1 ;see it turned off goto Loop1 ; return ;****End of the program**** end ;Needed by some compilers, and also ;just in case we miss the goto instruction. u tin chng trnh bt Led on, k n kim tra xem ci Switch c ng khng, nu n ng chng trnh s gi Delay subroutine, thi gian Delay ging y nh trc nhng m gi subroutine thc thi 2 ln, n s lm tng t nh vy cho trng hp Led Off. By gi bn hy compile chng trnh v cho con Pic chy th, nhng m ti c mt li cnh co bn rng, ton b nhng th m bn lm s khng gy n tng cho bt k ai khng thch th vi lp trnh cho vi x l, v vy cng ng c tht vng nu m bn em khoe vi nhng ngi thn trong gia nh ri ch cho h lm sao cho con Led chp chm i .h s ch gi v ngc nhin thch th m thi !, l nhng kinh nghim xng mu ca ti !. Nu bn theo st t u n gi th bn bit tng cng 10 trong s 35 lnh ca con Pic 16F84 ri y v tt c nhng th m bn bit ch n gin l lm cho con Led chp tt !, tht ph phm thi gian c phi khng ?, cn ti th ngh tht l ph phm b nh ca con Pic nu phi vit chng trnh di nh vy ch chp tt, nhan chm n Led !, phi c cch g lm cho hay hn.

Dson

12

Hy xem v d bn di, n mi tht s l mt chng trnh lm n Led chp tt, nhanh chm. movlw movwf movlw movlw 02h PORTA 00h PORTA

u tin ta np vo thanh ghiW gi tr 02h, sau copy n sang thanh ghi PortA bt Led on. tt n, ta Np ga tr 00h vo thanh ghi W sau copy n ti thanh ghi PortA. gia chng trnh ta phi gi subroutine cho n chp tt, chng ta phi vit 2 lnh MOV cho Led Off v 2 lnh MOV cho Led on, 2 lnh MOV s thc hin ln lt ghi data vo thanh ghi W ri chuyn vo PORTA. Sau ta gi 2 ln Delay subroutine, 1 ln Delay cho Led on v 1 ln cho Led Off. C cch no khc n gin hn khng ?, c y, l s dng lnh XORF. Lnh XORF thc hin hm XOR cho data cha trong thanh ghi, chc l khng cn phi gii thch hm XOR cho bn phi khng ?. Nh vy bt Led On/Off chng ta ch cn 2 dng Lnh. MOVLW XORWF 02h PORTA,1

u tin np vo W gi tr 02h sau thc hin lnh XORF cho data trn PortA vi gi tr 1, nu hin ti PortA c gi tr 1 th n s thay i thnh 0 cn nu PortA ang l 0 sau khi lnh XORF thc hin n s tr thnh 1. Hy xem m t li nhng g m chng ta ni: PORTA 00010 xorwf xorwf xorwf xorwf

00000 00010 00000 00010

Tht ra chng ta khng cn phi np mi ln cng mt gi tr vo trong thanh ghi W bi v c th lm iu ny ngay lc bt u chng trnh, ch cn quay tr v lnh lt ngc PortA li m thi. Ngoi ra chng ta cng khng cn phi gn mt gi tr cho thanh ghi PortA, ti sao vy?, bi v khi mi cp ngun cho con Pic th PortA mc nhin = 1 ri chng ta ch cn lt qua lt li cho PortA =0 ri =1 m thi, ngay c khi ban u PortA = 0 th chng ta cng s vn lm nh vy. Hy xem 2 on code mi, on code th nht vit theo kiu nh ban u, on code th hai l vit li nhng dng lnh XORF. ;*****Set up the Constants**** STATUS equ 03h TRISA equ 85h PORTA equ 05h COUNT1 equ 08h COUNT2 equ 09h ;****Set up the Port**** bsf STATUS,5 ;Address of the STATUS register ;Address of the tristate register for Port A ;Address of Port A ;First counter for our delay loops ;Second counter for our delay loops ;Switch to Bank 1

Dson

13

movlw 00h movwf TRISA Bcf STATUS,5 movlw 02h ;****Turn the LED on and off**** Start Xorwf PORTA,1

;Set the Port A pins ;to Output. ;Switch back to Bank 0 ;Set up our w register with 02h ;Toggle the LED

;****Add a delay call Delay ;****Now go back to the start of the program goto Start ;go back to Start and turn LED on again ;****Here is our Subroutine Delay Loop1 decfsz COUNT1,1 ;This second loop keeps the LED Goto Loop1 ;turned off long enough for us to decfsz COUNT2,1 ;see it turned off goto Loop1 ; return ;****End of the program**** end ;Needed by some compilers, and also ;just in case we miss the goto instruction. ;*******Flashing LED With Switch: ;*******Set up the Constants**** STATUS equ 03h ;Address of the STATUS register TRISA equ 85h ;Address of the tristate register for Port A PORTA equ 05h ;Address of Port A COUNT1 equ 08h ;First counter for our delay loops COUNT2 equ 09h ;Second counter for our delay loops ;****Set up the Port**** bsf STATUS,5 ;Switch to Bank 1 movlw 01h ;Set the Port A pins: movwf TRISA ;bit 1to Output, bit 0 to Input. Bcf STATUS,5 ;Switch back to Bank 0 movlw 02h ; Set up our w register with 02h ;****Turn the LED on and off**** Start xorwf PORTA,1 ;Toggle the LED ;****Check if the switch is closed BTFSC PORTA,0 ;Get the value from PORT A BIT 0.If it is a ;zero call Delay ;carry on as normal. If is a 1, then add an ;extra delay routine ;****Add a delay call Delay ;****Check if the switch is still closed BTFSC PORTA,0 ;Get the value from PORT A BIT 0. If it is a ;zero, call Delay ;carry on as normal. If is a 1, then add an

Dson

14

;extra delay routine ;****Add another delay**** call Delay

;****Now go back to the start of the program goto Start ;go back to Start and turn LED on again ;****Here is our Subroutine Delay Loop1 Decfsz COUNT1,1 ;This second loop keeps the LED goto Loop1 ;turned off long enough for us to decfsz COUNT2,1 ;see it turned off goto Loop1 ; return ;****End of the program**** end ;Needed by some compilers, and also ;just in case we miss the goto instruction. Ch cn dng cc lnh n gin chng ta c th gim kch thc ca chng trnh. Thc s ta gim c bao nhiu byte khi vit li cc chng trnh bng cc lnh n gin, hy xem thng k: Program Flashing LED Flashing LED Flashing LED LED With Switch LED With Switch Change Original Subroutine Added XOR Function Used Original XOR Function Used Size (Bytes) 120 103 91 132 124.

Chng ta khng ch hc vi lnh mi m cn hc cch lm sao gim kch thc ca chng trnh. Ton hng Logic v S hc: Trong phn trn chng ta c gii thiu lnh XORF v cch s dng n, trong phn ny s ni tip cc ton hng v lnh Logic m con Pic c h tr. By gi ta s ni lm sao thao tc trn cc bit ring r, thc hin vi thut ton thng thng trn d liu. S khng c v d na nhng m s gii thch cn k lm th no dng cc ton hng trong cc on code nh. Lnh ANDLW v ANDWF: Con Pic cho ta 2 mn c ch bin t hm AND, l lnh ANDLW v ANDWF. Lnh ANDLW cho php ta AND ni dung trong thanh ghi W vi mt con s xc nh, c php l: ANDLW <number> <number> l ci m ta s AND vi ni dung trong thanh ghi W, kt qu AND s lu trong thanh ghi W. Lnh ANDWF cho php ta AND thanh ghi W vi mt thanh ghi khc, v d nh vi PortA, c php l: ANDWF <register>,d

Dson

15

<register> l thanh ghi m ta ch nh, v d PortA, d ni cho Pic bit ni lu kt qu. Nu d=0 th kt qu lu vo thanh ghi W v d=1 th kt qu lu vo thanh ghi ng trc d. Hai on code bn di s m t 1 v d cho mi hm AND. u tin kim tra trng thi PortA l ni m ta cn bit ng vo c = 1100 hay khng v t kt qu vo trong thanh ghi W. Movlw 1100 ANDWF 05h,0 V d th hai s kim tra ni dung trong W. ANDLW 1100

Lnh IOR: Lnh IOR n gin nh l mt hm OR, khi mt trong hai bit =1 hoc c hai u = 1 m OR vi nhau s cho kt qu = 1, ngc li s =0. Lnh ADDLW v ADDWF: ADD l mt hm cng 2 s vi nhau, nu kt qu ln hn 8bit th c CARRY s c set ln 1 ngc li n =0. C CARRY c a ch byte 03h v nm ti bit0. Mt ln na con Pic cho ta 2 mn ch bin t hm ADD, l ADDLW v ADDWF, bn cng c th on rng n cng tng t nh cc hm trn. Lnh ADDLW cng ni dung ca thanh ghi W vi mt s xc nh, c php l: ADDLW <number> Lnh ADDWF cng ni dung ca thanh ghi W vi mt thanh ghi bt k, kt qu lu trong W, c php l: ADDWF <register>,d <register> l thanh ghi m chng ta ch nh v d ni cho con Pic bit ni lu kt qu. Nu d=0 kt qu lu trong thnh ghi W, d=1 kt qu lu trong thanh ghi ta ch nh (tc l <register>). Lnh SUBLW and SUBWF: Hm SUB, ti dm nh cc bn khng th on c hm ny lm ci g ?!, thi c ri, xem nh bn on ra, hm SUB ny tr 1bit vi 1bit khc. Mt ln na con Pic li cho ta 2 mn c ch bin t hm SUB, l SUBLW and SUBWF, c php th ging y nh l nhng mn ca hm ADD nhng m thay v cng th n tr. Lnh INCF v INCFSZ: Nu chng ta mun cng 1 vi mt s trong Pic, n gin ta s dng hm ADD v s 1, ci bt tin l u tin ta phi b con s 1 vo trong thanh ghi W, sau dng lnh ADDLW 1 tng n ln 1. Nu ta ch mun cng s 1 vo mt thanh ghi bt k th cn ti t hn, u tin phi t s 1 vo thanh ghi W, sau dng lnh ADDWF <register>,1. V d ta mun cng s 1 vi ni dung ca a ch 0Ch, ta phi vit on code sau: Movlw addwf 01 0c,1

C mt cch tt hn cch ny l dng lnh INCF trong con Pic, c php l: INCF <register>,d

Dson

16

Vi <register> l thanh ghi, hoc a ch m ta ch nh, cn d th ni cho con Pic bit ni t kt qu. Nu d=0 th kt qu lu trong thanh ghi W, nu d=1 kt qu s c lu trong thanh ghi ch nh nm trc n (tc l <register>) Bng cch ny ta c th tit kim b nh ca Pic. Nu ta mun kt qu lu trong W th s dng v d trn sau thm mt lnh khc MOV ni dung trong a ch 0Ch tr vo trong thanh ghi W sau t vo thanh ghi 0Ch bt c ci g. C mt lnh increment khc, l INCFSZ, lnh ny s tng thanh ghi m ta ch nh ln 1, nhng nu thanh ghi ny =0 sau khi thc thi lnh ( xy ra khi cng 1 vo FFh) th con Pic s b qua lnh k tip, on code bn di s m t lnh ny: Loop Incfsz Goto : : Rest of program. Trong on code trn, a ch 0Ch s tng ln 1 sau chng trnh ni cho con Pic quay v nhn Loop v gia tng 0Ch ln ln na, n lm tip tc nh vy cho ti khi 0Ch =127 (FFh). Ln ny khi tng ln 1, ni dung ca 0Ch s =0. Lnh INCFSZ s ni cho con Pic bt hy b qua lnh k tip, trong trng hp v d trn n b qua lnh GOTO Loop thc thi tip on code cn li. Lnh DECFSZ: Lnh DECFSZ bn trong cc v d trc, by gi ta s khng nhc li na. Lnh COMF: Lnh cui cng trong nhm ny l lnh COMF, n o ngc (Compliment) tt c cc bit trong thanh ghi c ch nh, c php l: COMF <register>,d. Vi <register> l thanh ghi m ta mun o v d ni cho con Pic bt ni lu kt qu. Nu d=0 kt qu lu trong thanh ghi W, nu d=1 th kt qu lu trong thanh ghi ch nh nm trc d ( tc l <register>). Xem m t sau y: 0C = 11001100 COMF 0C,1 0C = 00110011 Ci ny rt tin li khi m bn mun nhanh chng bt cc chn ca Port t Output tr thnh Input hoc ngc li. Ton hng trn Bit: Cc ton hng dng cho Bit cho php chng ta thao tc trn cc bit n l trong byte, n cho php MOV, SET v CLEAR bit trong thanh ghi hoc nhng a ch c ch nh, phn cui ca tutorial ny ta s trnh by mt chng trnh lm cho con Led sng chy theo nhiu cch khc nhau. Lnh BCF: Trong cc phn trc chng ta xem mt s lnh thc thi trn bit, trong phn ny ta s xem mt s lnh cn li tc ng ln bit nh th no. BCF l lnh xo 1 bit c ch nh trong thanh ghi, c php l: 0C Loop

Dson

17

BCF

<register>,<bit>

Chng ta s dng lnh ny trong phn trc thay i t Bank1 sang Bank0 bng cch xo bit trong thanh ghi STATUS, chng ta cng c th Clear 1 bit v 0 ti bt k bit no trong bt k thanh ghi no, v d, nu bn mun Clear bit th 3 trong thanh ghi 0Ch c ni dung = 11001101, bn c th lm nh sau: BCF 0C,03 Lnh BSF: Lnh BSF ngc li, n c th Set 1 bit ln 1 ti bt k bit no trong bt k thanh ghi no, ta dng ci ny trong phn trc nhy t Bank0 sang Bank1, c php l: BSF <register>,<bit> Cch dng BSF ging y nh cch dng BCF. Lnh BTFSC: Chng ta c th Set bit v Clear bit trong thanh ghi, nhng m nu bn ch mun th xem bit no trong thanh ghi l = 1 hay = 0 th sao, rt n gin, hy dng lnh BTFSC, n c gi l Bit Test Register F and Skip If It Is Clear, tm dch l lnh th kim tra bit trong thanh ghi v b qua lnh k nu bit = 0, qu r rng ri, khng cn phi gii thch g thm na phi khng ?!, ta s dng lnh ny kim tra mt ci c (flag) no v d nh c Carry, n trnh cho ta khi phi c thanh ghi STATUS tm xem trng thi ca tng bit nh th no. V d, nu bn mun th bit c Carry =1 cha sau khi bn cng 2 byte vi nhau, bn hy th lm ci ny: BTFSC 03h,0 Nu c Carry=1 th chng trnh thc thi tip lnh ng k tip, nu Carry=0 n s b qua lnh k tip, xem on code sau: Loop : : : BTFSC Goto Loop

03,0

Trong on code trn, con Pic s i ra khi Loop nu bit0 trong thanh ghi STATUS ( hay c Carry) b xo v 0, ni cch khc nu c Carry=0 lnh GOTO s c thc hin. Lnh BTFSS: Lnh ny c ngha l Bit Test Register F, And Skip If Set tm dch l kim tra bit trong thanh ghi F v b qua lnh k nu=1. N ging nh l lnh BTFSC nhng m ch khc l con Pic s b qua lnh k tip nu bit=1. Lnh CLRF: Lnh ny s Clear ni dung trong thanh ghi hin hnh v 0, c php l: CLRF <register> Chng ta dng lnh ny trc y Clear ng ra Output ca Port v 0 bng cch dng cu lnh: CLRF 05h lnh CLRW: Lnh ny ging y nh lnh CLRF nhng m ch khc l n ch Clear thanh ghi W, c php th hon ton n gin: CLRW

Dson

18

Lnh RLF v RRF: Lnh ny s dch bit trong thanh ghi sang v tr bn tri (RLF) hoc bn phi (RRF) ca thanh ghi , v d bn c 00000001 v bn dng lnh RLF th bn s nhn c 00000010. By gi hy xem ci g s xy ra nu bn c 10000000 v tip tc thc thi lnh RLF?, ng c ht hong, bit 1 ca bn s i sang c Carry, nu bn li tip tc RLF th bit 1 s quay tr v v tr 0 trong byte. Mi th s din ra ng nh vy i vi lnh RRF nhng m bit s di chuyn theo chiu bn phi. V d bn di biu din lnh RLF, bn c nhnh thy ch C l k hiu ca c Carry, cc con s 7654321 l th t t cao xung thp ca 8bit trong thanh ghi. C 76543210 0 00000001 RLF 0 00000010 RLF 0 00000100 RLF 0 00001000 RLF 0 00010000 RLF 0 00100000 RLF 0 01000000 RLF 0 10000000 RLF 1 00000000 RLF 0 00000001 Chng trnh Test: By gi bn s xem mt v d, nu mun bn c th compile v cho n chy th. Chng trnh ny lm cho n chy bt u t bit0 ca PortA sang ti bit8 ca PortB ri quay v thc thi li t u. Bn hy kt ni cc con Led vo chn Port ri cho chy chng trnh, bn s nhn thy cc bit hot ng nh nhng g m ta ni t trc n gi.

TIME PORTB TRISB PORTA TRISA STATUS COUNT1 COUNT2 BSF MOVLW MOVWF MOVLW MOVWF

EQU EQU EQU EQU EQU EQU EQU EQU

9FH 06H 86H 05H 85H 03H 0CH 0DH

; Variable for the delay loop. ; Port B address. ; Port B Tristate address. ; Port A address. ; Port A Tristate address. ; Page select register. ; Loop register. ; Loop register. ; Go to page 1 ; and set up ; both Ports A and B ; to Output, ; then return to

STATUS,5 00H TRISB 00H TRISA

Dson

19

BCF STATUS,5 MOVLW 00H MOVWF PORTA ; Start of main program RUN MOVLW 01H MOVWF PORTB CALL DELAY CALL DELAY

; page 0. ; Clear Port A. ; ; Set the first bit ; on Port B. ; Wait a while ; ; Move the bit on Port B left, then pause.

RLF PORTB,1 CALL DELAY CALL DELAY RLF PORTB,1 CALL DELAY CALL DELAY RLF PORTB,1 CALL DELAY CALL DELAY RLF PORTB,1 CALL DELAY CALL DELAY RLF PORTB,1 CALL DELAY CALL DELAY RLF PORTB,1 CALL DELAY CALL DELAY RLF PORTB,1 CALL DELAY CALL DELAY RLF PORTB,1 ; This moves the bit into the carry flag ; Now move onto Port A, and move the bit left. RLF PORTA,1 ; This moves the bit from the zero flag into PortA CALL DELAY CALL DELAY RLF PORTA,1 CALL DELAY CALL DELAY RLF PORTA,1 CALL DELAY CALL DELAY RLF PORTA,1 CALL DELAY CALL DELAY ; Move the bit back on Port A RRF PORTA,1 CALL DELAY CALL DELAY

Dson

20

RRF CALL CALL RRF CALL CALL RRF

PORTA,1 DELAY DELAY PORTA,1 DELAY DELAY PORTA,1

; This moves the bit into the zero flag ; Now move the bit back on Port B

RRF PORTB,1 CALL DELAY CALL DELAY RRF PORTB,1 CALL DELAY CALL DELAY RRF PORTB,1 CALL DELAY CALL DELAY RRF PORTB,1 CALL DELAY CALL DELAY RRF PORTB,1 CALL DELAY CALL DELAY RRF PORTB,1 CALL DELAY CALL DELAY RRF PORTB,1 CALL DELAY CALL DELAY ; Now we are back where we started, ; GOTO RUN ; let's go again. ; Subroutine to give a delay between bit movements. DELAY MOVLW TIME ; Get the delay time, MOVWF COUNT1 ; and put it into a variable. LOOP1; DECFSZ COUNT1 ; Decrement 1 from the delay time until it GOTO LOOP1 ; reaches zero. MOVWF COUNT1 ; Get the delay time again, LOOP2 ; and repeat the count down. DECFSZ COUNT1 ; GOTO LOOP2 ; RETURN ; End of subroutine. END ;

Dson

21

Bng d liu ( Data Table): C mt im rt c bit trong tp lnh m n cho php bn truy xut d liu theo kiu tra bng (data table). Mt bng d liu thng thng l mt danh sch lit k cc gi tr ca d liu, mi gi tr c c ph thuc vo vic phi tho mn vi tiu thc no . V d, bn c mt con Pic v bn mun m s ln ng vo Input c nng ln mc cao trong thi gian 1giy l bao nhiu sau hin th ln Led 7 on. Mi ln thi gian bt u tnh, con Pic s m s ln ng Input vo c nng ln mc cao trong thi gian 1 giy, sau 1 giy n hin th con s n m c tng ng vi s ln ng vo Input c nng ln mc cao. Ci ny rt tin dng bi v chng ta khng bit c hin ti con s m l bao nhiu cho n khi con Pic dng li, bng cch s dng bng tra d liu chng ta c th cho php con Pic qut nh con s no n cn hin th. By gi trc khi gii thch bng tra d liu lm vic ra sao ta s bn xem con Pic bm theo ch no trong chng trnh trong lc chng trnh ang chy. Nu bn tng lp trnh trong BASIC th mt nhc hn, cn nu khng bn cng ng lo lng, bn s vn tm thy cc khi nim y. Hy tng tng chng ta c mt chng trnh BASIC nh chng trnh bn di: 10 11 12 20 21 LET K=0 K=K+1 IF K>10 THEN GOTO 20 ELSE GOTO 11 PRINT K END

Chng trnh bt u ti dng s 10, mi ln K =0 n tin ti dng 11, sau khi cng thm 1 cho K n di chuyn n dng 12. y chng ta hi K c ln hn 10 khng ?, nu ng n tip tc i ti dng 20, nu sai n quay tr li dng 11, dng 20 s xut gi tr ca K v dng 21 s kt thc chng trnh. BASIC s dng con s th t dng gip cho lp trnh vin bm theo chng trnh mt khi nhng ci nhn nhn dng khng cho php s dng trong BASIC. Con Pic c s dng nhng ci nhn nhy qua li cc v tr hay khng?, chng ta dng nhng ci nhn nhn dng v vy chng ta bit nhng th g, u v ni cho con Pic bit con ng n phi i. Ci m thc s con Pic dng l b m dng lnh bn trong cn gi l b m chng trnh Program Counter. Program Counter vit

Dson

22

tt l PC d tm cc v tr trong b nh tm kim v tr hin ti ca cu lnh m chng trnh ang thc thi. Khi chng ta ni cho con Pic bt phi i n ci nhn no , n bt v tr ca ci nhn ny trong b nh v n gia tng PC ln cho ti khi n c c v tr . iu ny ging y nh ci cch m chng ta c chng trnh trong BASIC Bn di l on code v cc v tr b nh hay ni cch khc chnh l ni dung trong PC, k bn l cc dng lnh. PC 0000 0001 0002 0003 04 Instruction movlw movwf decfsc goto end 03 0C 0C Loop

Loop

Trong v d trn, ta set PC ti 0000. ti v tr ny ta c lnh movlw 03. Khi con Pic thc thi lnh ny n tng PC ln v v vy n c tip lnh k, y con Pic li thy lnh movwf 0C, n li tng PC ln mt ln na, ln ny n thy lnh decfsc 03, nu ni dung trong a ch 0C khng = 0 con Pic s tng PC ln 1 v c lnh k tip, lnh Goto loop ni con Pic hy quay li v tr 0002. Nu ni dung trong 0C l 0 th con Pic ni PC phi tng ln 2 hay ni cch khc l b qua lnh k tip n, nh vy n s n v tr 0004, ti y l im kt thc ca chng trnh. Cc v tr c thit lp bi assembler, v chng ta khng cn lo lng con Pic ang lm ci g cho ti khi chng ta cn kim sot n nh trong trng hp ca bng tra d liu. Cch tt nht gii thch bng d liu lm vic ra sao l hy chm dt ngay ci v d ny v xem ci bn di y !. PC Movlw Call : table retlw retlw retlw retlw retlw retlw retlw return equ 02 03 table addwf PC 01 02 03 04 05 06 07

Lnh u tin gn ci nhn PC c a ch ca Program Counter (02h), sau chng ta t gi tr ca thanh ghi 03h vo trong thanh ghi W. By gi ta lm mt lnh gi bng tra d liu. Dng u tin trong subroutine bng d liu s cng ni dung ca thanh ghi W (03h) vi PC, iu ny lm cho PC tng ln 3, tng ng vi vic PC s i xung 3 dng. Khi PC xung dng th 3 con Pic trng thy lnh reltw, lnh ny chuyn gi tr ng sau n vo thanh ghi W ri quay tr v li subroutine. Lnh RETLW c ngha l quay v v tr gi tr pha sau n v thanh ghi W. Lu l c 2 ng tc c thc hin trong lnh RETLW. Khi ta ang ng trong mt subroutine ta cn c mt lnh quay v thot ra khi subroutine l lnh RET.

Dson

23

Pha sau lnh RETLW l mt con s, con s ny l th m ta s t vo trong thanh ghi W, trong trng hp ny n l s 03. Chng ta c th gn cho thanh ghi W bt k gi tr no nhng phi chc chn rng con s ny sau khi cng vi PC trong subroutine bng tra d liu s tm ra c mt lnh RETLW, trong v d trn, iu ny c ngha l ta c th c bt k con s no t 1 n 7, nu ta i lt ra ngoi subroutine th c th s lm cho con Pic khng th thc hin bt k phn no ca chng trnh na. Chnh v iu ny m ngi ta hay t bng tra d liu cui ca chng trnh, nh vy nu b lt ra khi subroutine th s n im kt thc chng trnh (End). Ngt (Interrupt): Ch ni v cc Ngt (Interrupts) hu nh l di nht v kh hiu nht, khng phi d gii thch v ngt cho ngi no hiu, nhng m hy vng sau khi kt thc phn ny chng ta c th p dng ngt vo trong chng trnh ca chng ta. Chng ta s chia phn ny thnh 2 phn nh, mch ch l cho bn ngh gii lao !. u tin, Ngt (interrupt) l ci g vy ?, n tht s c ngha ging nh tn gi ca n vy, mt Interrupt l mt tc v x l hay l mt tn hiu x l m n c th bt con Pic dng li nhng g ang lm lm mt cng vic khc. Mt v d d hiu, hy ly sinh hot hng ngy ca bn, gi s bn ang ngi nh, ri bn ang tn gu vi ai , thnh lnh chung in thoi reo, bn ngng cuc ni chuyn li, nht in thoi ln v ni chuyn vi ngi gi n. Khi bn kt thc cuc ni chuyn bng in thoi bn li quay tr v v tip tc tn gu vi ngi ni chuyn vi bn trc khi in thoi reo. By gi bn hy tng tng, chng trnh chnh l qu trnh tn gu ca bn vi ngi bn ngi nh, in thoi reo to ra mt Interrupt v th tc (routine) Interrups l cuc ni chuyn vi ngi u dy bn kia, khi kt thc cuc ni chuyn bng in thoi bn quay v chng trnh chnh tip tc tn gu, V d ny gii thch chnh xc mt Interrups to ra mt tin trnh x l nh th no. Mt chng trnh chnh ang chy, thc hin mt vi chc nng no trn mch in, nhng khi Interrupt xy ra chng trnh chnh s tm ngng v ngay lc mt th tc khc c thc hin, khi th tc ny kt thc con Pic s li quay v chng trnh chnh. Con Pic c 4 Interrupt, n c th c chia thnh 2 nhm, 2 Interrupts phc v cho cc thit b kt ni ngoi vi v 2 Interrupts cho bn trong n. Trc tin ta hy ni v 2 Interrupts bn ngoi, 2 Interrups bn trong Pic s ni n trong phn Timers v lu tr Data. Nu bn quan st trn s chn ca Pic bn s thy chn s 6 c ghi l RB0/INT, RB0 l bit0 ca PortB, k hiu INT l k hiu chc nng Interrupt ngoi. Ngoi ra cc chn t 10 n 13 ( bit 4 ti 7 ca PortB) cng c th s dng cho Interrupt. Trc khi s dng Interrupt hay dng n nh l Port in out thng thng chng ta cn phi lm 2 vic. u tin ta cn ni cho con Pic bit rng ta s s dng Interrupt, k n ta cn xc nh chn no ca PortB s dng nh Interrupt. Trong con Pic c 1 thanh ghi gi l INTCON, a ch l 0Bh, trong thanh ghi ny c 8bit c th thit lp ch cho php hay khng cho php. Bit7 ca INTCON c gi l GIE c ngha l Global Interrngupt Enable tm dch l chn cho php s dng ton b Interrup. Nu set bit ny ln 1 con Pic s cho php s dng Interrupt. Bit4 ca INTCON gi l INTE c ngha l INTerrupt Enable tm dch l cho php Interrupt, set bit ny ln 1 s cho php chn RB0 tr thnh chn Interrupt. Bit3 cn gi l bit RBIE nu c set=1 s bo cho con Pic bit ta s s dng t bit4 cho n bit7 ca PortB. By gi th con Pic bit v theo di khi no chn ny ln cao hay xung thp, n bit cn phi dng chng trnh chnh li khi no quay ra phc v th tc ca Interrupt. By gi chng ta cn ni cho con Pic bit s khi ng Interrupt bng cnh ln (t 0V ln 5V) hay cnh xung ( t 5V xung 0V) ca tn hiu vo chn Interrupt. Ni cch

Dson

24

khc, ta mun con Pic phc v Interrupt khi tn hiu vo thay i t thp ln cao hay t cao xung thp. Mc nhin sau khi bt ngun con Pic s thit lp ch Interrupt cnh ln, c ngha l interrup xy ra khi tn hiu vo thay i t thp ln cao (cnh ln) Thanh ghi OPTION a ch 81h chnh l thanh ghi thit lp ch cho Interrupt tch cc cnh ln hay cnh xung ca tn hiu vo, bit6 ca thanh ghi OPTION c gi l INTEDG, nu setbit6=1 s thit lp interrupt tch cc cnh ln ca tn hiu vo (trng thi default) , nu Clear bit6=0 s thit lp interrupt tch cc cnh xung ca tn hiu vo. Nu bn mun con Pic thit lp interrupt xy ra cnh ln ca tn hiu th bn khng cn phi lm g trn bit6 ca thanh ghi OPTION. Tht khng may mn, thanh ghi OPTION li nm trn Bank1, v vy bn phi lm ng tc di chuyn t Bank0 sang Bank1 sau Set bit6 trn thanh ghi OPTION ri li quay tr v Bank0. C mt mnh li lm tt c chuyn ny trn Bank1 nh l thit lp cc chn Port, quay tr vo Bank0 !. c ri, cho n gi chng ta bit chn no ca con PIC s tr thnh Interrupt v tch cc cnh no ca tn hiu, ci g s xy ra trong chng trnh v Interrupt xy ra khi no. C 2 th xy ra, th nht l c 1 c flag c set ni cho con Pic bit rng c 1 Interrupt xy ra, th hai b m chng trnh (program counter) tr n mt a ch c bit trong con Pic, hy xem tng vn nh th no. C Ngt (Interrupt Flag): Trong thanh ghi INTCON bit1 chnh l c bo Interrupt gi l INTF, khi c Interrupt xy ra, c ny s c set ln 1, trc khi c Interrupt xy ra n =0. Trong khi c Interrupt c set ln 1 th con Pic s khng th v khng bao gi p ng bt k mt Interrupt no na. Ci c c set ln 1 v con Pic s thc thi chng trnh (routine) ca Interrupt, nu ci c v l do g khng th set ln 1 v con Pic ang thc thi chng trnh Interrupt th tn hiu vo lin tc ti chn Interrupt s lin tc gy ra Interrupt trn con Pic lm cho n phi lin tc quay tr v im bt u ca chng trnh (routine) Interrupt v s khng bao gi n c th kt thc c chng trnh Interrupt ny. By gi quay li v d v chuyn tn gu v cuc ni chuyn in thoi ca bn, n ging nh l bn va nht in thoi ln nh ni chuyn th chung li reo ln na v c ai cng ang mun ni chuyn vi bn!. Ti sao khng phi l sau khi kt thc cuc chuyn tr vi ngi th nht bn li nht in thoi ln mt ln na ni chuyn vi ngi th hai, c phi tt hn khng!, ti on l l do ti sao m in thoi khng th reo trong khi bn nhc ng nghe. C mt tr ngi nh trn ci c ny, mc d con Pic t ng set c ny ln 1 nhng n li t chi trch nhim Clear ci c ny v 0 ! v vy m trch nhim cao c ny c trao cho ngi lp trnh vin !, nu khng th s khng bao gi c interrupt xy ra na. Ci ny th d dng thi v ti chn chn rng bn s lm c. a ch b nh: Memory Location Ln u tin m ngun hoc khi reset con Pic, B m chng trnh (Program Counter) tr n a ch 000h, chnh l im bt u ca b nh chng trnh. Tuy nhin hki c Interrupt xy ra th PC s tr n a ch 0004h, v vy khi vit chng trnh m c s73 dng Interrupt th u tin chng ta phi ni cho con Pic nhy (jump) n a ch 0004h v tch ring chng trnh Interrupt ( bt u ti 0004h) vi cc chng trnh khc, iu ny th rt d lm c phi khng ?. (du tin chng ta khi ng chng trnh bng lnh ORG, lnh ny ngha l Origin, or start tm dch l im khi u hay im khi ng, theo sau ORG l mt a ch xc nh. Bi v con Pic khi ng ti 0000h nn chng ta vit:

Dson

25

ORG 000h K n chng ta cn nhy qua khi a ch 0004h, bn hy dng lnh GOTO lm iu ny v theo sau GOTO l 1 ci nhn m n s tr ti im bt u ca on code ca chng trnh chnh. Sau ta t tip mt ORG khc, v ta ang ni n Interrupt nn bn phi t ORG 0004h Theo sau lnh ORG 0004h chng ta s vit chng trnh Interrupt hoc c th t 1 lnh GOTO nhy n chng trnh Interrupt t u . Vit chng trnh Interrupt theo sau ORG 0004h Hay dng lnh GOTO nhy n 1 chng trnh Interrupt t u tht s l vn chn la. chm dt 1 chng trnh Interrupt ta cn t lnh RTFIE ti cui chng trnh Interrupt , RTFIE c ngha l return from the interrupt routine tm dch quay tr v t chng trnh Interrupt, khi con Pic nhn thy lnh RTFIE n bo cho Program Counter bit di ti v tr ln cui cng n ng trong chng trnh chnh trc khi Interrupt xy ra, hy xem mt on code ngn bn di y: ORG GOTO ORG : : : RETFIE start 0000h start 0004h ;PIC starts here on power up and reset ;Goto our main program ;The PIC will come here on an interrupt ;This is our interrupt routine that we ;want the PIC to do when it receives ;an interrupt ;End of the interrupt routine ;This is the start of our main program.

C 2 iu quan trng m bn cn ch khi s dng Interrupt: Th nht, nu bn s dng cng mt thanh ghi cho chng trnh chnh v cho Interrupt th rt c th ni dung ca thanh ghi ny b thay i khi Interrupt xy ra, v d: bn s dng thanh ghi W gi Data ti PortA trong chng trnh chnh v cng dng thanh ghi W trong Interrupt di chuyn ni dung t ni ny n ni khc, nu bn khng cn thn th thanh ghi W s cha gi tr cui cng trong chng trnh Interrupt (khi interrupt xy ra), v ri, khi bn quay v chng trnh chnh bn li gi ni dung ny vo PortA thay v mt ni dung khc trc khi Interrupt xy ra. Cch n gin trnh thm ho ny l bn hy lu thanh ghi W vo v tr tm no y v dng n li sau khi chng trnh Interrupt kt thc. Th hai, l thi gian ngh bt buc gia 2 ln interrupt xy ra lin tip, nh bn bit, con Pic c mt b dao ng bn trong hot ng bng cch mc vi bn ngoi hoc dng thch anh hoc dng mch RC, tn s dao ng ny c chia 4 bn trong to ra xung Clock lm nhp cho 1 chu k lnh, V d: nu thch anh l 4MHz kt ni vi con Pic th 1 chu k lnh l: 4MHz/4 = 1MHz By gi hy xem hng dn s dng cho con Pic ca nh sn xut, phi c t nht l 3 n 4 chu k lnh gia 2 interrupt, ti chn v khuyn bn cng nn chn 4 chu k lnh gia 2 interrupt cho chc n !. L do m con Pic cn thi gian ngh gia 2 ln Interrupt l n phi lm th chuyn nh l nhy n a ch Interrupt, set c interrupt, thot ra khi chng trnh interrupt. Nh vy, da trn nhng g bn trong phn trn, bn phi lu khi s dng mch kt ni vi cc thit b ngoi vi kch hot interrupt ca con Pic. By gi li c mt th cn phi nh, l khi bn s dng t bit4 n bit7 ca PortB nh Interrupt th bn khng th chn ring tng chn trn PortB n lm vic nh Interrupt, nu bn cho php (enable) nhng chn ny th bn cho php tt c Trong phn tip theo chng ta s vit chng trnh cho Interrupt

Dson

26

Interrupts Chng trnh Interrupt: Chng trnh m ta s vit l m s ln 1 ci Switch bt on ri hin th con s . CHng trnh s m t 0 n 9, hin th ln 4 Led di dng Binary, ng vo interrupt l RB0. u tin ta cn phi bo cho con Pic nhy n a ch m b m chng trnh s tr n khi Interrupt xy ra, hy lu chng ta s s dng 1 cch khc biu din s Hex. Trc y chng ta hay vit F9h vi h c ngha l hexadecimal, by gi chng ta vit li l 0xF9, v ci ny chnh l dng m chng ta s vit t gi tr i. Org 0x00 Goto main Org 0x04 Retfie main ;This is where the PC points to on power up and reset ;Goto our main program ;This is where our interrupt routine will start ;This tells the PIC that the interrupt routine has ;finished and the PC will point back to the main program ;This is the start of our main program

By gi chng ta cn ni cho con Pic bit rng chng ta s s dng Interrupt v s dng RB0 (chn 6) nh l chn Interrupt. bsf bsf INTCON,7 INTCON,4 ;GIE Global interrupt enable (1=enable) ;INTE - RB0 interrupt enable (1=enable)

K n chng ta xo c Interrupt, mc d chng ta ni khi m ngun ln u tin th c Interrupt mc nhin b xo v 0, nhng m ti cha bao gi tin vo bt k iu g !. bcf INTCON,1 ;INTF - Clear flag bit just in case

V by gi setup 2 Port, nh rng khi chng ta s dng RB0 nh mt Interrupt th ta phi setup n nh mt ng vo Input. Bsf Movw Movwf Movlw Movwf Bcf STATUS,5 0x01 TRISB 0x10 TRISA STATUS,5 ;Switch to Bank 1 ; ;Set RB0 as Input ; ;Set the first 4 pins on PortA as Output ;Come back to Bank 0

Chng ta s s dng bin COUNT lu s ln Switch On, bn c th hi ti sao chng ta khng lm n gin l tng gi tr ca PortA ri c li gi tr ny, nhng bn s bit l do ti sao m ti s dng bin COUNT khi vit chng trnh Interrupt. loop movf movwf goto end COUNT,0 PORTA loop ;Move the contents of COUNT into W ;Now move it to Port A ;Keep on doing this ;End of our program

Chng trnh chnh c, by gi ta ni cho con Pic bit ci g s lm khi Interrutp xy ra, trong trng hp ny Interrupt ca chng ta s l ci Switch. Chng ta mun con Pic cng thm 1 vo bin COUNT mi ln ci Switch ng li. Nhng m PortA c 5 bit, nu chng ta ch n gin tng Port ln 1 th chng ta s c s m ti a l 31.

Dson

27

C 2 l do m ti chn khng tng ln n 31. Th nht chng ta dng Led 7 on, m thng thng n ch biu din c t 0 n 15 ( t 0 n Fh). Th hai, ti cng mun biu din vi thut ton thng thng bn hiu nhng th s trnh by trong phn cui ca cun sch ny. Ci u tin chng ta cn lm l lu ni dung ca thanh ghi W vo ch tm thi v chng ta s dng W ti ni dung ca COUNT vo PortA, nu khng lm vy c th ta s ti ni dung khc ln PortA ch khng phi COUNT. Movwf TEMP ;Store w register in a temporary location

K tip ta mun cng 1 vo bin COUNT: Incf ;Increment COUNT by 1, and put the result back into ;COUNT K n chng ta mun kim tra xem COUNT ln hn 9 cha bng cch l ly COUNT tr cho 10. Movlw Subwf 0x0A COUNT,0 ;Move the value 10 into w ;Subtract w from COUNT, and put the result in w COUNT,1

Trong cc phn trc bn bit, nu ta ly mt s nh tr cho s ln hn th c Carry s set ln 1, ngoi ra c Carry cng s c set ln 1 khi chng ta tr 2 s bng nhau. Btfss STATUS,0 ;Check the Carry flag. It will be set if ;COUNT is equal to, or is greater than w, ;and will be set as a result of the subwf instruction

Chng ta mun, nu COUNT ln hn 9 th t li gi tr 0 cho n, ngc li s quay v chng trnh chnh xut gi tr COUNT ra PortA Lnh BTFSS nh bn bit l n s b qua lnh k nu c Carry =1. Trong trung hp ny nu COUNT=10: goto goto carry_on bcf movfw retfie clear clrf bcf retfie COUNT INTCON,1 ;Set COUNT back to 0 ;We need to clear this flag to enable ;more interrupts ;Come out of the interrupt routine carry_on clear INTCON,0x01 TEMP ;If COUNT is <10, then we can carry on ;If COUNT is >9, then we need to clear it ;We need to clear this flag to enable ;more interrupts ;Restore w to the value before the interrupt ;Come out of the interrupt routine

By gi hy rp li tt c cc on code li vi nhau. Bn di l 1 chng trnh hon chnh, mch in trnh by sau chng trnh ny, mi ln bn cho Switch On n Led s m theo s Binary t 0000 n 1010 ri quay tr v 0000.

Dson

28

org 0x00 ;This is where we come on power up and reset ;*******************SETUP CONSTANTS******************* INTCON EQU 0x0B ;Interrupt Control Register PORTB EQU 0x06 ;Port B register address PORTA EQU 0x05 ;Port A register address TRISA EQU 0x85 ;TrisA register address TRISB EQU 0x86 ;TrisB register address STATUS EQU 0X03 ;Status register address COUNT EQU 0x0c ;This will be our counting variable TEMP EQU 0x0d ;Temporary store for w register Goto main ;Jump over the interrupt address ;***************INTERRUPT ROUTINE*************** org 0x04 ;This is where PC points on an interrupt movwf TEMP ;Store the value of w temporarily incf COUNT,1 ;Increment COUNT by 1, and put the result ;back into COUNT movlw 0x0A ;Move the value 10 into w subwf COUNT,0 ;Subtract w from COUNT, and put the result in w btfss STATUS,0 ;Check the Carry flag. It will be set if ;COUNT is equal to, or is greater than w, and will be set ;as a result of the subwf instruction goto carry_on ;If COUNT is <10, then we can carry on goto clear ;If COUNT is >9, then we need to clear it carry_on bcf INTCON,0x01 ;We need to clear this flag to enable more interrupts movfw TEMP ;Restore w to the value before the interrupt retfie ;Come out of the interrupt routine clear clrf COUNT ;Set COUNT back to 0 bcf INTCON,1 ;We need to clear this flag to enable more interrupts retfie ;Come out of the interrupt routine ;*******************Main Program********************* main ;*******************Set Up The Interrupt Registers**** bsf INTCON,7 ;GIE Global interrupt enable (1=enable) bsf INTCON,4 ;INTE - RB0 Interrupt Enable (1=enable) bcf INTCON,1 ;INTF - Clear FLag Bit Just In Case ;*******************Set Up The Ports****************** bsf STATUS,5 ;Switch to Bank 1 movlw 0x01 movwf TRISB ;Set RB0 as Input movlw 0x10 movwf TRISA ;Set R 0 to RA3 on PortA as Output bcf STATUS,5 ;Come back to Bank 0 ;*******************Now Send The Value Of COUNT To Port A loop movf COUNT,0 ;Move the contents of Count into W movwf PORTA ;Now move it to Port A goto loop ;Keep on doing this end ;End Of Program

Dson

29

S mch: Bn di l s mch m n s lm vic vi on code bn trn, c 2 th m s mch nm ra cho bn, th nht l mch ny khng c t in trong mch dao ng, ci ny l mt cht mo vt, bi v chng ta s dng cc in dung tn mn gia chn dao ng ca con Pic v mass trn mch in thay th cc t in mc trong mch dao ng, nh vy in tr v in dung tn mn trn mch to thnh khung dao ng RC, n c th s b thay i tu theo cu hnh ca mch in. Th hai c mt mch chng rung cho cc ci Switch, ci ny tht s cn thit, v khi bn n Switch n s b rung, lc ng lc h v con Pic c th hiu nhm rng bn n Switch rt nhiu ln. Vi mch chng rung ny, khi bn n Switch t in s np khi bn nh Switch ra t in s x t t, thi gian x ca t in s b qua cc ln rung ca Switch.

Watchdog Timer: By gi chng ta bn v mt b nh thi bn trong Pic gi l Watchdog Timer, vy Watchdog Timer l ci g? Gi s bn vit mt chng trnh, bn mong i chng trnh ny s chy nu khng c g trc trc xy ra th n s khng bao gi dng li, nh vy bn phi lm mt vng lp khi chng trnh chy n im cui th n li quay tr v im bt u. Nhng m hy xem mt trng hp: Gi s chng trnh kim tra mt chn input, nu n ln mc cao th con Pic s tip tc kim tra mt chn input th hai c ln mc cao hay khng, nu chn input th hai khng ln mc cao, con Pic s ngi ch v n s ch thot ra khi ch ngi ca n nu chn input th hai ln mc cao. By gi hy xem mt trng hp khc, gi s nh bn vit mt chng trnh, bn compiled n thnh cng, v ngay c bn cho chy m phng tng bc, tng bc mt trn my tnh, bng MPLAB chng hn, c v nh mi chuyn u tt, bn em np vo con Pic. Sau mt thi gian chy th, con Pic thnh lnh b kt vo ni no trong chng trnh m khng th thot ra c trng thi hin ti. iu g l cn thit gii quyt hai trng hp trn, reset li hay vn cho n b kt khng thot ra c ?, l mch ch ca mch watchdog. Mch watchdog th khng phi l mi m g, c rt nhiu microprocessors v microcontrollers c mch watchdog, nhng m n lm vic ra sao?.

Dson

30

Bn trong con Pic c mt mch RC, mch ny cung cp 1 xung Clock c lp vi bt k xung Clock no cung cp cho Pic. Khi Watchdog Timer (vit tt l WDT) c cho php (enabled), n s m bt u t 00 v tng ln 1 cho n FFh, khi n tng t FFh n 00 ( FFh+1) th con Pic s b Reset bt k ang lm g, ch c 1 cch l ngn khng cho WDT m ti 00. Khi con Pic b kt khng th thot ra khi tnh trng hin ti th WDT vn tip tc m m khng b bt k iu g ngn cm n m ti FF v n FF+1, v vy n s reset con Pic lm cho chng trnh phi khi ng li t u. s dng WDT chng ta cn lm 3 vic. Th nht, cn thi gian bao lu reset WDT?. Th hai, lm sao xo WDT?. Cui cng, chng ta phi ni cho con Pic bit chng trnh cho php WDT hot ng. By gi bn hy xem tng ci mt: Trong Datasheet ca con Pic c ni rng, WDT c thi gian t lc Start cho n khi kt thc l 18ms, tuy nhin n cng ph thuc vo vi yu t, ngun cung cp, nhit ca con Pic bi v mch dao ng ca WDT l RC. Tuy nhin chng ta cng c th lm cho thi gian di hn. Bn trong con Pic c mt ci gi l Prescaler tm dch l t t l, chng ta c th lp trnh chia xung Clock ca mch RC, chng ta chia RC Clock cng nhiu th thi gian WDT reset cng di. Prescaler nm trn thanh ghi OPTION c a ch 81h t bit0 n bit2, bn di l bng chia t l thi gian WDT. Bit 2 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 Rate 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128 WDT Time 18mS 36mS 72mS 144mS 288mS 576mS 1.1Seconds 2.3Seconds

Hy nh rng cc khong thi gian ny khng ph thuc vo tn s xung Clock bn ngoi, n xc nh bng thi gian thc ch khng phi m chu k xung clock. Hy xem v d WDT s reset con Pic trong khong giy khi con Pic b kt. Gi tr gn nht m ta c theo bng trn l 576mS hoc 0.576 seconds. u tin chng ta gi gi tr b101 ti thanh ghi OPTION, nh sau: movlw movwf b101 81h ;This is 0x05 in Hex ;This is the Option Register

Qu n gin !, by gi, c mt mo nh. Mc nhin prescaler c gn cho mt b nh thi khc, v vy ta phi thay i ton b WDT. Trc tin phi reset mt b m khc ti gi tr 0, sau chuyn sang Bank1 gn prescaler cho WDT v thit lp thi gian ri sau li quay v Bank0, on code bn di vi xx l gi tr ta s chn cho prescaler. Bcf Clrf STATUS,0 01h ;make sure we are in Bank 0 ;address of the other timer TMR0

Dson

31

Bsf Clrwdt movlw movwf bcf

STATUS,0 b1xxx OPTION STATUS,0

;switch to Bank 1 ;reset the WDT and prescaler ;Select the new prescaler value and assign ;it to WDT ;come back to Bank 0

Lnh CLRWDT l xo WDT, chng ta phi lm iu ny trc khi n reset con Pic, chng ta cn tnh ton ni no trong chng trnh m b m ca WDT s trn t lnh CLRWDT trc thi im ny bo m con Pic khng reset. Nu chng trnh ca bn di, c th phi t hn 1 lnh CLRWDT trong chng trnh. V d bn s dng gi tr default mc nhin l 18ms th phi bo m rng chng trnh s nhn thy lnh CLRWDT sau mi 18ms. By gi chng ta phi tm cho ra on code ca chng thc thi trong thi gian thc l bao lu, nguyn l th rt n gin nhng m c th lm cho bn dng c tc ln y !. Thi gian thc thi Lnh (Instruction Timing): Nh bn bit, xung nhp bn trong ca Pic c gi l chu k lnh, nu dng thch anh 4MHz th 1 chu k lnh l 1/(4MHz/4) = 1uS, mt s lnh ch thc thi mt 1 chu k trong khi mt s lnh khc mt 2 chu k thc thi hon ton, bn hy xem trong tp lnh ca Pic bit thm chi tit. Cch nh th hon ton n gin, gi s tt c cc lnh u mt 1 chu k, nhng m nu lnh lm cho chng trnh nhy ti ni no th s mt 2 chu k, v d: lnh MOVWF mt 1 chu k bi v lnh ny ch mang data t ni ny sang ni khc, lnh GOTO mt 2 chu k bi v n lm cho Program Counter nhy ti ni no trong chng trnh, Lnh RETURN cng mt 2 chu k bi v n lm cho PC quay tr v u chng trnh. Tuy nhin c 4 lnh m n c th mt 1 hoc 2 chu k, l DECFSZ, INCFSZ, BTFSC v BTFSS, nhng lnh ny c mt im chung l n s b qua lnh k tip nu n tho mt iu kin no , v d: Lnh DECFSZ s gim gi tr trong thanh ghi F xung 1, nu kt qu khc 0 th lnh k tip c thc thi, v vy n mt 1 chu k, nhng nu kt qu l 0 th lnh k tip b b qua thc thi lnh ng sau k, trong trng hp ny lnh thc thi mt 2 chu k l do l n thay i gi tr ca PC, n cn 1 chu k thc hin hm v 1 chu k na thay i PC n v tr tho iu kin ca hm. r rng hn, hy xem v d bn di Movlw movwf decfsz goto end 02 COUNT COUNT loop

loop

Lnh u tin mov gi tr 02 vo thanh ghi W, n mt 1 chu k, lnh th hai cng tng t, 1 chu k. Lnh th 3, u tin n gim COUNT xung 1, ci ny mt 1 chu k, sau n th xem COUNT =0 cha, trong trng hp u tin th cha xy ra COUNT =0 , v vy n i tip ti lnh k, lnh th 4 nhy n mt ci nhn, v vy n mt 2 chu k. Chng ta quay tr li lnh th 3 decfsz COUNT ln ny sau khi gim COUNT xung 1 th COUNT =0, lnh k tip s b b qua v n nhy n End chm dt chng trnh, hnh ng b qua lnh k tip c thc hin trong 1 chu k khc, v vy khi ta t 02 vo COUNT th chng trnh ny mt 7 chu k, nu thch anh l 4MHZ th:

Dson

32

1/(4MHz/4) = 1uS / chu k

7 chu k mt 7 x 1uS = 7uS

Nh vy khi vit chng trnh lin quan n thi gian thc thi, bn phi tnh ton cn thn khi dng cc lnh DECFSZ, INCFSZ, BTFSC v BTFSS. Bn trong con Pic c mt th gi l Fuses tm dch l cu ch, n khng ging nh cu ch fuses bo v ca in nh m n ging nh mt ci Switch in t c ng hay m bi lp trnh vin. Lm sao m nhng ci Fuses ny c ng hay m cho WDT hot ng, c 2 cch lm. Cch th nht l vit 2 dng lnh ti phn u chng trnh ni cho Pic bit enable hay disable ci fuses no . Cch th hai l ni cho con Pic bit ci fuses no c enable. . We will look at getting your program to instruct the programming software in a later tutorial, when we look at including other files and macros. To tell the programming software manually, varies from program to program. The documentation that came with the programmer should tell you how to do this. As I am using the PICALLW software, which is linked on my main page, I will explain how to do change fuses within this program. The fuses are configured by pressing the F3 key, or clicking on the Config button. Then you can select the fuse you want enabled, in this case the WDT, by clicking on the box next to it. Sample Program Let us write a program, where we will turn on the WDT, and let the PIC perform a function. We will first of all periodically clear the WDT, to show that the program works, and then remove the CLRWDT command to show that the PIC will indeed reset. The program I have chosen is the one used in tutorial 9 where we cause a row of LEDs to light up one at a time from left to right, then right to left. The circuit is shown below, and with the RC values shown will give us a clock frequency of 8KHz. This clock speed will allow us to actually see the LEDs moving one by one. I chose this program because it is slow enough for us to play with the WDT, and you can easily see when the PIC is reset. I have removed the original comments, and I have replaced them with a description of the WDT lines, a running total of the time from the start (assuming a 8KHz clock), and the number of clock cycles at each line.

TIME equ 9FH PORTB equ 06H TRISB equ 86H PORTA equ 05H TRISA equ 85H STATUS equ 03H COUNT1 equ 0CH COUNT2 equ 0DH bsf STATUS,5 movlw 00H movwf TRISB movlw 00H movwf TRISA bcf STATUS,5 movlw 00H

; Variable for the delay loop. ; Port B address. ; Port B Tristate address. ; Port A address. ; Port A Tristate address. ; Page select register. ; Loop register. ; Loop register. ; 1 cycle, 0.5mS ; 1 cycle, 1.0mS ; 1 cycle, 1.5mS ; 1 cycle, 2.0mS ; 1 cycle, 2.5mS ; 1 cycle, 3.0mS ; 1 cycle, 3.5mS

Dson

33

movwf PORTA ; 1 cycle, 4.0mS ; Start of main program RUN movlw 01H ; 1 cycle, 4.5mS movwf PORTB ; 1 cycle, 5.0mS call DELAY ; 2 cycles, 486mS call DELAY ; 2 cycles, 967mS ; Move the bit on Port B left, then pause. rlf PORTB,1 ; 1 cycle, 967.5mS call DELAY ; 2 cycles, 1.45S call DELAY ; 2 cycles, 1.93S rlf PORTB,1 ; 1 cycle, 1.93S call DELAY ; 2 cycles, 2.41S call DELAY ; 2 cycles, 2.89S rlf PORTB,1 ; 1 cycle, 2.89S call DELAY ; 2 cycles, 3.37S call DELAY ; 2 cycles, 3.85S rlf PORTB,1 ; 1 cycle, 3.85S call DELAY ; 2 cycles, 4.34S call DELAY ; 2 cycles, 4.82S rlf PORTB,1 ; 1 cycle, 4.82S call DELAY ; 2 cycles, 5.30S call DELAY ; 2 cycles, 5.78S rlf PORTB,1 ; 1 cycle, 5.78S call DELAY ; 2 cycles, 6.26S call DELAY ; 2 cycles, 6.74S rlf PORTB,1 ; 1 cycle, 6.74S call DELAY ; 2 cycles, 7.22S call DELAY ; 2 cycles, 7.70S rlf PORTB,1 ; 1 cycle, 7.70S ; Now move onto Port A, and move the bit left. rlf PORTA,1 ; 1 cycle, 7.70S call DELAY ; 2 cycles, 8.19S call DELAY ; 2 cycles, 8.67S rlf PORTA,1 ; 1 cycle, 8.67S call DELAY ; 2 cycles, 9.15S call DELAY ; 2 cycles, 9.63S rlf PORTA,1 ; 1 cycle, 9.63S call DELAY ; 2 cycles, 10.11S call DELAY ; 2 cycles, 10.59S rlf PORTA,1 ; 1 cycle, 10.59S call DELAY ; 2 cycles, 11.07S call DELAY ; 2 cycles, 11.55S ; Move the bit back on Port A rrf PORTA,1 ; 1 cycle, 11.55S call DELAY ; 2 cycles, 12.04S call DELAY ; 2 cycles, 12.52S rrf PORTA,1 ; 1 cycle, 12.52S call DELAY ; 2 cycles, 12.99S call DELAY ; 2 cycles, 13.48S rrf PORTA,1 ; 1 cycle, 13.48S

Dson

34

call DELAY ; 2 cycles, 13.96S call DELAY ; 2 cycles, 14.44S rrf PORTA,1 ; 1 cycle, 14.44S ; Now move the bit back on Port B rrf PORTB,1 ; 1 cycle, 14.44S call DELAY ; 2 cycles, 14.92S call DELAY ; 2 cycles, 15.40S rrf PORTB,1 ; 1 cycle, 15.40S call DELAY ; 2 cycles, 15.89S call DELAY ; 2 cycles, 16.37S rrf PORTB,1 ; 1 cycle, 16.37S call DELAY ; 2 cycles, 16.84S call DELAY ; 2 cycles, 17.33S rrf PORTB,1 ; 1 cycle, 17.33S call DELAY ; 2 cycles, 17.81S call DELAY ; 2 cycles, 18.29S rrf PORTB,1 ; 1 cycle, 18.29S call DELAY ; 2 cycles, 18.77S call DELAY ; 2 cycles, 19.25S rrf PORTB,1 ; 1 cycle, 19.25S call DELAY ; 2 cycles, 19.73S call DELAY ; 2 cycles, 20.22S rrf PORTB,1 ; 1 cycle, 20.22S call DELAY ; 2 cycles, 20.70S call DELAY ; 2 cycles, 21.18S goto RUN ; 2 cycles, 21.18S ; Subroutine to give a delay between bit movements. ;Total of 957 cycles, 480mS DELAY movlw TIME ; 1 cycle movwf COUNT1 ; 1 cycle LOOP1 decfsz COUNT1 goto LOOP1 movwf COUNT1 LOOP2 decfsz COUNT1 goto LOOP2 return END ; ; 9F x 1 cycle + 1 cycle = 160 cycles ; 9E x 2 cycles = 316 cycles ; 1 cycle ; ; 9F x 1 cycle + 1 cycle = 256 cycles ; 9E x 2 cycles = 316 cycles ; 2 cycles ;

With an 8KHz clock, it takes just under 1 second for the next LED illuminates, and it takes a total of about 21 seconds to run from one end to the other and back again i.e. to go through the routine once only. The delay routine takes 480mS, and we are calling it twice before moving the bit on the Ports. Now, we need to periodically reset the WDT. The largest time we can set the WDT is 2.3 seconds, and the next one down form this is 1.1 seconds. We have two options here. We could make a call to a subroutine to clear

Dson

35

the WDT after the two delays have finished, or we could incorporate the CLRWDT within the delay itself. I have decided, for no real reason at all, to incorporate the CLRWDT within the delay loop. TIME PORTB TRISB PORTA TRISA STATUS COUNT1 COUNT2 OPT equ equ equ equ equ equ equ equ equ 9FH 06H 86H 05H 85H 03H 0CH 0DH 81h ; Variable for the delay loop. ; Port B address. ; Port B Tristate address. ; Port A address. ; Port A Tristate address. ; Page select register. ; Loop register. ; Loop register. ; Option Register to control the WDT

;*************Set up the Ports, WDT and prescaler****************** clrf 01h ;Clear TMR0 bsf STATUS,5 ;Switch to Bank 1 clrwdt ;reset the WDT and prescaler movlw b1101 ;Select the new prescaler value and assign movwf OPT ;it to WDT movlw movwf movlw movwf bcf movlw movwf 00H TRISB 00H TRISA STATUS,5 00H PORTA ; Now set up the Ports ; ; ; ;Come back to Bank 0 ; ;

;*************Start of main program***************************** RUN movlw 01H ; movwf PORTB ; call DELAY ; call DELAY ; ; *************Move the bit on Port B left, then pause.************** rlf PORTB,1 ; call DELAY ; call DELAY ; rlf PORTB,1 ; call DELAY ; call DELAY ; rlf PORTB,1 ; call DELAY ; call DELAY ; rlf PORTB,1 ; call DELAY ; call DELAY ; rlf PORTB,1 ; call DELAY ; call DELAY ;

Dson

36

rlf PORTB,1 ; call DELAY ; call DELAY ; rlf PORTB,1 ; call DELAY ; call DELAY ; rlf PORTB,1 ; ; *************Now move onto Port A, and move the bit left.*********** rlf PORTA,1 ; call DELAY ; call DELAY ; rlf PORTA,1 ; call DELAY ; call DELAY ; rlf PORTA,1 ; call DELAY ; call DELAY ; rlf PORTA,1 ; call DELAY ; call DELAY ; ;************** Move the bit back on Port A************************ rrf PORTA,1 ; call DELAY ; call DELAY ; rrf PORTA,1 ; call DELAY ; call DELAY ; rrf PORTA,1 ; call DELAY ; call DELAY ; rrf PORTA,1 ; ;****************** Now move the bit back on Port B****************** rrf PORTB,1 ; call DELAY ; call DELAY ; rrf PORTB,1 ; call DELAY ; call DELAY ; rrf PORTB,1 ; call DELAY ; call DELAY ; rrf PORTB,1 ; call DELAY ; call DELAY ; rrf PORTB,1 ; call DELAY ; call DELAY ; rrf PORTB,1 ; call DELAY ; call DELAY ; rrf PORTB,1 ;

Dson

37

call call goto

DELAY DELAY RUN

; ; ;

; ******************Subroutine to give a delay between bit movements.****** DELAY movlw TIME ; movwf COUNT1 ; LOOP1 decfsz COUNT1 goto LOOP1 movwf COUNT1 LOOP2 decfsz COUNT1 goto LOOP2 ; ; ; ; ; ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; This part resets the WDT ;; ;;Comment out or remove this command to see the WDT ;; ;; in action. It should reset the PIC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; clrwdt ;This simply resets the WDT. ;***************Return from our original DELAY routine*************** return ; END ;

;;

If you comment out, or remove the CLRWDT command, you will find that the PIC will not go past lighting the second LED. This is because the WDT is resetting the PIC. With the CLRWDT in place, the program works as it should.

You might also like