ARİTMETİK İŞLEMLER

Transkript

ARİTMETİK İŞLEMLER
MİKROİŞLEMCİLER VE MİKRO DENETLEYİCİLER 2
DERS NOTLARI
Prof. Dr. Hakan Ündil
2013-2014 Bahar-Final
BÖLÜM 7 - LOJİK İŞLEM KOMUTLARI
7.1.
RLF Komutu (Bir bit Sola Kaydırma)
Bir file register içinde bulunan bitlerin birer bit sola kaydırılması işlemidir. Bu durumda en solda
bulunan ( 7. bit ) C ( elde ) bayrağına geçmekte, daha önce C’ de bulunan bit ise en sağdaki ( 0.) bite
geçmektedir. Komutun formatı;
RFL
FİLE REGISTER
,
d
W yada F ( Sonucun Yeri )
Komutu şematik gösterirsek;
Program Örneği : Bir programla önce PORTB ye h’01’ yükleyin. Daha sonra 1 defa bu biti sola
kaydırın. Bu işlemin daha iyi görülebilmesi için üst üste 2 kere GECIKME alt programı kullanın.
GECİK1
GECİK2
BASLA
16F84’ ü tanıt
PORTB çıkış
PORTB
01
CALL GECIKME
BEKLE
CALL GECIKME
RLF PORT B
; PROGRAM.ASM
LIST
P = 16F84
INCLUDE
“ P16F84.INC”
EQU
h‘0C’
EQU
h‘0D’
BCF
STATUS, 0
BSF
STATUS, 5
CLRF
TRISB
BCF
STATUS, 5
MOVLW
h‘01’
MOVWF
PORTB
CALL
GECIKME
CALL
GECIKME
RLF
PORTB,F
GOTO
BEKLE
GECIKME MOVLF
MOVWF
DONGU 1 MOVLW
h‘FF’
GECIK1
h‘FF’
SON
1
; Elde yi sıfırla
; Bank1’e geç
; PORTB Çıkış
; Bank0’a geç
;PORTB’ ye 01 yaz
; Bekleme yap
; Tekrar Bekleme yap
; 1 bit sola ötele
; Önceki Gecikme Alt Prog ile aynı
DONGU2
7.2.
MOVWF
DECFSZ
GOTO
DECFSZ
GOTO
RETURN
END
GECIK2
GECIK2, F
DONGU2
GECIK1, F
DONGU1
RRF Komutu (Bir Bit Sağa Kaydırma)
RRF komutu da RLF komutuna benzer olup fark bu defa kaydırma işleminin sağa olması
dolayısıyla en sağdaki bit (0.bit) C ( elde ) bayrağına geçecektir. Daha önce C bayrağında bulunan bit
ise bu sefer en soldaki (7.bite) geçecektir. Komut formatı;
RRF FİLE REGİSTER
,
d
Sonucun gideceği yer
W yada F
Mesela MEM adlı bir file registere hex 30 sayısını yazın. Aynı anda C bayrağı da (C= 1) ise RRF
komutunun icrasından önce ve sonraki durum:
Bu işlem için kullanılacak program komutları :
MOVLW
MOVWF
RRF
h‘49’
MEM
MEM, F
; W Registerine (49)16 yükle
; W ‘ yi MEM adresine sakla
; MEM ’ i Sağa bir bit ötele şeklinde olacaktır.
7.3. COMF ve SWAPF Komutları

COMF komutu ile istenen bir file register içinde (0) lar (1) ve (1) ler (0) yapılabilir [1’ e
göre tümleyen işlemi !.. ] . Komut formatı;
COMF FILE REGISTER
,
d
Sonucun gideceği yer
( destination ) ( W yada F yazılır )
şeklindedir.
Örnek: HAFIZA1 adlı registere ( 1F )16 yüklendikten sonra bunun tersini bularak
HAFIZA2’ ye saklayan Program Parçasını yazın.
HAFIZA1
0001 1111
2
MOVLW
MOVWF
COMF
MOVWF

h‘0F’
HAFIZA1
HAFIZA1, W
HAFIZA2
HAFIZA2
1110 0000
SWAPF komutu ise bir file register içindeki ilk dört bit (Yüksek anlamlı Nibble) ile son
dört bitlerin (Düşük anlamlı Nibble) yerlerini değiştirir. Komut formatı;
SWAPF FILE REGISTER
,
d
şeklindedir.
Örnek: PORTB’ ye ( 3F ) yazdıktan sonra ilk ve son 4’lü bitlerin yerini değiştiren ve
sonucu W ye yazan Program parçası yazın.
MOVLW
MOVWF
SWAPF
7.4.

h‘3F’
PORTB
PORTB, W
ANDLW ve ANDWF Komutları
ANDLW Komutu
W registerinin içeriğini sabit bir sayı ile Lojik AND (VE) işlemine tabi tutar. Sonucu tekrar W ’ye
yazar. Bilindiği gibi işlemin sonunda her iki sayıda 1-1 olan bitler 1; diğerleri 0 olarak neticelenecektir.
Komut formatı;
Sabit sayı
ANDLW
şeklindedir.
Bu komutla bir sayının ( veri ) istenen bitleri ( 0 ) yapılırken diğerleri olduğu gibi bırakılır. Bunun için sabit
sayı ( maske ) seçilirken sıfır yapılmak istenenler ( 0 ), diğerleri ( 1 ) olarak seçilmelidir.
Örnek: W içinde (3C) sayısı olsun. Bu sayının 2.,3. ve 6. bitlerini (0) yapıp diğerlerini aynen bırakan
komutu yazalım. Sonuçta sayı ne olur?
Önce W deki sayıya hiç bakmadan 2.,3.,6. bitleri 0, öteki bitleri 1 olan bir maske seçelim.
7
6
5
1 0 1
4
3
1 0
2
1 0
0 1 1
= (B3)16
Bu maskeyle W deki sayıyı (3C yi) Lojik VE işlemine tabi tutmak için gerekli komut:
h’B3’
ANDLW
olacaktır.
Sonucu bulmak için ise, W deki sayı (3C)16 verildiğine göre bu sayının 2.,3. ve 6. bitlerinin
sıfırlanmış halini yazmamız gerekir. O da (30)16 olarak elde edilecektir. [ 3C de 6. bit zaten 0 olduğuna
göre, 3C yi binary yazın ve 2. ve 3. bitlerini sıfırlayın]
3

ANDWF Komutu
Bu komut ANDLW komutuna benzer olup bu defa W ile herhangi bir file register arasında Lojik
AND (ve) işlemi gerçekleştirilir. Sonuç ise ya W ‘ye ya da F ‘e yazılır. Komut formatı:
File Register
ANDWF
,d
(Sonucun yeri, W ya da F)
şeklindedir.
Örnek: PORTB registerinin içinde b’00101100’ sayısı olsun. W Registerine de b’11011111’ değerini
(maske) yerleştirelim. Bu iki sayıyı Lojik AND işlemine tabi tutarak neticeyi yine PORTB ye yazalım.
Bunun için gerekli program parçası :
b’00101100’
PORTB , F
MOVLW
ANDWF
7.5.

