Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Look up keyword
Like this
1Activity
0 of .
Results for:
No results containing your search query
P. 1
asm_tut_3

asm_tut_3

Ratings: (0)|Views: 20 |Likes:
Published by api-3760921

More info:

Published by: api-3760921 on Oct 16, 2008
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

05/09/2014

pdf

text

original

Assembly Programlama-3
Bu gece (ehehe) nas\u0131l adam gibi interrupt kullan\u0131laca\ue000\u0131n\u0131 g\u00f6recez.

Hat\u0131rlatmak amac\u0131yla interrupt nedir bir daha anlatay\u0131m. Interrupt demek \u00e7ipin i\ue001ini g\u00fcc\u00fcn\u00fc b\u0131rak\u0131p \u00f6nceden belirlenmi\ue001 bir kod par\u00e7as\u0131n\u0131 \u00e7al\u0131\ue001t\u0131rmas\u0131na sebep olanol a ya denir. Bu kod par\u00e7as\u0131na da interrupt service denir. Interrupt olu\ue001tu\ue000u zaman i\ue001lemcimiz kod haf\u0131zas\u0131nda kald\u0131\ue000\u0131 yeristack denilen bir b\u00f6lgeye kaydeder. Stack\u0131n ne oldu\ue000unu birazdan anlatacam. Sonra \u00f6nceden belirlenmi\ue001 bir adrese giderek oradaki komutu \u00e7al\u0131\ue001t\u0131r\u0131r. Buadr ese interrupt vekt\u00f6r denir. \u00d6rne\ue000imizde (16f628A) bu adres0x 0 0 4't\u00fcr.

Stack asl\u0131nda bir haf\u0131za b\u00f6lgesidir. Ancak PIC i\ue001lemcilerde buraya do\ue000rudan eri\ue001mek i\u00e7in komut yoktur. Sadece call komutu
veya interrupt olu\ue001tu\ue000unda buray\u0131 i\ue001lemci kendi kendine kullan\u0131r. Stack\u0131n yap\u0131s\u0131n\u0131 masada \u00fcst \u00fcste duran kitaplar gibi
d\u00fc\ue001\u00fcnebiliriz. DiyelimA kitab\u0131n\u0131 masaya koydunuz. En \u00fcstteA kitab\u0131 duruyor. \u00dcst\u00fcne deB kitab\u0131n\u0131 koydunuz.\ue002imdi masadan
bir kitap almak istedi\ue000inizde ilkB kitab\u0131n\u0131 al\u0131rs\u0131n\u0131z. (yooo ben istedi\ue000imi al\u0131r\u0131m deyip oyunbozanl\u0131k yapmay\u0131n...). Sonra s\u0131rayla

CD Ekitaplar\u0131n\u0131 koyun. Almak istedi\ue000inizde E D Cs\u0131ras\u0131yla al\u0131rs\u0131n\u0131z. Ahala en altta duruyor. Onu da en son al\u0131rs\u0131n\u0131z. K\u0131saca

stack\u0131n \u00e7al\u0131\ue001ma mant\u0131\ue000\u0131 "en son giren en \u00f6nce \u00e7\u0131kar" (LIFO-last in first out) mant\u0131\ue000\u0131d\u0131r (adaletsiz ama bizim i\ue001imize gelen
yol...).
Burada PIC i\ue001lemcimizde dikkat edilmesi gereken \u00e7ok \u00f6nemli bir nokta var. Masam\u0131z 8 kitaptan fazlas\u0131n\u0131 almaz! Peki 9.
kitab\u0131 koyarsak ne olur.\ue003lk koydu\ue000umuz kitab\u0131ka ybe d er i z. Bunu olmamas\u0131 i\u00e7in kodumuzun i\u00e7 i\u00e7e 8'den fazla call veya
interrupt yapmamas\u0131n\u0131 garantilemeliyiz. Mesela

biseyler
callf 1
.return

f1:
callf2
.return
f2:
callf3
.return
f3:
.
.
.
f8:
bi\ue000eyler
return
..
\ue003\u00e7 i\u00e7e 8 fonksiyon \u00e7a\ue000\u0131rd\u0131k. Stack\u0131n en son hali \ue001una benziyor:

[1][8. fonksiyondan d\u00f6nece\ue001imiz adres] [2][7. fonksiyondan d\u00f6nece\ue001imiz adres] [3][6. fonksiyondan d\u00f6nece\ue001imiz adres] [4][5. fonksiyondan d\u00f6nece\ue001imiz adres] [5][4. fonksiyondan d\u00f6nece\ue001imiz adres] [6][3. fonksiyondan d\u00f6nece\ue001imiz adres] [7][2. fonksiyondan d\u00f6nece\ue001imiz adres] [8][1. fonksiyondan d\u00f6nece\ue001imiz adres]

\ue002imdi her\ue001ey normal gibi. Ama ya 8. fonksiyon \u00e7al\u0131\ue001\u0131rken bir interrupt olursa...

