Aslında assembly programlama sanıldı
ından daha kolay bieydir. Burada assembly ile nasil *** mikrokontrolcü
programlandıını örenecez. Önce www.microchip.com sitesinden MPLAB IDE download edip kuralım. imdi de kullanmak
istediimiz çipin ( burada 16f628a ) datasheet'inide indirip bi güzel göz attıktan sonra devam edebiliriz.
Önce örnek bir assembly programına göz atalım:
programlandıını örenecez. Önce www.microchip.com sitesinden MPLAB IDE download edip kuralım. imdi de kullanmak
istediimiz çipin ( burada 16f628a ) datasheet'inide indirip bi güzel göz attıktan sonra devam edebiliriz.
Önce örnek bir assembly programına göz atalım:
list
p=16f628a
#include
p16f628A.inc
sifir equ 0x00
cblock 0x20
sifir equ 0x00
cblock 0x20
var1
;hiz
var2
;zaman
endc
org 0x0000
goto
org 0x0000
goto
basla
org 0x0004
goto
goto
kesme
basla:
basla:
.
call
call
fonk
.
.
.
kesme:
.
.
.
retfie
.
.
retfie
fonk:
.
.
.
return
.
.
.
end
.
.
return
.
.
.
end
imdi parça parça açıklayacam
list
p=16f628a
Burada kullandı
ımız çipi tanımlıyoruz.
#include
p16f628.inc
Burada kullandı
ımız çipe ait bazı tanımlama bilgilerini dosyamıza ekliyoruz. Eer bu dosyayı bulup notepadle açarsanız
içinde
içinde
sifir
equ 0x00
gibi birçok ifadenin oldu
unu görürsünüz. equ deyimi sizin yerinize bir ifadenin yerine baka bir ifadeyi koymanızı salar. Yani
siz kendinize göre anlamlı ancak assemblera göre anlamsız birey yazmak isterseniz equ, yazdıınız ifadeyi assemblerin
anlayacaı bireyle deitirmenize yarar. Örnek olarak p16f628.inc dosyasındaki
siz kendinize göre anlamlı ancak assemblera göre anlamsız birey yazmak isterseniz equ, yazdıınız ifadeyi assemblerin
anlayacaı bireyle deitirmenize yarar. Örnek olarak p16f628.inc dosyasındaki
STATUS EQU H'0003'
satırını alalım. h'0003'
STATUS adlı registerin adresidir. ( Datasheete baktık ama di mi? ) Ancak 0x03 gibi bir sayı bizim için
fazla bir anlam taımayacaı gibi programdaki hataları ayıklarken zorlanmamıza sebep olacaktır. Üstteki ifadeyle her
fazla bir anlam taımayacaı gibi programdaki hataları ayıklarken zorlanmamıza sebep olacaktır. Üstteki ifadeyle her
STATUS
kelimesini H'0003' ile deitiriyoruz. Benzer ekilde örnek programımızda her sifir kelimesini 0x00 sayısıyla
deistiriyoruz.
Aman dikkat! MPLAB büyük küçük harf ayrımı yapar. STATUS ile status aynı ey deildir mesela.
deistiriyoruz.
Aman dikkat! MPLAB büyük küçük harf ayrımı yapar. STATUS ile status aynı ey deildir mesela.
cblock 0x20
var1
;hiz
var2
;zaman
endc
Bu ifade ile register hafızasında 0x20 adresinden itibaren degikenlerimiz için yer tutuyoruz.
;
iareti assembler için gözardı etmesi gereken eyleri belirtir. Bu sayede kodumuzu içine asssemblerı kızdırmadan tek
satırlık açıklamalar ekleyebiliriz. endc ile deikenleri tanimlamayı bitirdiimizi belirtiyoruz.
satırlık açıklamalar ekleyebiliriz. endc ile deikenleri tanimlamayı bitirdiimizi belirtiyoruz.
org 0x0000
te asıl koda yavatan geldik.
lemciye her reset attıımızda ilk olarak 0x0000 adresindeki komutla mesaiye balar. Bu adrese reset vektörü denir. ( bkz.
Datasheet ). org yazdıımız kodun hangi adresten itibaren hafızaya yerlemesi gerektiini assemblera anlatmak için
kullanılır.
Datasheet ). org yazdıımız kodun hangi adresten itibaren hafızaya yerlemesi gerektiini assemblera anlatmak için
kullanılır.
goto
basla
Datasheet ve MPLAB help dosyaları isteseniz de istemeseniz de sizin en büyük yardımcınızdır. Bir komutun ne ie yaradı
ı
en güzel oralarda yazar. Ancak algoritmaların içinde ne ie yarayacaı konusunda yardımcı olmaz. ( Bu yüzden gecenin bi
vakti oturup bunu yazıyorum ). Komutun anlamı basla yazan yere zıplamaktır.
en güzel oralarda yazar. Ancak algoritmaların içinde ne ie yarayacaı konusunda yardımcı olmaz. ( Bu yüzden gecenin bi
vakti oturup bunu yazıyorum ). Komutun anlamı basla yazan yere zıplamaktır.
org 0x0004
goto
goto
kesme
Interrupt (kesme) demek ilemciye iini gücünü bırakıp baka biey yapmasını söyleyen olay demektir. Çok çeitli kesme
kaynakları vardır.
kaynakları vardır.
ç saatin 0xFF deerini geçmesi, belli bir pin grubundaki girdinin deimesi... Bu olaylardan herhangi biri
olduunda ilemci ilk ikaldıı yeri bi kenara not edip 0x0004 adresine zıplar. ( Interrupt vektörü ) Buradaki komutu çalıtırır
ki bu komut genelde daha ferah bir yere zıplama komutu olur.
olduunda ilemci ilk ikaldıı yeri bi kenara not edip 0x0004 adresine zıplar. ( Interrupt vektörü ) Buradaki komutu çalıtırır
ki bu komut genelde daha ferah bir yere zıplama komutu olur.
basla:
.
.
call
.
call
fonk
.
.
.
.
.
kesme:
.
.
.
.
.
te zıplama noktaları. : ile biten kelimeler sadece zıplanacak noktalara ad vermeye yarar.
Bir de call fonk diye bir komut var. Bu da goto benzeri bir komut. Farkı, programın zıpladıı yerden geri dönebilmesine
olanak tanıması. Donanımsal ayrıntılar için datasheete bakmanızı tavsiye ederim, çok önemli ayrıntılar yazıyor orada .
Bir de call fonk diye bir komut var. Bu da goto benzeri bir komut. Farkı, programın zıpladıı yerden geri dönebilmesine
olanak tanıması. Donanımsal ayrıntılar için datasheete bakmanızı tavsiye ederim, çok önemli ayrıntılar yazıyor orada .
retfie
Kesme, iini bitirdikten sonra kumandayı ana programa bırakır. Bu i
de yukardaki komutla yapılır. Ana program kaldıı
yerden devam eder. Ancak bazı eyleri bıraktıı gibi bulamayabilir ve kızabilir. Bu sebeple kesme fonksiyonunun ortalıı
toparlayacak komutları içermesi gerekir. ( MPLAB IDE templatelerinde nasıl yapılabileceinin örnei var )
yerden devam eder. Ancak bazı eyleri bıraktıı gibi bulamayabilir ve kızabilir. Bu sebeple kesme fonksiyonunun ortalıı
toparlayacak komutları içermesi gerekir. ( MPLAB IDE templatelerinde nasıl yapılabileceinin örnei var )
fonk:
.
.
.
return
.
.
return
te call ile çaırılan fonksiyonumuz. return komutu ile çaırılan yere geri dönüyoruz.
end
Assemblera komutların bittiini anlatmaya yarar.