; W Registerine 2C yükle.
; PORTB ile W yi AND (VE) işlemine tabi tut
; ve sonucu yine PORTB ye yaz
IORLW ve IORWF Komutları
IORLW Komutu
Bu komut istenen bir biti 1 yapıp diğerlerini aynen bırakmak için kullanılır. Verilen sabit sayı ile W
registeri Lojik OR (VEYA) işlemini yapar ve sonucu yine W registerine yazar. Komut Formatı:
Sabit sayı
IORLW
şeklindedir.
Bu amaçla seçilecek sabit sayıda (Maske’de), (1) yapılmak istenen bitler (1), değiştirilmesi istenmeyen
bitler (0) seçilmelidir.
Örnek: W Registerinde bulunan sayının 5.,6.,7. bitleri 1 yapılıp diğer bitler aynen bırakılmak
istensin.
Önce Maskemizi seçelim;
7
6
1
1
5
4
3
2
1 0
1 0 0 0 0 0
= E0 (Sayıda 1 yapılacak bitler 1)
Bu durumda gerekli program parçası (komut)
b’1110 0000’
IORLW
olacaktır.
NOT: Maske seçimi işlemi için W da bulunan sayının bilinmesine gerek yoktur. Hangi
sıradaki bitlerin (burada 5,6,7 idi) 1 yapılacağının bilinmesi yeterlidir. Soruda “sayı W dadır”
denildiği için program parçasında W ‘ya yükleme komutuna ihtiyaç yoktur.
Örnek: Yukarıdaki örnekte W daki sayımız (04)16 olsaydı sonuç ne olurdu?
W ile Maske arasında OR işlemi: (sonuç E4 olacaktır)
Bit No:
7
6
5
4
3
2
1
0
W Reg.
0
0
0
0
0
1
0
0
Maske
1
1
1
0
0
0
0
0
Sonuç
1
1
1
0
0
1
0
0
4

IORWF Komutu
Bu komut da IORLW komutuna benzer olup fark, maskenin sabit sayı yerine bir file registerde bulunmuş
olmasından ibarettir. Sonuç ise ister W ‘ye , ister File Register ’a yazılabilir.
Komut Formatı:
File Register
IORWF
, d
(Sonucun yeri, W ya da F)
7.6. XORLW ve XORWF Komutları
 XORLW Komutu
Bu komut ise W Registeri ile verilen sabit sayı arasında EXOR ( Özel VEYA) işlemi
gerçekleştirerek sonucu W ‘ye yazar. Komut Formatı:
Sabit Sayı
XORLW
şeklindedir.
Bu komut da W Registerde bulunan 8 bitlik sayının istenen bitlerinin tersini almak diğer
bitleri aynen bırakmak için kullanılabilir. Bu maksatla belirlenecek Maske baytında tersi alınmak
istenen bitler (1), diğerleri (0) seçilmelidir.
Örnek: Önce W ‘ya (3B)16 sayısını yükledikten sonra bu sayının sadece 1. , 3. , 5. , 7. bitlerinin
tersini alıp neticeyi PORTB ye yazmak için gerekli komutları verin. Bu durumda sonuç ne olur?
h ‘3B’
b’10101010’
PORTB
MOVLW
XORLW
MOVWF
;W ye (3B) yaz
; maskede 7,5,3,1. bitler 1, yapıldı
; Sonuç PORTB ye yazıldı
W ile sabit sayı arasında (EXOR işlemi)
Bit No:
7
6
5
4
3
2
1
0
W Reg.de(3B)
0
0
1
1
1
0
1
1
Maske (AA)
1
0
1
0
1
0
1
0
Sonuç (91)
1
0
0
1
0
0
0
1

XORWF Komutu
Bu komut da XORLW komutuna benzer olup burada asıl sayı W registerde, maske ise file
registerde bulunur. İşlem sırası önemli olmadığı için maskeyi W’ya asıl sayıyı File Registere
yazmak da mümkündür.
NOT: XORLW ve XORWF iki tane 8 bitlik sayının aynı olup olmadıklarını test etmek için
kullanılabilir. Sayılar aynı ise EXOR lanınca sonuç (00)16 olacağından Z bayrağı (1) olacaktır.
Aksi takdirde Z bayrağı (0) kalacaktır. [ Z bayrağının STATUS ‘un 2. biti olduğunu hatırlayın]
5
Örnek: PORTA da bulunan bir baytlık sayı, (09)16 dan farklı ise PORTA test edilmeye devam
edilecek, (09)16 ‘a eşit ise bu sayının PORTB ‘ye yazılması isteniyor. Gerekli Program Parçası:
MOVLW
TEST XORWF
BTFSS
GOTO
MOVF
MOVWF
h’09’
PORTA,W
STATUS,2
TEST
PORTA , W
PORTB
; W ile PortA ya Lojik EXOR işlemi uygula
; Z bayrağı 1 mi?(Sonuç=0 mı?)
; Değilse TEST ‘e git
; Evetse PortA yı W ye aktar
; W yi PortB ye yaz
Mesela, PORTA ya gelen sayı (07)16 olsa ve (09)16 ile XORWF işlemi yapıldığında;
0000 0111
0000 1001
0000 1110
(07)
(09)
(0E)
Sonuç 0 ‘dan farklı olduğuna göre test etmeye devam eder
Benzer şekilde bir baytlık veriyi sıfır sayısı ile karşılaştırmak için IORLW ve IORWF
komutları kullanılabilir.
Örnek: PORTA daki sayının (00)16 olup olmadığını test eden, sıfır ise ILERI etiketine atlayan
aksi takdirde test etmeye devam eden bir program parçasını IOR türü bir komutla yazın.
TEST MOVF
IORLW
BTFSS
GOTO
GOTO
PORTA ,W
h’00’
STATUS , 2
TEST
ILERI
; PortA yı W ye kopyala (yaz)
; W ile (00) arasında Lojik VEYA uygula
; Sonuç=0 mı ( Z=1 mi?)
; Değilse TEST ‘e git
; Evetse ILERI adresine git.
Program Örneği : PORTA nın bütün bitleri normalde (1) iken PORTA da 0,1,2. bitlerin
(RA0,RA1,RA2) hepsine basılınca PORTB ye (0F)16 yükleyen aksi halde test etmeye devam eden
bir program için akış diyagramı çizerek assembly programı yazınız.
Maske: 0001 1000 [ilk 3 bit(0) PORTA da yok, son üç bit(0) test edilecek]
; PROGRAM.ASM
LIST
INCLUDE
CLRF
BSF
MOVLW
MOVWF
CLRF
BCF
30.10.2009
P=16F84
“P16F84.INC”
PORTB
STATUS,5
h’FF’
TRISA
;PortA Giriş
TRISB
;PortB Çıkış
STATUS,5
;Bank0 a geç
TEST MOVLW
b’00011000’ ;Maskeyi W ye
PORTA,W
;PortA ile EXOR
STATUS,2
; Z bayrağı 1 mi?
TEST
;Değilse TEST e
h’0F’
;Evetse W ‘ ye 0F yaz
PORTB
; PortB ye aktar
XORWF
BTFSS
GOTO
MOVLW
MOVWF
END
6
BÖLÜM 8 - ARİTMETİK İŞLEMLER
PIC Mikrodenetleyicilerde aritmetik işlem komutları diğer komutlar kadar gerekli olmakta,
özellikle toplama, çıkartma ve (2n =2,4,8,16) ile çarpma ve (2n =2,4,8,16) ile bölme işlemleri bu komutlarla
kolaylıkla gerçekleştirilebilmektedir.
PIC16F84 ‘de bulunan Temel Aritmetik İşlem Komutları şöylece özetlenebilir :


