mİkrodenetleyİcİler i ders notlari ‘nın devamıdır. sadece ... · 1 mİkro denetleyİcİler...
TRANSCRIPT
1
MİKRO DENETLEYİCİLER II
DERS NOTLARI Prof. Dr. Hakan Ündil
2015-2016 Bahar-Vize
(MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. Sadece VİZE için olan kısımdır)
5 . BÖLÜM - DÖNGÜ (ÇEVRİM) ve Z BAYRAĞI
5.1. Döngü Kullanmak
Bazen belli işlem ya da işlemlerin belirli sayıda tekrarlanması istenebilir. Böyle bir durumda
örnek olarak SAYAC isimli bir file register kullanılabilir. Genellikle tekrar sayısı (SAYAC)’ a
yüklendikten sonra her döngüde (SAYAC) 1 azaltılarak SAYAC = h’00’ a ulaşılana kadar döngü devamı
ettirilir. SAYAC = h’00’ olduğunda program döngüden çıkarak yoluna devam eder.
Bu amaçla DECFSZ komutu kullanılabilir. Bu komut her icra edildiğinde ilgili file register
(burada SAYAC) 1 azaltılır ve SAYAC = h’00’ olunca bir sonraki komuta atlanır. Aksi halde
(SAYAC h’00’ ise) DECFSZ komutundan hemen sonraki (sıradaki) komut icra edilir.
Bu komutun formatı (kullanılış biçimi): (File Register yerine SAYAC kullanılmıştır)
DECFSZ SAYAC , d W yada F şeklindedir.
Aşağıdaki örnek program parçası ve akış diyagramında PORTB ‘nin ve SAYAC’ ın daha önce
tanımlandığı farz edilmiştir. Önce SAYAC’a h’FF’ sayısı yüklenmiş ve SAYAC azaltılmaya başlanmıştır.
SAYAC= h’00’ olana kadar SAYAC=00 mı? sorusuna “HAYIR” cevabı alınacak ve azaltma devam
edecektir. Döngü bitince de PORTB’ ye ( FF ) yüklenmektedir.
.
Program Parçası
. MOVLW h’FF’
MOVWF SAYAC ; SAYAC’a FF yükle
TEKRAR DECFSZ SAYAC, F ; SAYAC’ı 1 azalt
GOTO TEKRAR ; SAYAC=0 değilse
MOVLW h‘FF’ ;SAYAC=0 ise
MOVWF PORTB ;PORTB ye W yi yaz
.
.
Örnek : PORTA’ nın 2. bitine (RA2) bağlı butona 10 kere basıldıktan sonra PORTB’ nin 0. bitine
(RB0) bağlı LED’ in yakılması isteniyor (Her butona basılması arasında 25 komut peryodu
beklenmesi arzu edilmektedir. Böylelikle butondan doğan parazitler engellenmiş ve bir basışta 10
2
STATUS
Register
2
Z
0
C Elde bayrağı
Sıfır bayrağı
kere basılmış gibi sayılmasının önüne geçilmiş olacaktır. Bekleme süresi yetersiz ise arttırılabilir).
Gerekli program parçasını PIC 16F84 için assembly dili ile yazınız.
Program Parçası
MOVLW d‘10’
MOVWF SAYAC ; SAYAC’a d’10’ sayısı yaz.
TEST BTFSC PORTA, 2 ; RA2= 0 mı?
GOTO TEST ; Değilse TEST etmeye devam et
NOP ; İşlem yapma, çok sayıda NOP peşpeşe yazılacak
.
.
. ;(NOP : İşlem yapma,1 peryot bekle komutudur )
.
NOP ; Üstte toplam 25 adet NOP komutu var.
DECFSZ SAYAC, F ; SAYAC’ı 1 azalt sonuç (00) mı?
GOTO TEST ; Değilse TEST ‘e git
BSF PORTB, 0 ; Evetse, PORTB nin 0. bitini 1 yap.
...
Yukarıdaki örnekte 25 adet NOP (İşlem yapma) kullanılmıştır. Böyle bir sistemde bütona iki
basma arasındaki bekleme süresi arttırılmak istenirse bu sayı arttırılır. Ancak bu durumda program
hafızasının gereksiz dolması gibi bir sorunla karşılaşırız. Bunun yerine ilerde incelenecek zaman
geciktirme programları kullanılır.
5.2. Karşılaştırma İşlemi ve Çıkarma Komutları
Döngüde kullanılan SAYAC veya benzeri bir file register her zaman azalan yönde çalışmaz. Bazı
uygulamalarda SAYAC’ın artan yönde sayması istenir. SAYAC’ın “1” arttırılması için INCF komutu
kullanılabilir. Her döngüde SAYAC değeri arttıkça istenen SAYAC değerine ulaşılıp ulaşmadığını
belirlemek için istenen sayı ile SAYAC değeri çıkartılarak karşılaştırılır. Çıkartma sonucu olan (Fark)
sıfıra eşit olduğunda yani eşitlik sağlanınca döngü sona erdirilir.
Bu işlemde çıkartma komutu gerektiğinden önce 2 adet olan çıkartma komutlarını inceleyelim.
Bunun için de STATUS registerinde önemli 2 bayrak olan Z ve C bayraklarına göz atalım.
STATUS’un 2. biti olan Z bayrağı, bir işlemin sonucu sıfır olduğunda (Z=1) olan bir
bayraktır. Aksi halde yani sonuç sıfırdan farklı ise (Z=0) olur.
STATUS’un 0. biti olan C bayrağı, elde bayrağı olarak adlandırılırken çıkarma
işlemlerinde borç yoksa bu bayrak (1), borç varsa (0) değerini alır.
SUBWF (Çıkarma) Komutunu haturlayalım…
Bu komut, o andaki file registerinin içeriğini W registerinden çıkarır ve sonucu W yada file
registerine yazar. Komut Formatı;
3
SUBWF File registeri , W yada f şeklindedir.
Çıkarma sonucunda Z ve C bayraklarının değerleri çıkartılan iki sayı arasındaki ilişki bilgisini taşır.
Daha sonra bu bayrakların aldıkları değerlere göre programda dallanma gerçekleştirilebilir.
(File registeri – W) şeklindeki çıkartma işlemi için muhtemel durumlar şu şekilde
verilebilir :
File registeri > W ise Z = 0 ve C = 1
File registeri = W ise Z = 1 ve C = 1
File registeri < W ise Z = 0 ve C = 0
Örnek olarak SAYAC adlı file registeri sıfırladıktan sonra (09) olana kadar birer arttıran Z
bayrağını yani iki sayının eşitliğini test eden TEKRAR etiketli bir döngü düzenleyelim:
Program Parçası
CLRF SAYAC ; SAYAC’ı sıfırla
TEKRAR INCF SAYAC, F ; SAYAC ‘ı 1 arttır
MOVLW h‘09’
SUBWF SAYAC, W ; SAYAC’dan W yi çıkar
BTFSS STATUS, 2 ; Z bayrağı 1 mı?
GOTO TEKRAR ; Değilse TEKRAR ‘a git.
Program parçasındaki SAYAC değeri o ana kadar ki arttırma sayısını belirtir. Burada çıkarma
komutu olan SUBWF kullanılarak SAYAC değerinden aküye yüklenmiş (09) sayısı çıkartıldığında
sonucun durumuna göre STATUS registerinde bulunan Z ( Sıfır biti=bayrağı ) ve C ( Elde biti=bayrağı )
etkilenir. SAYAC= 09 olduğunda yani fark sıfır ise (sıfır bayrağı olan) Z=1 olacaktır. Burada C
bayrağına ihtiyaç yoktur.
Yukarıdaki programda kullanılan SUBWF SAYAC, W komutu ile SAYAC’tan W
çıkarılarak sonuç W ‘ye yazılır , Ancak bu program parçasında sonucun yani farkın ne
olduğu bizi ilgilendirmemektedir. Biz bu farkın sıfır olup olmadığı ile ilgilenmekteyiz .
Bir başka bir örnek olarak aşağıdaki program parçası ile önce HAFIZA adı verilen ve daha önce
tanımlanmış bir adrese h‘35’ sayısını yazalım. Bu sayı akümülatöre (W’ ye) yüklenen sayıdan küçük
yada büyük ise (eşit değilse, Z=0 ise) PORTB’ nin 0. bitini ( RB0=1) yapalım. Aksi takdirde (DEVAM)
etiketine gönderelim.
SAYAC’ ı sıfırla
W h‘09’
SAYAC’ ı 1 arttır
W’ den SAYAC’ı çıkart
Z = 1 mi?
EVET
HAYIR
SON
4
Program parçası
MOVLW h‘35’
MOVWF HAFIZA ; HAFIZA registerine h’35’ yaz
MOVLW (SAYI) ; ( SAYI )’yı Aküye yükle.
SUBWF HAFIZA, W ; HAFIZA’dan W’ yi çıkar
BTFSC STATUS, 2 ; Z=0 mı?
GOTO DEVAM ; Değilse DEVAM’a git
BSF PORTB, 0 ; Evetse RB0=1 yap.
DEVAM ...........
NOT: (SAYI) yerine bir bytelık (h‘28’, h‘35’, h‘4A’ gibi ) çıkarılacak (karşılaştırılacak)
sayılardan 2.sayı yazılacaktır. DEVAM etiketi program parçasının sonunda (çıkışında) yer
almaktadır.
SUBLW (Çıkarma) Komutu:
SUBWF komutuna benzer olup bu komutla sabit sayıdan W ‘nin içeriği çıkarılır. Sonuç yine W
registerine yazılır. Komut formatı aşağıda verilmiştir.
SUBLW k ; Burada k, W’nın çıkarılacağı sabit sayıyı temsil etmektedir.
Örnek olarak bu komutu kullanarak W registerine h‘40’ yazdıktan sonra, h‘50’ sayısından W ’de
bulunan sayıyı çıkartalım. (W deki sayı h’50’ ile karşılaştırılıyor) Z bayrağı ( =0 ) ise PORTB’ nin 3., 4., ve
5. bitlerine (1) , diğerlerine (0) yüklensin. Aksi halde ilerdeki DEVAM adresine dallanmak üzere bir
program parçası yazalım.
Program parçası
MOVLW h‘40’ ; W’ye h’40’ yükle
SUBLW h‘50’ ; h’50’ den W deki h’40’ ı çıkart.
BTFSC STATUS, 2 ; Z bayrağı = 0 mı? (Sayılar farklı mı?)
GOTO DEVAM ; Değilse (=eşitse) DEVAM adresine git.
MOVLW b‘00111000’ ; C=0 ise PORTB nin istenen bitlerini (1) yap
MOVWF PORTB
DEVAM …….
Örnek : PIC 16F84 için bir program parçası yazarak h‘1A’ sayısından h‘09’ sayısını
çıkarınız ve farkı PORTB’ ye yazınız. STATUS registerinin içeriğini de W’ ye aktarınız.
MOVLW h‘09’
SUBLW h‘1A’ ; h’1A’ sayısından W ‘deki 09 sayısını çıkar
MOVWF PORTB ; Fark PORTB’ ye yazıldı
MOVF STATUS, W ; STATUS Reg.’ i W’ ye aktarıldı
Örnek : (00)16’ dan başlayarak (08)16’ e kadar sayıları (00, 01, 02, ....., 08) (İleri Sayıcı gibi)
PORTB’ ye yazan bir program parçasını PIC16F84 için assembly dilinde yazınız.
CLRF SAYAC ; SAYAC’ı sıfırla
TEKRAR MOVF SAYAC, W ; SAYAC ‘yı W ‘ ye yükle
MOVWF PORTB ; PORTB den yolla
INCF SAYAC, F ; SAYAC’ ı 1 arttır
MOVLW h‘09’
SUBWF SAYAC, W ; (SAYAC – W) ‘i bul ve sonucu W ye yaz
BTFSS STATUS, Z ; Z bayrağı 1 mı?
5
GOTO TEKRAR ; Değilse TEKRAR’ a git.
DEVAM .......... ; Z=1 ise yoluna devam et...
5.3. Zaman Geciktirme Döngüleri
Bazı programlarda hiçbir şey yapmadan GECİKME program bloğu(parçası) ile bir süre beklenmesi
gerektiği daha önce belirtilmişti. Örnek olarak bir tuşa basılıp basılmadığını test etmek için programın bir
süre tuşun basılı kaldığını algılaması/ beklemesi gerekir. Bu maksatla “Zaman Geciktirme Döngüleri”
kullanılır.
5.3.1. Zaman Geciktirme Nasıl Yapılır ?
Zaman geciktirme için ya yazılım ya da donanımsal geciktirme imkanlarından yararlanmak
gerekir. Gecikme sağlamak için Yazılım kullanıldığında her komutun icra süresi bilinmeli ve ona göre
“Toplam Gecikme” hesaplanmalıdır. RC tipi osilatör kullanıldığında bu elemanların sıcaklığa bağlı değer
değiştirilmelerinden dolayı hassas bir gecikme süresi elde etmek mümkün olmaz. Böyle bir durumda
kristal/rezonatör kullanılması şarttır. Çok uzun gecikmeler için CPU’nun verimli çalışması açısından
“Donanım Gecikmesi” kullanılması elverişli olacaktır.
5.3.2. Komut Peryodu Nedir ?
PIC16F84 genellikle 4 MHz’ de çalıştırılır ve bu frekans içerde 4’ e bölünerek f = 1 MHz’ lik
dahili komut frekansı elde edilir. Bu frekans ise 1 (s =mikrosaniye) komut peryoduna (saniyede 1 milyon
komut) karşılık gelir. Bu da bir komutun icra (yürütülme) süresidir.
Ancak bazı komutlar 2 peryotta icra edilir. Bunlar :
GOTO RETFIE
CALL INCFSZ ( Sayaç 0 ise 1 peryot )
RETURN BTFSC ( Test Biti =1 ise 1 peryot )
DECFSZ ( Sayaç 0 ise 1 peryot ) BTFSS ( Test Biti =0 ise 1 peryot )
RETLW Prog. Sayacına veri yazan komutlar
5.3.3. Tek Döngü İle Maksimum ve Minimum Gecikme
Bir SAYAC registeri içine “FF” yazarsak maksimum, “01” yazarsak minimum gecikme elde
edilir. Aşağıdaki programda maksimum gecikme sağlamak için SAYAC’a (FF)16 = (255)10 yüklenmiştir.
Komut Peryot x İcra Sayısı
MOVLW h‘FF’ 1x1
MOVWF SAYAC 1x1
TEKRAR DECFSZ SAYAC, F 1 x 254 + 2
GOTO TEKRAR + 2 x 254
Toplam : 766 komut peryodu
Örnek : 4 MHz bir osilatörden beslenen PIC 16F84’ de 250 s gecikme sağlamak için bir
GECİKME rutini ( program parçası ) yazalım.
sμ1MHz14
MHz4 Bir dahili komut peryodu. Yani bir komut bu sürede yürütülür
6
SAYAC 2
0 mı?
SAYAC 1 h‘FF’
SAYAC 2 h‘FF’
SAYAC 1
0 mı?
EVET
EVET
HAYIR
HAYIR
SAYAC 2’ yi
1 azalt
SAYAC 1’ i
1 azalt
Komut Peryot Sayısı
MOVLW h‘52’ 1
MOVWF SAYAC 1
NOP 1
NOP 1
NOP 1
TEKRAR DECFSZ SAYAC, F 1 x 81 + 2 (h’52’= d’82’ dir)
GOTO TEKRAR + 2 x 81
250 peryot
O halde bu program parçası ile 1s x 250 = 250 s gecikme süresi elde edilmiş olur.
5.3.4. İçiçe İki Döngü İle Daha Fazla Gecikme
Tek döngüde SAYAC (FF) ile yüklense bile 766 peryot gecikme sağlanmakta idi. Bu süre az
gelebilir. Bu durumda içiçe 2 yada daha fazla döngü kullanılabilir. Bu amaçla kullanılacak bir çift döngü
rutin için akış diyagramı ve programı yapalım ( süre maximum olsun ).
5.3.5. İçiçe iki Döngü kullanan bir Akış Diyagramı ve Program Parçası
Akış Diyagramı ve Programı aşağıda verilmiştir. Böyle bir program için elde edilebilecek yaklaşık
Gecikme süresi de aşağıdaki tabloda verilmiştir.
Komut İcra sayısı x Komut Peryodu
MOVLW h‘FF’ 1 MOVWF SAYAC 1 1
TEKRAR1 MOVLW h‘FF’ 1 x 255
MOVWF SAYAC 2 1 x 255
TEKRAR2 DECFSZ SAYAC2, F 1 x 255 x 255
7
CALL ALTP
END
STACK REG
RETURN
İlk Komut
Ana
Program
Alt
Program
GOTO TEKRAR2 2 x 255 x 255
DECFSZ SAYAC1, F 1 x 255
GOTO TEKRAR1 2 x 255
Toplam : 196606 peryot
1 s (mikro saniye) dahili komut peryodu için 196606 s = 0,196 saniye ~ = 0.2 saniyelik
yaklaşık gecikme elde edilir. SAYAC1 ile SAYAC2 farklı da olabilir. Bu durumda (255)
yerine o sayının karşılığı olan desimal sayı hesaba katılmalıdır.
Daha fazla gecikme elde etmek için bir SAYAC daha (SAYAC3 gibi) tanımlanarak bu zaman
geciktirme döngüsünün en dışına içiçe iki döngüde olduğu gibi ekleme yapılabilir. Fakat bu tarzdaki çok
uzun döngüler mikroişlemciyi meşgul edeceğinden asıl yapılması gereken diğer işlemler aksayacaktır. Bu
durumda donanım gecikmesi (timer) kullanmak tercih edilir.
********
6. BÖLÜM - ALT PROGRAMLAR
Program içerisinde birden fazla kullanılacak rutinler ( program parçaları ) varsa bunlar tekrar
yazılmaz. Bu suretle hem Program Hafızası tasarrufu sağlanır hem de programın okunabilirliği arttırılır.
Bunun için tekrar kullanılacak program parçaları ALTPROGRAM olarak düzenlenir . Ana (asıl)
Programdan Alt Programa CALL komutu ile gidilir, RETURN komutu ile ana programdaki CALL
komutunu hemen takip eden komuta geri dönülür. Dönüşün PIC içersinde gerçekleştirilebilmesi için
CALL komutuyla atlanırken geri dönüş adresinin saklanması gerekir. Bunun için STACK REGISTER
denilen özel bir registerden faydalanılır. Bu işlem otomatik yapıldığı için programcının bu işlemle ayrıca
ilgilenmesi gerekmez.
6.1. Bir Alt Programın Çağrılması ile PIC İçersindeki Olaylar
Bir alt programın çalışmasını şematik çizersek ve numaralanmış olarak gerçekleşen
işlemleri gösterirsek :
Bu işlemleri sırayla yazarsak;
1. Ana program başlangıçtan itibaren çalışır.
2. CALL _ ALTP komutu ile Alt programın ilk komutuna atlanır.
3. Ana programdan ayrılma adresi STACK Registere otomatik olarak saklanır.
4. Alt program ilk komuttan itibaren icra edilir.
8
16F84’ ü
tanıt, PORTB
çıkış
BAŞLA
PORTB’ yi sıfırla
PORTB h‘FF’
CALL GECİKME
CALL GECİKME
5. RETURN komutu ile karşılaşınca Alt programın bittiği anlaşılır ve Ana programda kaldığımız
yere geri dönülür.
6. STACK Registerde saklanmış ayrılma adresi alınır.
7. Ana program devam eder ve normal olarak END komutu ile son bulur.
şeklinde Alt Programa ait aşamalar elde edilir. Burada Programcı sadece CALL komutunu ve alt programı
yazmak ve bunların isimlerinin (etiketin) aynı olmasını sağlamakla yükümlüdür. Alt Program sonuna
RETURN yazılması, tüm programın (ana ve alt Programın) en altında END komutu bulunması zorunludur.
Diğer yukarıda sıralanan işlemler zaten PIC tarafından otomatik olarak yapılmaktadır.
6.2. Altprogramlı Program Parçası Örnekleri
Örnek : Bir çıkartma işlemi için ana programda 2. sayı PORTA ve akümülatöre alınacak daha
sonra altprogram çağrılıp burada PORTB deki 1. sayıdan 2. sayı çıkarılarak tekrar ana programa
dönülecektir ve sonuç tekrar PORTB ye yüklenecektir. Gerekli Program parçası ile altprogramı
yazınız.
Program Parçası CIKART AltProgramı
MOVF PORTA,W CIKART SUBWF PORTB,W
CALL CIKART RETURN
MOVWF PORTB (Altprogram END komutundan önce yer
almalıdır.)
Örnek : Bir AltProgram şeklinde bir Zaman Geciktirme Döngüsü kullanarak PORTB’ye bağlı
LED’lerin tamamını belli aralıklarla yakıp söndüren bir Program Parçası yazınız.
Program Parçası GECIKME Altprogramı
MOVLW h’00’ GECIKME MOVLW h’FF’
MOVWF PORTB MOVWF SAYAC1
CALL GECIKME DONGU1 MOVLW h’FF’
MOVLW h’FF’ MOVWF SAYAC2
MOVWF PORTB DONGU2 DECFSZ SAYAC2,F
CALL GECIKME GOTO DONGU2
GOTO TEKRAR DECFSZ SAYAC1,F
GOTO DONGU1
(Altprogram END komutundan önce yer almalıdır.)
Program Örneği: Gecikme altprogramı kullanarak Port B’ ye bağlı tüm LED’ leri yakıp söndüren
bir program için akış diyagramı çizerek gerekli assembly programını PIC 16F84 için yapınız.
;PROGRAM.ASM 15 / 10 / 2009
LIST P = 16F84
INCLUDE “ P16F84.INC”
SAYAC1 EQU h‘0C’
SAYAC2 EQU h‘0D’
BSF STATUS,5
CLRF TRISB
BCF STATUS,5
DEVAM MOVLW h‘00’
MOVWF PORTB
CALL GECİKME
MOVLW h‘FF’
MOWF PORTB
9
CALL GECİKME
GOTO DEVAM
GECİKME MOVLW h‘FF’
MOWF SAYAC1
TEKRAR1 MOWF SAYAC2
TEKRAR2 DECFSZ SAYAC2, F
GOTO TEKRAR2
DECFSZ SAYAC1, F
GOTO TEKRAR1
RETURN
END
BÖLÜM 7 - 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 (2
n =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;
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…
NOT: 3) İş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.
10
7.1. 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
File registere yada W registere yazar.
Örn: ADDWF MEM, F ; W ile MEM registeri toplanır,
sonuç tekrar MEM’ e yazılır.
Çeşitli Hex. (16 ‘lı tabanda) Toplama İşlemleri:
1) h’09’ 2) h’03’ 3) h’F8’ 4) h’FE’
h’DE’ h’FB’ h’08’ h’08’
h’E7’ h’FE’ 1 h’00’ 1 h’06’
C Bayrağı : 0 oldu. C Bayrağı : 0 oldu. C Bayrağı : 1 oldu C Bayrağı :1 oldu
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 h’5D’ ; h’5D’ yi W ye yükle
ADDLW h’42’ ; h’42’ ile topla
MOVWF PORTB ;W deki sonuç PORTB ye
İşlemleri yaparsak :
İşlemi hem 16’lı (heksadesimal) hem de 2’li (binary) tabanda yaparsak;
Heks. olarak; Binary olarak;
5D 0101 1101
42 0100 0010
9F 1001 1111
C bayrağı = 0 C bayrağı = 0 (Sonuç FF’den küçük olduğu için)
7.2. 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.
11
1. sayı üst byte (XH) 2. sayı üst byte (YH)
1. sayı alt byte (XL)
2. sayı alt byte (YL)
Ö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:
Ö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ı 32 A6
Y. sayısı 2E 9C
Önce toplama işlemini yapalım:
Hex. Desimal Binary
32 A6 12966 0011 0010 1010 0110
+ 2E 9C + 11932 + 0010 1110 1001 1100
61 42 24898 0110 0001 0100 0010
Akış Diyagramı Program Parçası
XL EQU h’0C’ ; XL için 1 byte’lık yer ayır.
XH EQU h’0D’ ; XH için 1 byte’lık yer ayır.
YL EQU h’0E’ ; YL için 1 byte’lık yer ayır.
YH EQU h’0F’ ; YH için 1 byte’lık yer ayır.
BASLA MOVLW h’A6’
12
MOVWF XL
MOVLW h’32’
MOVWF XH
MOVLW h’9C’
MOVWF YL
MOVLW h’2E’ ; Verilen değerler X,Y lere yazıldı.
MOVWF YH ; X ve Y byte’ları ayrılan registerler yükle.
TOPLA MOVF XL, W
ADDWF YL, W ; XL ve YL yi topla.
MOVWF PORTB ;Sonucu PORTB ‘ye yaz
BTFSC STATUS, 0 ; C = 0 mı?
INCF XH, F ; Hayırsa XH’ı (1) arttır
CALL GECIKME ;Gecikme alt prog. çağır
MOVF XH, W
ADDWF YH, W ; YH ile XH ‘ı topla.
MOVWF UST ; Sonucu UST ‘e yaz
CALL GECIKME ;Gecikme altprogramını çağır
GOTO BASLA
7.3. 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’08’
h’09’ h’07’
h’FF’ (Binaryde Tümleyen Arit. kullanarak) h’01’
C bayrağı = 0 (sonuç negatif) 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 h’0A’
13
Borç
Hayır
Alt byteları çıkar
Üst byteları çıkar
Evet
(Borç
varmı?)
C = 0 mı?
1. sayının üst byte’ından
(1) çıkar
SUBWF PORTA, W ; PORTA – (0A)
MOVWF PORTB ; Sonuç PORTB ye
İşlem: Hex. Komplement Aritmetiği İle
h’1B’ 0001 1011 0001 1011
h’0A’ 0000 1010 1111 0110
h’11’ 0001 0001
C bayrağı = 1(Borç yok) 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 h’4C’
SUBWF MEM1, F
COMPF MEM1, F ; 0 1, 0 1 koyar.
INCF MEM1 ; 1 arttırır, tabana göre komplement’i(tümleyeni) bulur.
MOVF MEM1, W ; MEM1 ‘i W’ ye alır.
MOVWF PORTB ; sonucu PORTB’ ye yazar.
Hex. Yapalım Binary Yapalım
h’35’ 0011 0101 0011 0101
h’4C’ 0100 1100 1011 0100
h’-17’ 1110 1001 (negatif)
PORTB’ de RB4, RB2, RB1, RB0
bağlı LED’ ler yanacaktır. Tümleyen alınırsa
0001 0111
h’17’(C=0) Cevap: -17
7.4. 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;
Genel bir ‘akış diyagramı parçası’ çizersek :
53 A8 yandaki gibi bir durum ortaya çıkacaktır.
24 F6
2E B2
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.
14
Ö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
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 MEM2L, W
SUBWF MEM1L, F ; MEM1L ‘den MEM2L ‘yi çıkart.
BTFSS STATUS, 0 ; C = 0 mı? (Borç var mı?)
DECF MEM1H, F ; Evetse MEM1H’ dan 1 eksilt
MOVF MEM2H, W ; Hayırsa W MEM2H
SUBWF MEM1H, F ; Üst byte sonucunu yine MEM1H’a yaz.
MOVF MEM1L, W ; W MEM1L
MOVWF PORTB ; Alt byte sonucunu PORTB’ ye
TEST BTFSC PORTA, 0 ; RA0’ a basıldı mı?
GOTO TEST ; Hayırsa TEST’ e git.
MOVF MEM1H, W ; Evetse MEM1H ‘ı W ’ye aktar.
MOVWF PORTB ; Üst byte’ ı PORTB’ ye yükle.
BÖLÜM 8 - LOJİK İŞLEM KOMUTLARI
8.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.
; PROGRAM.ASM
LIST P = 16F84
INCLUDE “ P16F84.INC”
GECİK1 EQU h‘0C’
GECİK2 EQU h‘0D’
BCF STATUS, 0 ; Elde yi sıfırla
15
BASLA
16F84’ ü tanıt
PORTB çıkış
PORTB 01
CALL GECIKME
CALL GECIKME
RLF PORT B
SON
BSF STATUS, 5 ; Bank1’e geç
CLRF TRISB ; PORTB Çıkış
BCF STATUS, 5 ; Bank0’a geç
MOVLW h‘01’
MOVWF PORTB ;PORTB’ ye 01 yaz
CALL GECIKME ; Bekleme yap
CALL GECIKME ; Tekrar Bekleme yap
RLF PORTB,F ; 1 bit sola ötele
BEKLE GOTO BEKLE
GECIKME MOVLF h‘FF’ ; Önceki Gecikme Alt Prog ile aynı
MOVWF GECIK1
DONGU 1 MOVLW h‘FF’
MOVWF GECIK2
DONGU2 DECFSZ GECIK2, F
GOTO DONGU2
DECFSZ GECIK1, F
GOTO DONGU1
RETURN
END
8.2. 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 h‘49’ ; W Registerine (49)16 yükle
MOVWF MEM ; W ‘ yi MEM adresine sakla
RRF MEM, F ; MEM ’ i Sağa bir bit ötele şeklinde olacaktır.
16
0001 1111
HAFIZA1
1110 0000
HAFIZA2
8.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.
MOVLW h‘0F’
MOVWF HAFIZA1
COMF HAFIZA1, W
MOVWF HAFIZA2
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 h‘3F’
MOVWF PORTB
SWAPF PORTB, W
NOT: Sınava Lab.’da yapılan deney de Vize sınavına dahildir…
*********
Faydalanılan Kaynaklar :
1- Mikroişlemciler Ders Notları 1 - 2 (6502) , Doç. Dr. Hakan ÜNDİL
2- Mikrodenetleyiciler ve PIC Programlama, Orhan ALTINBAŞ
3- PIC Mikrodenetleyiciler , Fevzi AKAR – Mustafa YAĞIMLI
4- Adım Adım PIC Programlama, Yaşar BODUR
5- PIC Microcontroller Uygulama Devreleri, Gökhan DİNÇER
6- Microchip PIC16F8X ve PIC16F877 PIC Data Sheet,
7- www.microchip.com web adresi.