Vezérlés és irányítástechnológia (Mikroprocesszoros irányítás)
2.1. Lámpa bekapcsolása 2.2. Lámpa villogtatása 2.3. Futófény programozása 2.4. Fény futtatása balra, jobbra 2.5. Fénysáv megjelenítése 2.6. LED (Light Emitting Diode) impulzusüzemű működtetése
2.1. Lámpa bekapcsolása Kapcsoljunk a PORT B nulladik bitjéhez (RB0) 12 V-os izzólámpát, vagy LED-et (ügyelve a LED polaritására). A feladat megoldásához a mikrokontroller nem használt funkcionális egységeit az ábrázolásból elhagyva az alábbi egyszerűsített ábrát kapjuk:
12 V; 200 mA
GND
RA0 RA2 RA4 RA1 RA3 RA5
RB0 RB2 RB4 RB6 RB1 RB3 RB5 COM
+Ut
RB0
RESET +5V
GND
RB1
RB5
PIC 16F873 µP
RB6
RB4
RB2
RB3
RB7
A működtető program: list p=16f873 ;compilernek szóló direktíva #include „p16873.inc” ;compilernek szóló direktíva bsf status,5 ;lapozzunk az 1. memória bankba movfw 0FFh ;mozgassuk W-be az 11111111=FFh számot movwf trisa ;ezáltal porta minden bitje input clrf trisb ;portb minden bitje output movlw 06h ; movwf adcon1 ;porta digitális input (nem analóg) bcf status,5 ;lapozzunk vissza a 0. memória bankba eleje bsf portb,0 ;kapcsoljuk a B port 0. bitjét logikai 1 értékre goto eleje ;ugorjunk az elejére end ;vége a programnak Figyeljük meg, hogy a sorkapocshoz kapcsolt lámpa (LED) világít a bsf portb,0 végrehajtásakor, ugyanakkor a hétszegmenses kijelző felső (a ) szegmense sötét marad.
2.2. Lámpa villogtatása Az összeállíts azonos a 2.1. fejezet ábrájával. A compilernek szóló direktívák is azonosak, az adatirányt beállító programrész magyarázatát elhagytuk a programból. A lámpa villogtató programja: list p=16f873 #include „p16873.inc” bsf status,5 movlw 0FFh movwf trisa clrf trisb movlw 06h movwf adcon1 bcf status,5 villog bsf portb,0 ;a lámpa ég call var ;időzítés, kb.0,3 s bcf portb,0 ;a lámpa nem ég call var ;időzítés, kb.0,3 s goto villog ;ugorjunk a villog címkére var movlw b´00000110´ 022h regiszter decimális movwf 022h tartalma 6. v03 decfsz 020h,1 020h és 021h regoto v03 giszterek sorozatos dekrementádecfsz 021h,1 lásával az időzíA var szubrutin időzítése goto v03 tés kb. 50 ms 6 x 50 ms, azaz 300 ms. decfsz 022h,1 goto v03 return end Időzítésre gyakran fogjuk használni a fenti, vagy algoritmusban ehhez hasonló szubrutint. Induláskor a regiszterek tartalma 00000000, amely az első dekrementálás után átbillen 11111111 (255d) értékre. Ezt követően a sorozatos dekrementálás eredményei: 11111110 (254d) , 11111101 (253d) , … A dcfsz utasítás jelentése: decrement f, skip if zero, azaz csökkenti az f című memóriarekesz tartalmát eggyel, míg az nullává nem válik. Ekkor átugorja a következő utasítást. Az eredmény f,1 esetén f-ben, míg f,0 esetén a workregiszterben keletkezik. Pl. az alábbi részlet magyarázata: v03
decfsz 020h,1 goto v03 decfsz 021h,1 A 020h regiszter dekrementálása, az eredmény képzése a 020h-ban, 256 lépés után értéke nullává válik, ekkor átugorja a következő (goto v03) sort és kezdi a 021h dekrementálását. 2.3. Futófény programozása A mikroprocesszoros oktató panelon a portb 8 bitje csatlakozik a hétszegmenses kijelzőhöz (RB0, … , RB7), ugyanakkor a nagyobb áramú fogyasztókat tápláló erősítő (ULN2004A integrált áramkör) csak 7 csatornás. A nyolcadik lámpát egy külön panelon megépített kis erősítő működteti, ezen feladat gyakorlásához olyan processzoros oktató eszköz alkalmas, amelyen megtalálható az RB7-es sorkapocs is (lásd ábra) A futófény nem más, mint a lámpák egymás utáni bekapcsolása, kikapcsolása. Ezt elérhetjük, ha az egyes biteket bsf, bcf utasításokkal felprogramozzuk, és természetesen közöttük hagyunk várakozási időt a szem- és az izzólámpa tehetetlensége miatt. Elegánsabb megoldást kínál a
rotate right f rrf rotate left f rlf utasítás, amely forgatja a regiszter tartalmát jobbra, illetve balra. Valamely biten lévő lámpát (az erősítőt is figyelembe véve) H-szittel lehet kigyújtani, ez a logikai 1 értéknek felel meg. Legyen a portb regiszter tartalma: 0 0 0 0 0 0 0 1 Ebben az esetben az RB0-hoz kapcsolt lámpa világít. Forgassuk a regiszter tartalmát balra úgy, hogy a forgatás eredménye ugyanebben a regiszterben keletkezzen, majd ismételten adjuk ki az rlf utasítást: 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 …
GND
RA0 RA2 RA4 RA1 RA3 RA5
RB0 RB2 RB4 RB6 RB1 RB3 RB5 COM
+Ut
RB0
RESET +5V
GND
A forgatás workregiszterben:
RB1
RB5
PIC 16F873 µP eredménye
Forgatás eredménye portb-ben Forgatás eredménye W-ben
keletkezhet
RB7
RB6
RB4
RB2
RB3
ugyanabban
rlf rlf
a
regiszterben, Utasítás portb,1 portb,0
RB7
vagy
a
Futófény programja: list p=16f873 #include „p16873.inc” bsf status,5 movlw 0FFh movwf trisa clrf trisb movlw 06h movwf adcon1 bcf status,5 movlw b’00000000’ movwf portb rlf portb,1 movlw b´00000001´ movwf portb fut rlf portb,1 call var goto fut var movlw b´00000110´ movwf 022h v03 decfsz 020h,1 goto v03 decfsz 021h,1 goto v03 decfsz 022h,1 goto v03 return end
;az átvitel bit nullázása ;az átvitel bit nullázása ;az átvitel bit nullázása ;egy lámpa ég
2.4. Fény futtatása balra, jobbra Futtassuk a fényt hétszer balra, majd hétszer jobbra. A futások számát a 026h regiszterben adjuk meg: movlw b´00000111´ movwf 026h A futások számlálását a bal illetve a jobb címke alatt írtuk meg. A rotálás a balra, jobbra címke alatt található. Program: list p=16f873 #include „p16873.inc” bsf status,5 movlw 0FFh movwf trisa clrf trisb movlw 06h movwf adcon1 bcf status,5 movlw b’00000000’ movwf portb rlf portb,1 movlw b´00000111´ movwf 026h movlw b´00000001´ movwf portb bal decfsz 026h,1
goto movlw movwf rrf movlw movwf movlw movwf
balra b’00000000’ portb portb,1 b´00000111´ 026h b´00000001´ portb
jobb
decfsz 026h,1 goto jobbra vege goto vege balra rlf portb,1 call var goto bal jobbra rrf portb,1 call var goto jobb var movlw b´00000110´ movwf 022h v03 decfsz 020h,1 goto v03 decfsz 021h,1 goto v03 decfsz 022h,1 goto v03 return end A program futást végteleníthetjük, ha elhagyjuk a vege címkét és ezt a sort módosítjuk: goto eleje. Az eleje címke a zöld színű direktívák után következik. 2.5. Fénysáv megjelenítése Nyolc lámpát kapcsolunk a portb-hez, a lámpákat egymás után bekapcsoljuk, de a futófénytől eltérően a korábban bekapcsolt lámpát égve hagyjuk. Program: list p=16f873 #include „p16873.inc” bsf status,5 movlw 0FFh movwf trisa clrf trisb movlw 06h movwf adcon1 bcf status,5 eleje movlw b´00000001´ movwf portb call var movlw b´00000011´ movwf portb call var movlw b´00000111´ movwf portb call var movlw b´00001111´ movwf portb call var movlw b´00011111´ movwf portb call var movlw b´00111111´ movwf portb call var
var v03
movlw movwf call movlw movwf call movlw movwf call goto movlw movwf decfsz goto decfsz goto decfsz goto return end
b´01111111´ portb var b´11111111´ portb var b´00000000´ portb var eleje b´00000110´ 022h 020h,1 v03 021h,1 v03 022h,1 v03
2.6. LED (Light Emitting Diode) impulzusüzemű működtetése A kisáramú, látható fényű LED-ek szokásos munkaponti árama 10 … 20 mA, ekkor katalógus adatok szerinti élettartama 500 ezer üzemóra (57,8 év). Az emittált fényteljesítmény az árammal arányosan növelhető, de túlmelegedés következtében rövid időm belül tönkremennek. A fényteljesítmény növelésének útja (az átlagos disszipáció túllépése nélkül) a LED-ek impulzus üzemű működtetése. A LED-ek tehetetlensége sokkal kisebb, mint az izzólámpáké. A gyakorlaton használt LED-eknél a bekapcsolástól a teljes fényáram emittálásáig eltel idő 10 … 100 ns. A PIC 16F873 processzor 16 MHz-es órajellel 0,25 µ s hajt végre egy utasítást, míg a goto végrehajtása kétszer ennyi időt igényel. Ebből következik, hogy a processzor utasításait a LED képes követni. az alábbi szubritin időzítése kb. 5 µ s. ido
movlw b´00000110´ movwf 026h v02 decfsz 026h,1 goto v02 return Készítsünk programot 1:3 jel-szünet arányú, azaz 33,3 %-os kitöltési tényezőjű táplálásra. A LED fényereje kb. 2,5- szeresére nő, a normál áramú LED-hez képest. Az impulzus üzemű LED-et 33 ohmos áramkorlátozó ellenálláson keresztül kötjük a processzoros panelhoz a portb nulladik bitjéhez. Fényerő összehasonlítás céljából a portb 1. bitjéhez egy normál előtét ellenállásos (330 ohmos) LED is be van kapcsolva, ez a program futás alatt folyamatosan világít. Midkét LED azonos típusú, energiafogyasztása azonos. list p=16f873 #include „p16873.inc” bsf status,5 movlw 0FFh movwf trisa clrf trisb movlw 06h movwf adcon1 bcf status,5
eleje
ido v02
bsf bsf call bcf call call call goto movlw movwf decfsz goto return end
portb,1 portb,0 ido portb,0 ido ido ido eleje b´00000110´ 026h 026h,1 v02
33 ohm
GND
RA0 RA2 RA4 RA1 RA3 RA5
330 ohm
RB0 RB2 RB4 RB6 RB1 RB3 RB5 COM
+Ut
RB0
RESET +5V
GND
RB1
RB5
PIC 16F873 µP
RB6
RB4
RB2
RB3
RB7