ADDLW : Bir sabiti W register ile toplar. Ve sonucu yine W registerine yazar.
ADDWF : W register ile File registeri toplar. Sonucu File registere ya da W‘ye
yazar.
SUBLW : Bir sabitten W’ yi çıkarır. Ve sonucu yine W registerine yazar
SUBWF : File registerden W’ yi çıkarır. Sonucu File registere yada W ‘ye
yazar.
RLF
: C bayrağı üzerinden bitleri sola kaydırır (döndürür) [2 ile çarpma].
RRF
: C bayrağı üzerinden bitleri sağa kaydırır (döndürür) [2 ile bölme].
( Dağıtılan Komut tablosunu ve önceki dönem konularını inceleyiniz)




NOT: 1) 8 bit toplamada C (elde-carry) bayrağı sonucun 8 bit dışına taşıp taşmadığını
gösterir. Şayet toplama komutu sonunda


C = 0 ise sonuç 8 biti (h’FF’ sayısını) aşmamıştır.
C = 1 ise sonuç 8 biti (h’FF’ sayısını) aşmıştır.
NOT: 2) 8 bitlik işaretsiz çıkartmada (0......255)10 = (0….FF)16 aralığında elde edilen sonuçta;
NOT: 3)
8.1.

C = 1 ise sonuç pozitiftir.
[Yani 1.sayı 2.sayıdan BÜYÜK’ dür].
Borç (ödünç) yoktur…

C = 0 ise sonuç negatiftir.
[Yani 1.sayı 2. sayıdan KÜÇÜK’ dür].
Borç (ödünç) vardır…
İşaretli sayılarla yapılan çıkartma işlemlerinde C bayrağı dikkate alınmaz.
Eğer ( -128 ..... +127) aralığı dışına çıkılmamışsa sadece 7. bit (Sonuç byte’ının en
solundaki bit) işareti tayin eder! Bu bit ‘0’ ise sonuç pozitif, ‘1’ ise sonuç negatiftir !
 Bu dönemki çalışmalarda işaretli sayılar üzerinde işlem yapılmayacaktır.
8 Bit Toplama:
PIC16F84’ de 8 bit toplama için 2 komut mevcuttur:
1) ADDLW Komutu: Sabit sayı ile W (Aküde) registerinde bulunan sayıyı toplar ve
neticeyi W registerine yazar.
Örn:
ADDLW
h’08’
; h’08’ sayısını W’ ye ekler.
2) ADDWF Komutu : W registerinde bulunan sayı ile File registeri toplar ve sonucu
7
File registere yada W registere yazar.
Örn:
MEM, F ; W ile MEM registeri toplanır,
sonuç tekrar MEM’ e yazılır.
ADDWF
Çeşitli Hex. (16 ‘lı tabanda) Toplama İşlemleri:
1)
h’09’
h’DE’
h’E7’
C Bayrağı : 0 oldu.

