TALLINNA TEHNIKAÜLIKOOL
Elektriajamite ja jõuelektroonika instituut
MIKROPROTSESSORTEHNIKA - PRAKTIKUM Laboratoorne töö
Mikrokontrollerite programmeerimine Assembleris Juhendaja :
Üliõpilased:
Ülesanne:
1) Süüdata esimene valgusdiood nupplüliti 1. vajutusega ning kustutada nupplüliti 2.
vajutusega.
2) Juhul kui hoida nupplülitit 1. all, siis peavad hakkama LED lambid reas üksteise järgi
süttima ja kustuma “
jooksev tuli”. LED 1. süttib, põleb pool sekundit ja
kustub , LED 2.
süttib, põleb pool sekundit ja kustub ja
niimoodi kõik 8 LED-i.
1) Algoritm Portide/registrite
määramine mainloop PORTA,2
0
PORTA,3
goto in
1
0
goto mainloop
goto out
out
in
LED0 välja
LED0 sisse
goto mainloop
goto mainloop
Seadme juhtprogrammi väljatrükk
list p=16f877a
;
defineeritakse kontrolleri tüüp
include "p16f877a.inc" ;lisatakse kontrolleri infot sisaldav
;*.inc fail
org 0x00
;määrab kindlaks programmi algusvektori
bsf STATUS ,RP0
;valitakse mälupank nr 1 (00,10,01,11)
bcf STATUS,RP1
;TRIS register asub pangas1!
movlw b'00000000'
;tööregistrisse
omistatakse binaararv ;00000000
movwf TRISD
;pordis D määratakse kõik viigud
;
väljunditeks movlw 0x06
;tööregistrisse antakse nr 6
movwf ADCON1
;PORTA seadistatakse digitaalsisendiks
;(00000110)
movlw b'11111111'
;tööregistrile omistatakse binaararv
;11111111
movwf TRISA
;pordis A määratakse kõik viigud
;sisenditeks
bcf STATUS,RP0
;Valime mälupanga 0
bcf STATUS,RP1
;PORTD asub pangas 0!
movlw .0
;tööregistrisse omistatakse 10nd nr 0
movwf PORTD
;PORTD väärtused sätitakse nulliks
mainloop
btfss PORTA,2
;Kontrollime PORTA2 väärtust, kui väärtus
;võrdub 1, siis minnakse PORTA,3
;kontrollima vastasel juhul liigutakse
;programmi in
goto in
btfss PORTA,3
;Kontrollime PORTA3 väärtust, kui väärtus
;võrdub 1, siis minnakse tagasi
;algusesse, vastasel juhul programmi out
goto out
goto mainloop
in
bsf PORTD,0
;LED0 lülitatakse sisse
goto mainloop
out
bcf PORTD,0
;LED0 lülitatakse välja
goto mainloop
end
1
2) Algoritm Portide/
registrit e määramine
mainloop
PORTA,2
1
0
goto out
goto blink
out
blink
LED0-7 välja
LED0 sisse
call
Delay goto mainloop
Delay
LED0 välja
Delay1
LED…sisse
decfsz Pause,1=0
Delay2
…
decfsz Pause_tmp,1=0
goto mainloop
Seadme juhtprogrammi väljatrükk list p=16f877a
;defineeritakse kontrolleri tüüp
include "p16f877a.inc"
;lisatakse kontrolleri infot
;sisaldav *.inc fail
Pause equ 0x20
;pausile omistatakse mingi aadress
Pause_tmp equ 0x21
;paus_temp’ile omistatakse mingi
;aadress
org 0x00
;määrab kindlaks programmi
;algusvektori
bsf STATUS,RP0
;valitakse mälupank nr 1
;(00,10,01,11)
bcf STATUS,RP1
;TRIS register asub pangas1!
movlw b'00000000'
;tööregistrisse omistatakse
;binaararv 00000000
movwf TRISD
;pordis D määratakse kõik viigud
;väljunditeks
movlw 0x06
;tööregistrisse antakse nr 6
movwf ADCON1
;PORTA seadistatakse
;digitaalsisendiks (00000110)
movlw b'11111111'
;tööregistrile omistatakse
;binaararv 11111111
movwf TRISA
;pordis A määratakse kõik viigud
;sisenditeks
bcf STATUS,RP0
;Valime mälupanga 0
bcf STATUS,RP1
;PORTD asub pangas 0!
movlw .0
;tööregistrisse omistatakse 10nd nr
;0
movwf PORTD
;PORTD väärtused sätitakse nulliks
mainloop
btfss PORTA,2
;Kontrollime viigu PORTA2 väärtust,
;kui PORTA2=1 mine alamprogrammi
;out
goto blink
;kui PORTA2=0, siis minnakse a.p.
;blink
goto out
out
bcf PORTD,0
;LED välja
bcf PORTD,1
;LED välja
bcf PORTD,2
;LED välja
bcf PORTD,3
;LED välja
bcf PORTD,4
;LED välja
bcf PORTD,5
;LED välja
bcf PORTD,6
;LED välja
bcf PORTD,7
;LED välja
goto mainloop
blink
bsf PORTD,0
;LED sisse
call Delay
;paus
bcf PORTD,0
;LED välja
call Delay
;paus
bsf PORTD,1
;LED sisse
call Delay
;paus
bcf PORTD,1
;LED välja
call Delay
;paus
bsf PORTD,2
;LED sisse
call Delay
;paus
bcf PORTD,2
;LED välja
call Delay
;paus
bsf PORTD,3
;LED sisse
call Delay
;paus
bcf PORTD,3
;LED välja
call Delay
;paus
bsf PORTD,4
;LED sisse
call Delay
;paus
bcf PORTD,4
;LED välja
call Delay
;paus
bsf PORTD,5
;LED sisse
call Delay
;paus
bcf PORTD,5
;LED välja
call Delay
;paus
bsf PORTD,6
;LED sisse
call Delay
;paus
bcf PORTD,6
;LED välja
call Delay
;paus
bsf PORTD,7
;LED sisse
call Delay
;paus
bcf PORTD,7
;LED välja
call Delay
;paus
goto mainloop
Alamprogramm viivituse tekitamiseks
Viivituse tekitamiseks läbitakse alamprogrammi Delay2 muutujas
Pause_tmp määratud arv
kordi . Kogu tsüklit korratakse muutujas Delay
määratud arv kordi, (kui võimalik siis on soovitav kasutada viivituste
tekitamiseks riistvaralisi timereid).
Delay
movlw .50
movwf Pause
Delay1
movlw .500
movwf Pause_tmp
decfsz Pause,1
;pausi väärtust vähendatakse 1
;võrra, kui väärtus on 0, siis
;hüpatakse järgmisest käsust üle
goto Delay2
return ;väljutakse alamprogrammist Delay
Delay2
clrwdt ;valveloenduri nullimine
nop ;
viivitus no operation nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop decfsz Pause_tmp,1
goto Delay2
goto Delay1
end
Kokkuvõte:
Algoritmide joonistel ei ole programmi lõpp ühendatud ühegi elemendiga, kuna see on
ainult tinglik lõpp – programm ei jõua selleni kunagi. Antud juhul oli viimases
programmis kasutatud natuke pikemat moodust, et LEDid „jooksma” saada, tegelikkuses
on võimalik see kood palju lühemalt ja kompaktsemalt koostada, kuid hetkel puudub
teadmine kuidas kasutada Assembleris matemaatilisi funktsioone. Mõlemad programmid
töötavad ja vastavad ülesande püstitusele. Programmeerimine Assembleris ei ole
iseenesest keerukas, kui teada kõiki käske, siis on see nagu iga teine keelgi, küll aga on
sellega tülikas keerulisi lahendusi teha.
LISA: Tabel 1: Programmis kasutatavad mikrokontrolleri digitaalsisendid ja –väljundid.
Joonis1. Mikrokontrolleri viikude asetus õppeplaadil.
Kõik kommentaarid