[1][ Interruptan d\u00f6nece\ue001imiz adres ]
[2][8. fonksiyondan d\u00f6nece\ue001imiz adres]
[3][7. fonksiyondan d\u00f6nece\ue001imiz adres]
[4][6. fonksiyondan d\u00f6nece\ue001imiz adres]
[5][5. fonksiyondan d\u00f6nece\ue001imiz adres]
[6][4. fonksiyondan d\u00f6nece\ue001imiz adres]
[7][3. fonksiyondan d\u00f6nece\ue001imiz adres]
[8][2. fonksiyondan d\u00f6nece\ue001imiz adres]

\ue002imdi ne olacak. 2. fonksiyon bitene kadar her\ue001ey normal. Ama 1. fonksiyondakir et ur n d\u00fczg\u00fcn \u00e7al\u0131\ue001mayacak, sonu\u00e7ta da
tahmin edilemeyen i\ue001ler yap\u0131lacak. Gitti program...
Buna dikkat, i\u00e7 i\u00e7e fazla i\ue001 yapmay\u0131n.

Stack\u0131n nas\u0131l bir\ue001ey oldu\ue000u, ne i\ue001e yarad\u0131\ue000\u0131 umar\u0131m a\u00e7\u0131kt\u0131r. Fark ettiyseniz stack sadece geri d\u00f6n\u00fc\ue001 adresini sakl\u0131yor. Yani
aritmetik bir i\ue001in ortas\u0131nda bir interrupt oldu\ue000u zaman, o anki W ve STATUS registerleri korunmad\u0131\ue000\u0131 i\u00e7in geri d\u00f6nd\u00fc\ue000\u00fcm\u00fczde
i\ue001lerimiz sand\u0131\ue000\u0131m\u0131z gibi gitmiyor. Bunu nas\u0131l engelleyece\ue000imizi \u00f6rnek program\u0131m\u0131z\u0131 yazarken g\u00f6recez.

\ue002imdi MPLAB\u0131 a\u00e7al\u0131m. Program\u0131m\u0131z biraz daha karma\ue001\u0131k olsun diye iki interrupt kayna\ue000\u0131n\u0131 birden kontrol etsin. Birincisi
BB0/INT olsun. Bu interrupt RB0 pinindeki sinyale g\u00f6re olur.\ue003ki \u00e7e\ue001itli olabilir.
1.Y\u00fckselen kenar tetiklemeli
RB0 pinindeki potansiyel 0V'den 5V'ye\u00e7\u0131 kar ken interrupt olur. 5V'den 0V'ye d\u00fc\ue001erken olmaz.
5V______________________
__ _______/______________\
0V______/____ ___________\______ RB0
_________^_______________^
interruptol u\ue000ur__________interrupt olu\ue001maz
2.D\u00fc\ue000en kenar tetiklemeli
RB0 pinindeki potansiyel 5V'den 0V'yed \u00fc\ue000er ke n interrupt olur. 0V'den 5V'ye \u00e7\u0131karken olmaz.
5V______________________
__ _______/______________\
0V______/____ ___________\______ RB0
_________^_______________^
interrupt olu\ue001maz__________interruptol u\ue000ur
PIC ilk \u00e7al\u0131\ue001maya ba\ue001lad\u0131\ue000\u0131nda RB0 interrupt\u0131 y\u00fckselen kenar tetiklemeli olarak ba\ue001lar. Biz cinslik olsun diye d\u00fc\ue001en kenara
alal\u0131m. Bunu da OPTION_REG registerindeki INTEDG bite0 de\ue000erini vererek yapar\u0131z.
Gelelim ikinci interrupt kayna\ue000\u0131m\u0131za. Bu da PORTB interrupt olsun. E\ue000er RB4, RB5, RB6, RB7 pinlerinden birinin de\ue000eri
de\ue001i\ue000irse (0V'den 5V'ye veya 5V'den 0V'ye) o zaman interrupt olur. Ancak bu pinlerden output olanlar\u0131 dikkate al\u0131nmaz.
Interrupt\u0131 kullanabilmemiz i\u00e7in bunlardan en az birini input yapmal\u0131y\u0131z.
Ayn\u0131 mant\u0131kla RB0'\u0131n da input olmas\u0131 laz\u0131m.

Hangi interruptlar\u0131 kullanaca\ue000\u0131m\u0131za karar verdik.\ue002imdi bunlar\u0131 aktif hale getirmemiz gerek. PIC ilk \u00e7al\u0131\ue001maya ba\ue001lad\u0131\ue000\u0131nda
hi\u00e7bir interrupt aktif de\ue000ildir. INTCON registerinin INTE bitini1 yaparak ilkini, RBIE bitini1 yaparak ikincisini aktifle\ue001tiriyoruz.
Yetmez. GIE bitini de1 yapmal\u0131y\u0131z. Bu bit olduk\u00e7a \u00f6nemli \u00e7\u00fcnk\u00fc herhangi bir interrupt\u0131n olup olmamas\u0131n\u0131 bu bit belirler.
Ayr\u0131ca bir interrupt olu\ue001tu\ue000unda bu bits\u0131f \u0131rl an\u0131 r ki interrupt servisi i\u00e7indeyken bir daha interrupt olu\ue001mas\u0131n. Yoksa stack
kontrolden \u00e7\u0131kar, STATUS ve W registerlerini de kaybederiz.r etfi e komutuyla interrupt servisinden geri d\u00f6nd\u00fc\ue000\u00fcm\u00fczde GIE
tekrar1 olur.