h’03’
h’FB’
h’FE’
C Bayrağı : 0 oldu.
2)
h’F8’
4)
h’FE’
h’08’
h’08’
1 h’00’
1 h’06’
C Bayrağı : 1 oldu
C Bayrağı :1 oldu
3)
O halde sonuç h’FF’ den büyükse toplama işleminde C bayrağı= (1) olmaktadır.
Örnek : Önce W registerine h’5D’ yazdıktan sonra bu sayıyı h’42’ ile toplayıp neticeyi hem W
registerine ve hem de PORTB’ye yazmak için akış diyagramı çizerek assembly program parçasını yazınız.
Sonucu ve C bayrağını bulunuz.
MOVLW
ADDLW
MOVWF
h’5D’
h’42’
PORTB
; h’5D’ yi W ye yükle
; h’42’ ile topla
;W deki sonuç PORTB ye
İşlemleri yaparsak :
İşlemi hem 16’lı (heksadesimal) hem de 2’li (binary) tabanda yaparsak;
Heks. olarak;
5D
42
9F
C bayrağı = 0
8.2.
Binary olarak;
0101 1101
0100 0010
1001 1111
C bayrağı = 0 (Sonuç FF’den küçük olduğu için)
16 Bit (İki Byte) Toplama :
Toplama işleminde h’FF’ = d’255’ (1 byte)’ den daha büyük sayılar kullanıyorsak toplama
yapmadan önce bu sayıyı 2 byte’lık parçalar halinde ifade ederiz. Ve sonucu da 2 byte olarak buluruz.
Örnek olarak h’019F’ sayısını ele alalım. Burada ‘01’ i ise üst byte ve ‘9F’ i alt byte, olmak üzere
16 bitlik (16’lı olarak 4 haneli) sayıyı iki kısma ayırırız. Daha sonra toplanacak diğer sayıyı da aynen ikiye
ayırıp alt byte’ları birlikte, üst byte’ları da yine kendi aralarında topladıktan sonra alt byte’ların toplamını
bir registere, üst byte’ların toplamını bir başka registere yazarız.
Bu arada alt byte’ların toplamından (elde-carry) oluşursa bu eldeyi üst byte’lardan birine eklemek
gerekir. Bu durumda akış diyagramını bu program parçası için çizersek:
8
Örnek : h’32A6’ sabit sayısı ile h’2E9C’ sabit sayısını toplayarak sonucun alt-byte’ını
PORTB’ ye yazın. Daha sonra Program parçası GECIKME alt programına giderek neticenin
bu kez üst-byte’ını UST’ adlı registere gönderip yine GECIKME’ ye gidecek ve tekrar en
başa dönerek işlemleri sürekli tekrarlayacaktır. Akış diyagramını çizip, program parçasını
yazın (GECIKME alt programı yazılmayacaktır).
X. sayısı
Y. sayısı
32
2E
1. sayı üst byte (XH)
1. sayı alt byte (XL)
A6
9C
2. sayı alt byte (YL)
2. sayı üst byte (YH)
Önce toplama işlemini yapalım:
Hex.
Desimal
32 A6
+ 2E 9C
61 42
Akış Diyagramı
Binary
12966
+ 11932
24898
0011 0010 1010 0110
+ 0010 1110 1001 1100
0110 0001 0100 0010
Program Parçası
XL
XH
YL
YH
EQU
EQU
EQU
EQU
BASLA MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
h’0C’
h’0D’
h’0E’
h’0F’
; XL için 1 byte’lık yer ayır.
; XH için 1 byte’lık yer ayır.
; YL için 1 byte’lık yer ayır.
; YH için 1 byte’lık yer ayır.
h’A6’
XL
h’32’
XH
h’9C’
YL
h’2E’
YH
; Verilen değerler X,Y lere yazıldı.
; X ve Y byte’ları ayrılan registerler yükle.
9
TOPLA MOVF
ADDWF
MOVWF
BTFSC
INCF
CALL
MOVF
ADDWF
MOVWF
CALL
GOTO
8.3.
XL, W
YL, W
PORTB
STATUS, 0
XH, F
GECIKME
XH, W
YH, W
UST
GECIKME
BASLA
; XL ve YL yi topla.
;Sonucu PORTB ‘ye yaz
; C = 0 mı?
; Hayırsa XH’ı (1) arttır
;Gecikme alt prog. çağır
; YH ile XH ‘ı topla.
; Sonucu UST ‘e yaz
;Gecikme altprogramını çağır
8 Bit Çıkartma:
PIC16F84 Mikrodenetleyicisinde 2 tür çıkartma komutu vardır. Daha önce karşılaştırma işlemi için
(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF
şeklindedir. Kısaca hatırlarsak;

SUBLW komutunda sabit sayıdan W registerinin içeriği çıkarılarak sonuç W’ ye yazılır.
Örn:

SUBLW
h’09’
; h’09’ dan W registeri çıkarılır, sonuç W’ ye yazılır.
SUBWF komutunda ise File registerden W çıkarılır ve sonuç W’ ye yada File registere yazılır.
Örn:
SUBWF
MEM, F
; MEM adı ile tanımlı registerin içeriğinden W çıkarılır
; ve sonuç F’ e yazılır.
Örn:
SUBWF
h’20’, W
;0x20 adresinde bulunan sayından W çıkarılır,Wye yazılır
İşaretsiz Sayılarla Çeşitli Çıkartma İşlemleri:
1)
h‘08’
2)
h’09’
h’FF’ (Binaryde Tümleyen Arit. kullanarak)
C bayrağı = 0 (sonuç negatif)
h’08’
h’07’
h’01’
C bayrağı = 1 (sonuç pozitif)
Örnek : PORTA’ da bulunan h’1B’ sayısından h’0A’ sayısını çıkaran ve neticeyi PORTB’ ye
yazan bir program parçasını ve ilgili akış diyagramı ile yapınız. Sonucu ve C bayrağının değerini veriniz.
MOVLW
SUBWF
MOVWF
10
h’0A’
PORTA, W
PORTB
; PORTA – (0A)
; Sonuç PORTB ye
İşlem: Hex.
Komplement Aritmetiği İle
h’1B’
h’0A’
h’11’
C bayrağı = 1(Borç yok)
0001 1011
0000 1010
0001 1011
1111 0110
0001 0001
C bayrağı = 1 olur.
Örnek : MEM1 adlı registerde bulunan h’35’ sayısından h’4C’ sayısını çıkardıktan sonra elde
edilen ‘negatif’ sayıyı PORTB’ deki LED’ leri yakarak ( 1 yaparak) gösteren bir program parçası yazınız.
Yanacak LED’ leri ve C bayrağını bulunuz.
Program Parçası:
MOVLW
SUBWF
COMPF
INCF
MOVF
MOVWF
h’4C’
MEM1, F
MEM1, F
MEM1
MEM1, W
PORTB
;0
1, 0
1 koyar.
; 1 arttırır, tabana göre komplement’i(tümleyeni) bulur.
; MEM1 ‘i W’ ye alır.
; sonucu PORTB’ ye yazar.
Hex. Yapalım
Binary Yapalım
h’35’
h’4C’
h’-17’
0011 0101
0100 1100
PORTB’ de RB4, RB2, RB1, RB0
bağlı LED’ ler yanacaktır.
0011 0101
1011 0100
1110 1001 (negatif)
Tümleyen alınırsa
0001 0111
h’17’(C=0)
8.5.
Cevap: -17
16 Bit (İki byte) Çıkartma:
16 bit toplamaya benzerdir. Eksilen ve çıkan sayıların üst ve
alt byte’ları için birer olmak üzere 4 byte kullanılması gerekir.
Örnek olarak h’53A8’ sayısından h’24F6’ sayısını çıkarmak için;
Borç
Genel bir ‘akış diyagramı parçası’ çizersek :
53 A8
yandaki gibi bir durum ortaya çıkacaktır.
24 F6
Alt byteları çıkar
Hayır
(Borç
varmı?)
C = 0 mı?
2E B2
Evet
 Bu defa altbyte’ların çıkartılamasından borç kaldıysa
1. sayının üstbayt’ından [burada 53’den] (1) çıkarılmalıdır.
1. sayının üst byte’ından
(1) çıkar
Üst byteları çıkar
Örnek : Yukarıda verilen 2 byte’lık 1.sayının sırasıyla düşük ve yüksek anlamlı byte’lar olmak
üzere MEM1L ve MEM1H adlı registerlerde bulunduğu , yine 2 byte’lık 2. sayının MEM2L ve MEM2H
adlı registerlerde mevcut olduğunu varsayarak çıkarma işlemini yapınız. Sonucun alt byte’nı PORTB ‘ye
11
yazınız, üst byte’nı ise RA0 biti = 0 olduktan sonra yine PORTB’ ye gönderilmesini sağlayan bir program
parçası yazınız .
Program Parçası:
CIKAR MOVF
SUBWF
BTFSS
DECF
MOVF
SUBWF
MOVF
MOVWF
TEST BTFSC
GOTO
MOVF
MOVWF
MEM2L, W
MEM1L, F
STATUS, 0
MEM1H, F
MEM2H, W
MEM1H, F
MEM1L, W
PORTB
PORTA, 0
TEST
MEM1H, W
PORTB
; MEM1L ‘den MEM2L ‘yi çıkart.
; C = 0 mı? (Borç var mı?)
; Evetse MEM1H’ dan 1 eksilt
; Hayırsa W
MEM2H
; Üst byte sonucunu yine MEM1H’a yaz.
;W
MEM1L
; Alt byte sonucunu PORTB’ ye
; RA0’ a basıldı mı?
; Hayırsa TEST’ e git.
; Evetse MEM1H ‘ı W ’ye aktar.
; Üst byte’ ı PORTB’ ye yükle.
*********
12
BÖLÜM 9
DÖNÜŞÜM TABLOLARI (LOOKUP TABLEs)
Dönüşüm tabloları bir kodu bir başka koda dönüştürmek için kullanılır. Örnek olarak belli bir
sayı ile o sayıyı göstergede yakmak için uygulanması gereken sayı arasında fark vardır. “3” sayısını
herhangi bir şekilde bir mikrodenetleyiciye bağlı display ya da göstergede yazmak için “3” sayısının ikili
tabandaki karşılığından farklı bir dijital (sayısal) bilginin mikrodenetleyiciden (PIC’den) gönderilmesi
gerekir.
9.1.
7 Parçalı (Segment) Gösterge (Display) Uygulaması
Mesela; PORTB 'ye bağladığımız bir 7- segment (parçalı) display’in (göstergenin) üzerinde
heksadesimal (0,1,2.......E,F) sayıları göstermek istersek bu tür bir tablo kullanabiliriz.
a
b
f
e g c
d
(Nokta dahil) toplam 8
tane segment
bulunmaktadır.
nokta
PB0
(a)
PB7 (
)
7-segment(parçalı) display(gösterge) Ortak katod’lu ise bu uç GND' a (Besleme kaynağının (-) ucuna
bağlanmalıdır. Bu dijitte noktasız olarak ‘0’ yakmak için a,b, c, d, e, f segmentleri (parçaları) yanmalı
diğer parçalar sönük kalmalıdır.
Bunun için h’00’ sayısından h’3F’ = b’0011 1111’ elde edilmelidir. Bir başka ifade ile bu Dönüşüm
Tablosuna biz h’00’ verdiğimizde o bize h’3F’ yollamalıdır.
Zira bu durumda a segmenti RB0 dan (PORTB’nin 0. biti) başlamak üzere,
. g f e
0 0 1 1
d c b a
1 1 1 1
olmalıdır.
O halde PORTB' ye h’3F’ yüklenmelidir.
RB7 .................................... RB0
Benzer şekilde (2) sayısını yakmak için aşağıda belirtilen segmentlerin yanması gereklidir.
a
b
e
g
d
Dönüşüm tablosuna ilişkin örnek program yazmadan evvel Program Sayacı’nı (Program Counter
– PC ) ve RETLW komutunu incelemek gerekir.
9.1.1. Program Sayacı (Program Counter – PC )
16F84' de 13 bitlik bir program sayacı (PC) vardır. GOTO ve CALL komutları gerçekte 11 bitlik
adres kullanılır ki bu sayı 16F84 için 1K olan program hafızası için yeterlidir. Hatta 11 bit ile 2K
adreslemek de mümkündür. (Hatırlatma: 211 = 2048 = 2 K)
13
Genelde Program Sayacının alt (8) bitine PCL, üst (5) bitine PCH denir.
PCH
PCL
Bu iki bit 2k' dan
fazla hafızaya sahip
PIC' ler içindir (PIC
16F877 gibi)
11 bit 2 kB hafızaya sahip PIC' ler
için yeterlidir . (PIC 16F84' de
1kB program hafızası vardır).
Program sayacının üst 5 bitini (PCH) doğrudan okumak veya buraya yazmak mümkün değildir.
Ancak PCH’a, veri hafızasında Özel Fonk. Registerlerinden Bank 0 ' da bulunan 5 bitlik PCLATH adı
verilen özel file registerinden faydalanarak veri yüklenebilir, böylece program hafızasında daha uzun adres
bölgelerini kullanmak mümkün olabilir.
Bu derste yazılacak programların uzunlukları normalde 256 satırı (komutu) geçmeyeceği için
sadece 8 bitlik kısım olan (PCL) ile ilgilenmek yeterli olacaktır (28 = 256).
9.1.2. RETLW Komutu:
Aslında RETLW komutu, RETURN komutu gibi bir alt programdan dönüş komutudur. Farklı
olarak ana programa dönerken Akümülatör (W) içinde bir sayı getirir. Şimdi örnek bir program üzerinde
bu komutun çalışmasını incelerken Dönüşüm tablosunu da anlamaya çalışalım.
Örnek : PORTB' de bulunan bir 7 segment göstergede (3) sayısını gösteren bir program parçasını
RETLW komutu kullanarak yazın.
BASLA
DONGU
DONUSUM
MOVLW
CALL
MOVWF
GOTO
h’03’
DONUSUM
PORTB
DONGU
ADDWF
PCL, F
RETLW
h’3F’
RETLW
h’06’
RETLW
h’5B’
RETLW
h’4F’
RETLW
h’66’
…………………..
; DONUSUM Alt programına git
; bu komutta bekle , devam etme
; PCL + W işlemini yap, yeni PCL’ ye yaz.(W=03 idi)
; W= 0 olsaydı bu satıra atlayacaktı.
; W= 1 olsaydı bu satıra atlayacaktı
; W= 2 olsaydı bu satıra atlayacaktı
; W= 3 olduğu için bu satıra atlayacak.
Program çalışmasını takip edersek ;