Peki hangi interrupt\u0131n olu\ue001tu\ue000unu nas\u0131l anlar\u0131z? INTCON registerinde birincisi i\u00e7in INTF ikincisi i\u00e7in RBIF flag bitleri vard\u0131r. Bu
interruptlardan biri olu\ue001tu\ue000unda ilgili flag1 olur.
Interrupt olu\ue001umunu biraz daha derinlemesine incelersek...
\u2022
Kullan\u0131lan interruptlar\u0131 aktif hale getirdik.
\u2022
GIE'yi 1 yaparak interrupt olu\ue001mas\u0131na izin verdik.
\u2022
Interrupta neden olay ger\u00e7ekle\ue001ti.
\u2022
GIE 0 oldu.
\u2022
\ue003lgili interrupt flagi 1 oldu.
\u2022
Geri d\u00f6n\u00fc\ue001 adresi stacke at\u0131ld\u0131.
\u2022
0x004 interrupt vekt\u00f6r\u00fcne atland\u0131.
\u2022
Interrupt servisi.
\u2022
retfie ile geri d\u00f6nd\u00fck GIE tekrar 1 oldu.

Burada bir\ue001eyi eksik anlatt\u0131m. PIC, 0x004 adresine gitmek i\u00e7in interrupt flaglerine de bakar. E\ue000er biri 1 ise atlar. Interrupt servisinin i\u00e7inde biz bu flagi s\u0131f\u0131rlamazsak geri d\u00f6nd\u00fc\ue000\u00fcm\u00fczde GIE 1 olacak, i\ue001lemci tekrar flaglari kontrol edecek, birinin 1 oldu\ue000unu g\u00f6r\u00fcp, yine interrupt olu\ue001mad\u0131\ue000\u0131 halde, tekrar 0x004'e atlayacakt\u0131r.

Art\u0131k kodu yazabiliriz.

listp=16f628A
#includep1 6f 62 8 A. i nc
cblock 0x70

stat_temp
;STATUS registeri icin gecici degisken
w_temp

;W icin gecici degisken
;0x70i butun BANKlar icin ortak oldugu icin sectim
;boylece ana programin hangi BANKta oldugundan bagimsiz
;buraya erisebiliriz

endc
org 0x000
gotomai n
org 0x004
gotoi nt ser v
main:
bsfST AT U S, R P0
movlw 0x81
movwfTRI SB
;PORTBde RB0 ve RB7 input gerisi output
bcfOPTI ON_R EG, I NTED G
;RB0 interrupti dusen kenarda
bcfST AT U S, R P0
movlw 0x98
movwfI N TCON
;GIE=1 INTE=1 RBIE=1. gerisi 0 olmali
clrfPO R TB
;PORTB temizle
clrw
;W yi temizle
loop:
addlw 0x3
gotol oo p
;sirf Wnin degismesi icin surekli 3 ekliyoruz
intserv:
;interrupt servisi
movwfw _temp
;W yi gecici degiskende sakla
swapfST AT U S, w
;STATUSu W ye yaz. swapf komutunu STATUS bitlerini etkilemedigi icin
kullandik
movwfstat_tem p
;W yi gecici degiskene yaz
clrw
;sirf STATUStaki Z flagini 1 yapsin degisikilik gozuksun diye
btfscI N TC ON, I NTF
;hangi interrupt olusmus?
gotoi nt 0
bcfI N TC ON, RBI F
;RBIF interrupt flagini sifirla
movlw 0x40
xorwfPORTB, f
;RB6 yi degistir
gotocl ea n
int0:
;RB0 interrupti
bcfI N TC ON, I NTF
;INTF flagini sifirla
movlw 0x02
xorwfPORTB, f
;RB1 i degistir
clean:
swapfstat_tem p, w
;STATUSu duzlet
movwfS T ATU S
;geri yaz
swapfw _temp, f
;swapf STATUSu etkilemiyor. w_tempi ters cevir
swapfw _temp, w
;w_tempi duzelt geri yaz
retfie
;GIE=1
end
\ue002imdi...
\u2022
Program\u0131 Project->Quickbuild edelim.
\u2022
Debugger->Select Tool->MPLAB SIM. Bakal\u0131m kodumuz d\u00fczg\u00fcn \u00e7al\u0131\ue001\u0131yor mu.

You're Reading a Free Preview

Download
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->