Önce
MOVLW h’03’ ile W ‘ye h’03’ yüklendi.
CALL DONUSUM ile DONUSUM alt programına atlandı.
ADDWF PCL, F komutu ile PCL' ye (03) sayısı eklenerek PCL (03) kadar arttırılmış oldu ve artık
program RETLW h’4F’ komutunun bulunduğu satıra (3 satır) atlayarak W' ye (4F) yükler ve geriye
CALL komutunun bir alt satırına döner.
Bundan sonra da bu sayı PORTB' ye yüklenmektedir. Dolayısıyla (3) sayısının display’de yakılması
için b’01001111’ = 4F sayısının PORTB ‘ye yüklenmesi yeterli olmaktadır.
14
Örnek : PORTB' nin uçlarına bağlı 7 segment (parça) göstergede 0,1 ... E,F arasında ileri saydıran ve
sayılar arasında GECIKME alt programına giden bir program parçası yazınız (Not: GECIKME alt
programı yazılmayacaktır).
Çözüm:
BASLA
TEKRAR
DONUSUM
9.2.
MOVLW
MOVWF
h’00’
SAYAC
; SAYAC sıfırlandı
MOVF
ANDLW
CALL
MOVWF
INCF
CALL
GOTO
SAYAC, W
b’00001111’
DONUSUM
PORTB
SAYAC, F
GECIKME
TEKRAR
; Bu komutta (0) olan bitler W de aynı bitleri sıfırlar
; DONUSUM alt programına atla.
; Alt programdan gelen W değerini PORTB ye yaz
; SAYAC’ı bir arttır.
;GECIKME alt programına atla (gösterilmemiştir)
; GECIKME altprogramından dönüşte buraya gelir
ADDWF
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
END
PCL, F
h’3F’ ; 0 için dönüşüm kodu
h’06’ ; 1 için dönüşüm kodu
h’5B’ ; 2 için dönüşüm kodu
h’4F’ ; 3 için dönüşüm kodu
h’66’ ; 4 için dönüşüm kodu
h’6D’ ; 5 için dönüşüm kodu
h’7D’ ; 6 için dönüşüm kodu
h’07’ ; 7 için dönüşüm kodu
h’7F’ ; 8 için dönüşüm kodu
h’6F’ ; 9 için dönüşüm kodu
h’77’ ; A için dönüşüm kodu
h’7C’ ; B için dönüşüm kodu
h’39’ ; C için dönüşüm kodu
h’5E’ ; D için dönüşüm kodu
h’79’ ; E için dönüşüm kodu
h’71’ ; F için dönüşüm kodu
Step Motor Kontrolü Uygulaması
PIC ile step motor kontrolü yapmak diğer motorlarına göre oldukça kolaydır. Ancak önce step
motorun çalışma prensibi bilinmelidir. Bu motor Relüktans Motor denilen ve yaygın olarak kullanılan
motora oldukça benzerdir. Her motorda olduğu gibi bu motorda da duran (stator) ve dönen (rotor) kısımlar
mevcuttur.
Dönen kısım ( rotor ) sabit mıknatıstır.
Duran kısmı ( stator )'da motorun tipine bağlı olarak sargılar bulunur.
Motorun dönmesi için belli bir sırayla bu sargılara enerji verilmelidir. Prensip magnetik konularından
bilinidiği gibi aynı kutupların itmesi, farklı kutupların çekmesi şeklinde özetlenebilir. Motorun adım
sayısını bu sargıların sayısı belirler. Bu sargıların bağlantı şeklinde farklı olabilir.
Elimizde aşağıdaki gibi unipolar (tek kutuplu) türde bir step motor olduğunu farzedelim:
X1
Y1
ROTOR
X2
Y2
15
Ortak
Uç
Bu motorda 5 uç bulunmaktadır ve tam dönüşü 8 adımda tamamlamaktadır. Bu adımlardan ilk üçünü ( sağa
dönüş için ) çizelim.
1. ADIM
2. ADIM
0 olsun
3. ADIM
45
90
Akım hangi yönde geçerse N, S kutupları ona göre oluşur. Bu durumda pozisyonlara göre X ve Y de
bulunması gereken seviyeleri yazarsak;
ADIM
1.
2.
3.
4.
5.
6.
7.
8.
X1
1
1
0
0
0
0
0
1
X2
0
0
0
1
1
1
0
0
Y1
0
0
0
0
0
1
1
1
Y2
0
1
1
1
0
0
0
0
olur. Tabloda ( 1 ) olarak görülenler 5 V olabileceği gibi motora göre farklı gerilimler olabilir. Ayrıca
motor akımı PIC port akımını geçiyorsa transistörlerle akımı kuvvetlendirmek gerekir. Adımlar arası yeterli
gecikme sağlanmaz ise kutuplaşma süresi az gelir ve motor doğru şekilde dönmez ve motorda sadece
titreşim oluşabilir.
Zaman diyagramında olayı çizersek;
X1 (RBO)
X2 (RB1)
Y1 (RB2)
HATIRLATMA:
8 ADIM = 23 = 8
Y2 (RB3)
Örnek : Yukarıda verilen işaretleri PORTB' den üreten bir program parçası yazınız. (Tanıtma,
yönlendirme, GECIKME alt programı gösterilmeyecektir. X1 için RB0, X2 için RB1, Y1 için RB2 ve Y2
için RB3 kullanılacaktır).
16
BASLA
Program Parçası:
MOVLW
h'FF'
MOVWF
SAYAC
INCF
SAYAC, F ( 00 oldu)
MOVF
SAYAC, W
ANDLW
b'00001111'
; üst 4 bit (0)
CALL
DONUSUM
MOVWF
PORTB
CALL
GECIKME
GOTO
BASLA
DONUSUM ADDWF
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
PCL, F
; PCL + W
b'0000 0001' ; 1. ADIM
b'0000 1001'
; 2. ADIM
b'0000 1000'
; 3. ADIM
b'0000 1010' ; 4. ADIM
b'0000 0010' ; 5. ADIM
b'0000 0110' ; 6. ADIM
b'0000 0100' ; 7. ADIM
b'0000 0101' ; 8. ADIM
PCL
***********
BÖLÜM 10 -
KESMELER ( INTERRUPTS )
Genellikle mikrodenetleyicilerle yeni çalışmaya başlayanlar 'Kesme/Interrupt' kavramından
ürkerler. Oysa kesme alt programları normal alt programlardan farklı olarak belli bir harici olay ya
da mikrodenetleyici içindeki zamanlayıcı (timer)/sayıcının (counter) belli bir konuma gelmesiyle
tetiklenen ( başlayan ) özel alt programlardan başka bir şey değildir. Kesmeler sayesinde komut
sayısı azaltılabilir , programın çalışması özellikle acil işlemler için hızlandırılabilir ve yazımı
basitleşir.
Kısaca Kesme, mikrodenetleyicinin o anda yapmakta olduğu işi bırakıp saklanması
gereken değişkenleri/registerleri bir yere kaydettikten sonra kesme alt programına atlaması ve bu
alt programda işini bitirdikten sonra daha önce kaydettiği ana programa ait değişkenleri de alarak
asıl işine geri dönmesidir. Bir başka ifadeyle kesmede CALL komutu yerine donanımsal
(hardware) değişkenlerle alt programa gidilmektedir. Adım adım incelersek
(1) PIC16F84' de bir kesme meydana geldiğinde o anda çalışan komut tamamlanır.
(2) Programın kaldığı adres Stack Register’e otomatik olarak saklanır
(3) Program akışı h'004' adresine atlar (PC' ye bu adres yüklenir).
(4) Burada kesme alt programına gidecek GOTO komutu ile ilgili adrese yani kesme alt
programının ilk satırına atlanır.
(5)Kesme altprogramı çalışır.
(6)RETFIE komutu ile asıl (ana) programa geri dönebilmek için kaldığı adresi STACK
denilen registerden okumak üzere gider.
(7)Kaldığı ana program adresine geri döner ve bir sonraki yani sıradaki komutu yürüterek
ana programa devam eder.
O halde kesme olayını basit olarak çizersek;
17
10.1. INTCON ( KESME KONTROL ) REGİSTERİ
INTCON registeri RAM veri hafızasında özel fonksiyon registerlerinde h'0B' (Bank 0 da)
ve h'8B' adresinde (Bank 1' de ) bulunan bir registerdir. Kesme işleminin çalışmasını kontrol eden
bu registerde her bir kesme kaynağı için bir izin biti ile bayrak (flag) ve bir de genel (global)
kesme bayrağı vardır.
Bit 7 ( GEI ) : Bütün kesmelere izin biti.
0 = Tüm kesmeler iptal
1 = Aktif edilmiş kesmeler geçerli
Bit 6 ( EEIE ) : EEPROM hafıza için ‘yazma işlemi tamamlandı’ kesmesi izin biti ;
0 = Bu tür kesme iptal
1 = Bu tür kesme geçerli
Bit 5 ( T0IE ) : TMR0 sayıcı kesmesi izin biti.
0 = İptal, TMR0 h’FF’ den h’00’ a geçişinde kesme oluşturma
1 = Geçerli, TMR0 h’FF’ den h’00’ a geçişinde kesme oluştur.
18
Bit 4 ( INTE ) : Harici kesme izin biti.
0 = İptal, harici kesme kabul edilmez
1 = Geçerli, harici kesme kabul edilir.
Bit 3 ( RBIE ) : PORTB' de RB4, RB5, RB6, RB7 bitleri ‘değişiklik kesmesi’ izin biti
0 = İptal, RB4....RB7 ‘deki herhangi bir değişiklik kesme oluşturmaz.
1 = Geçerli, RB4....RB7 ‘deki değişiklik kesme oluşturur.
Bit 2 ( T0IF ) : TMR0 sayıcısı zaman aşımı bayrağı
0 okuyorsak henüz zaman aşımı yok
1 okuyorsak zaman aşımı var. (TMR0 h’FF’ den h’00’ a geçiş yapmış.)
Bit 1 ( INTF ) : Harici kesme bayrağı ( RB0 / INT ucundan gelen sinyal ile )
0 ise Harici kesme yok
1 ise Harici kesme geldi
Bit 0 ( RBIF ) : PORTB "değişiklik" bayrağı
0 = RB4,RB5,RB6, RB7' den herhangi birinde değişim yok.
1 = RB4,RB5,RB6, RB7' den az birinde değişim var.
10.2. KESME KAYNAKLARI NELERDİR?
PIC16F84' de kesme 4 farklı kaynaktan gelebilir :
1 ) Harici kesme ( RB0 / INT' den gelen )
2 ) TMR0' ın h'FF' den h'00' a geçişi sırasında oluşan
3 ) PORTB' de ( RB4, ...., RB7 )' deki lojik seviye değişiminden dolayı meydana gelen
4 ) EEPROM hafızasına yazma işlemi bitince gelen
Bu kesme türlerini biraz daha detaylı bir şekilde inceleyelim:
1 ) Harici Kesmeler: Harici bir kesme oluşturabilmek için;
a ) PIC16F84’ün harici kesme ucu RB0/INT giriş olarak yönlenmelidir.
b ) INTCON' da Bit 4 (INTE) bayrağı (örn; BSF komutu ile) 1 yapılmalıdır. Böylece
gelecek harici kesmeye izin verilmiş olur. Ancak GIE de (1) yapılarak bu iznin geçerli olması,
kesmenin algılanması sağlanmalıdır.
c ) Burada RB0/INT ucundan (girişinden) uygulanacak işaretin hangi kenarla etkili olacağı
belirlenmelidir. Bunun için veri hafızasında Bank1' de h'81' adresinde bulunan OPTION_REG
özel fonksiyon registerinin 6. biti (INTEDG) ayarlanmalıdır. Bu bit ;
INTEDG = 0 yapılırsa (örn; BCF komutu ile ) düşen kenar,
INTEDG = 1 yapılırsa (örn; BSF komutu ile) yükselen kenar etkin olur ve ancak bu
geçiş ile kesme meydana gelir.
d ) Harici kesmenin oluşmasından sonra INTCON registerinin 1. biti (INTF) bayrağı
PIC16F84 tarafından "1" yapılarak bize bildirilir. Bu suretle gidilecek kesme alt programında bu
bayrak tekrar programcı tarafından INTF = 0 yapılmalıdır.
e ) Kesme altprogramı içinde PIC tarafından otomatik olarak GIE=0 yapıldığından 2. bir
kesmeye izin verilmemiş olur.
19
f ) Kesme altprogramı biterken istenirse yeni kesmelere izin vermek veya vermemek için
programcı tarafından INTE = 1 ya da 0 yapılabilir ya da RETFIE komutu ile ana
programa dönüldükten sonra bu işlem gerçekleştirilebilir. Yeni bir kesmenin algılanması
için ana programa dönülürken tekrar zaten PIC tarafından GIE=1 yapılmaktadır.
2 ) TMRO Sayıcı Kesmesi: Yine özel fonksiyon registerleri arasında h'01' adresinde
(Bank 0' da) bulunan TMR0 denilen sayıcının h'FF' dan h'00' a geçişi esnasında oluşur. Bu kesme
için INTCON' da 5. bit olan T0IE=1 ve 7. bit olan GIE=1 yapılmalıdır. Söz konusu h'FF' dan h'00'
a geçiş ile PIC tarafından T0IF=1 yapılır. Harici kesmeye benzer şekilde bu bayrak kesme
altprogramı içinde sıfırlanır. Ana programa RETFIE komutu ile dönüldükten sonra yeni kesme
kabul edilmek isteniyorsa programcı tarafından T0IE=1, istenmiyorsa T0IE=0 yapılabilir. Bu
kesme, sayıcılar/zamanlayıcılar incelenirken detaylı olarak açıklanacaktır.
3 ) PORTB' deki Seviye Değişikliği Kesmesi: RB4, RB5, RB6, RB7 bitlerinin herhangi
birinde bir değişiklik ( 0' dan 1' e ya da 1' den 0' a ) meydana gelirse INTCON registerdeki bit0,
RBIF=1 olur. Bu kesme istenirse INTCON' da 3. bit RBIE=0 yapılarak iptal edilebilir ya da
RBIE =1 ile bu kesmeye izin verilebilir.
Bu kesme algılandıktan sonra RBIF = 0 vermek suretiyle programcı tarafından
silinmelidir. Eğer birden fazla bitten (RB7 veya RB6 gibi) kesme gelme ihtimali varsa RBIF
silinmeden önce PORTB okunarak kesmenin nereden geldiği tespit edilmelidir. RB0, ...., RB3'
deki değişikliklerden kesme oluşturmak mümkün değildir.
4) EEPROM yazma işlemi tamamlandı kesmesi : Bu derste incelenmeyecektir.
10.3. KESME ALT PROGRAMLARI
Bir kesme oluşup kesme alt programına atlanınca INTCON registerinin 7. biti PIC
tarafından otomatik olarak (GIE)=0 yapılır. Bu nedenle kesme altprogramında yeni kesme
oluşması mümkün olmaz. Kesme alt programı çalıştıktan sonra RETFIE (=kesme alt
programından dön) komutu ile tekrar otomatik olarak (GIE) = 1 olur. Artık ana programa
dönülmüş ve istenirse yeni kesme alınmaya hazır hale gelinmiştir.

Kesme Sırasında W ve Status Registerlerinin Saklanması:
Yukarıda belirtilen 4 kesme kaynaklardan biri kesme oluşturursa PC (Program Sayacı)' nın
değeri STACK adı verilen bir registere otomatik olarak kaydedilir. Bu sayede RETFIE komutu
sonrası kesmenin oluştuğu ana programdaki komutun bir altındaki komuta geri dönebilir. Bu
esnada W ve STATUS registerlerinin korunması gerekebilir. Böyle bir durumda kesme alt
programının başında bu registerler saklanıp sonunda tekrar geri yüklenmelidir.
Bu amaçla kullanılabilecek komutları içeren bir kesme alt programı yazarsak ;
ORG
GOTO
; Kesme vektörü hep '004' dür.
; Bu anda W = 0F, STATUS = 43 olsun.
h'004'
Kesme_altprog
..........
Kesme_altprog MOVWF
SAKLA1
SWAPF
STATUS, W
MOVWF
SAKLA2
; SAKLA1 = 0F = W’ye yazılarak korundu.
; STATUS  SAKLA2 = 34 olarak saklanıyor
20
; Kesme alt programının
;asıl komutları buraya yazılacaktır.
; Önceden saklanan ana programa ait W ve STATUS değerleri geri yükleniyor.
SWAPF
SAKLA2, W ; W = 43
MOVWF
STATUS
; STATUS = 43
SWAPF
SAKLA1, F ; SAKLA1 = F0
SWAPF
SAKLA1, W ; W = 0F
RETFIE
Burada STATUS' un SWAP komutu kullanarak saklanması ve tekrar SWAP yapılıp geri
gönderilmesi, MOVF komutunun Z bayrağını etkilemesi dolayısıyla STATUS' un değişimini
engellemek içindir. Dikkat edilirse SWAP komutu ile birlikte W ve STATUS için kullanılan
SAKLA1 ve SAKLA2 geçici depolama registerleri ile bu değişim engellenmiştir.
Not: Bu W ve STATUS değerleri için alt program giriş ve çıkışında değişiklik olmadığını
register değerlerini çizerek gösteriniz.
Kesme kullanırken normal olarak;
ORG
GOTO
ORG
GOTO
h'000'
BASLA
h'004'
INT_ALTPR
BASLA
Ana Program
INT-ALTPR
Kesme Alt Programı
RETFIE
END
yapılır. Böylece kesme programının nerede olduğu (hangi etiketle başladığı) anlaşılır.
Kesme oluştuğu anda programın kesme vektörüne yani h '004' e atlaması 3 - 4 peryot
gecikme getirir. Yapılan işte zamanlama hassas ise buna dikkat edilmelidir.
Örnek : Aşağıda verilen devrede PIC16F84' ün RB0/INT port bitine bütona basılmasıyla
uygulanacak (1) den (0) a inen kenar ile bu portun 4. ve 5. bitlerinin tersini alan bir program
parçasını kesme alt programı kullanarak yazınız. (Harici Kesme uygulaması)
21
Çözüm:
BASLA
DONGU
ORG
GOTO
ORG
GOTO
h'000'
BASLA
;Ana program normal olarak h’000’ dan başlasın.
h'004'
KESME_ALTP ;Kesme altprogramı adresi daima h’004’e yazılır.
BSF
MOVLW
MOVWF
BCF
BCF
BCF
BSF
BSF
GOTO
...........
...........
STATUS, 5
h'0000 0001'
TRISB
OPTION _REG,6
STATUS, 5
INTCON, 1
INTCON, 7
INTCON, 4
DONGU
; Bank 1' e geç
INTCON, 1
h'0011 0000'
PORTB, F
; Harici Kesme bayrağını (INTF) sil.
; W ‘ye 4.ve 5. bitlerin tersini alacak maskeyi yaz
; PORTB yi W ile özel VEYA işlemine
; tâbi tut. Sonucu yine PORTB ‘ ye yaz.
; Kesme alt programından dön.
KESME_ALTP BCF
MOVLW
XORLW
; RB0 ‘ı kesme için giriş yap
; INTEDG=0, düşen kenar ile kesme oluşsun.
; Bank 0' a geç
; Önceki bayrağı temizle
; Genel kesme izin ver
; RB0/INT girişi ile harici kesmeye izni ver
; Bu satırda (komutta) kesme bekle.
RETFIE
END
*******************
NOT: Derslerde işlenen kısım Finalde geçerli olacaktır…
Faydalanılan Kaynaklar :
1234567-
Mikroişlemciler Ders Notları 1 - 2 (6502) , Doç. Dr. Hakan ÜNDİL
Mikrodenetleyiciler ve PIC Programlama, Orhan ALTINBAŞ
PIC Mikrodenetleyiciler , Fevzi AKAR – Mustafa YAĞIMLI
Adım Adım PIC Programlama, Yaşar BODUR
PIC Microcontroller Uygulama Devreleri, Gökhan DİNÇER
Microchip PIC16F8X ve PIC16F877 PIC Data Sheet,
www.microchip.com web adresi.
EKİ : KOMUT ve REGISTER TABLOSU !
22

Benzer belgeler

PIC2_NOTLARI_14-15_FINAL_Kısmı

PIC2_NOTLARI_14-15_FINAL_Kısmı BÖLÜM 9 DÖNÜŞÜM TABLOLARI (LOOKUP TABLEs) Dönüşüm tabloları bir kodu bir başka koda dönüştürmek için kullanılır. Örnek olarak belli bir sayı ile o sayıyı göstergede yakmak için göstergeye uygulanm...

Detaylı

Slayt 1 - cobanoglu

Slayt 1 - cobanoglu PORTB’ ye yazın. Daha sonra Program parçası GECIKME alt programına giderek neticenin bu kez üst-byte’ını UST’ adlı registere gönderip yine GECIKME’ ye gidecek ve tekrar en başa dönerek işlemleri sü...

Detaylı

Slayt 1 - cobanoglu

Slayt 1 - cobanoglu PCL’nin o anki değerine ADDWF ile istediğimiz sayıyı ekleriz. Kullanım Şekli: ADDWF PCL, F İstediğimiz değeri geri döndürecek komut ise RETLW (RETLW h’3F’ gibi) dir. RETLW komutu ile alt alta yazıl...

Detaylı

PIC_NOTLARI_1516_GUZ_Vize

PIC_NOTLARI_1516_GUZ_Vize Bu komut da XORLW komutuna benzer olup burada asıl sayı W registerde, maske ise file registerde bulunur. İşlem sırası önemli olmadığı için maskeyi W’ya asıl sayıyı File Registere yazmak da mümkündü...

Detaylı

www.muhendisiz.net

www.muhendisiz.net Sonucu bulmak için ise, W deki sayı (3C)16 verildiğine göre bu sayının 2.,3. ve 6. bitlerinin sıfırlanmış halini yazmamız gerekir. O da (30)16 olarak elde edilecektir. [ 3C de 6. bit zaten 0 olduğu...

Detaylı