· EEM332

EEM332 Mikroişlemciler: PIC Programlama Örnekleri (Hakan Ündil)

EEM332 – Mikroişlemciler · 15.12.2003 · 18.10.2026

Bu yazı, Başkent Üniversitesi EEM332 Mikroişlemciler ders arşivindeki ilgili notları ve uygulamaları bir araya getiriyor (2003–2003). INCLUDE dosyaları, port ayarları, bit testi, LED ve gecikme alt programları. Kaynak: Doç. Dr. Hakan Ündil, Mikroişlemciler ve Mikrodenetleyiciler 1 ders notları, 2003. Belgelerin PDF arşiv kopyaları ve varsa kaynak kodları yazının sonunda ZIP olarak indirilebilir.

Bu içerik üçüncü taraf bir kaynağa aittir; arşiv ve nostalji amacıyla kaynak belirtilerek paylaşılmıştır. Hak sahibinin talebi hâlinde kaldırılır.

help2 (1)

MİKROİŞLEMCİLER VE MİKRODENETLEYİCİLER 1 - DERS NOTLARI (Kısım 3) Doç. Dr. Hakan Ündil

Program Örneği 9 : 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.

Çözüm: ; PROGRAM9 . ASM-----15 / 12 / 2003

LIST       P = 16F84
INCLUDE    “ P16F84.INC”
SAYAC1 EQU          h‘0C’ ;16F84 de genel amaçlı RAM (Veri Hafızasında) ilk adres
SAYAC2 EQU          h‘0D’
BSF         STATUS,5
CLRF        TRISB                             BAŞLA
BCF        STATUS,5
DEVAM
MOVLW      h‘00’                              16F84’ ü
MOVWF      PORTB                            tanıt, PORTB
CALL       GECİKME                              çıkış
MOVLW      h‘FF’

MOWF PORTB

PORTB’ yi sıfırla

CALL       GECİKME
GOTO       DEVAM

GECİKME CALL GECİKME

MOVLW      h‘FF’

MOWF SAYAC1

PORTB h‘FF’

TEKRAR1 MOWF SAYAC2

TEKRAR2 DECFSZ SAYAC2, F

GOTO       TEKRAR2                        CALL GECİKME
DECFSZ     SAYAC1, F
GOTO       TEKRAR1
RETURN
END

Program Örneği 10: PORTA’ nın 0. bitine bağlı ve basıldığında ( 0 ) üreten bir bütona 8 kere basıldıktan sonra yine PORTA’ nın 1. bitine 2 kere basılırsa PORTB’ ye bağlı bütün LED’lerin yanması isteniyor ( Her tuşa basıldıktan sonra GECİKME alt programı kullanılacaktır ). Gerekli akış diyagramını çizerek programı yazınız.

Çözüm: ; PROGRAM10.ASM-------22 / 12 / 2003

LIST        P = 16F84
INCLUDE     “ P16F84.INC”
GECİK1     EQU          h‘0C’
GECİK2     EQU          h‘0D’
SAYAC1     EQU          h‘0E’
SAYAC2     EQU          h‘0F’
CLRF        PORTB         ; PORTB yi sıfırla
BSF         STATUS,5 ;Bank1’ e geç
CLRF        TRISB         ;PORTB çıkış
BSF         TRISA, 0
BSF         TRISA, 1 ;RA0veRA1 Giriş
BCF         STATUS,5 ; Bank0’ a geç
MOVLW      h‘03’
MOVWF       SAYAC1 ; SAYAC1’e 03 yaz
MOVLW       h‘02’

BAŞLA

MOVWF      SAYAC2 ;SAYAC2’ye 02 yaz

16F84’ ü tanıt TEKRAR BTFSC PORTA, 0 ; RA0 = 0 mı? A portu giriş GOTO TEKRAR ;Değilse TEKRAR’a B portu çıkış CALL GECİKME ;Evetse GECIKMEye

DECFSZ     SAYAC1       ;SAYAC1’i 1 azalt

SAYAC1 03 GOTO TEKRAR ; Sonuç 0 değilse SAYAC2 “ 02 DEVAM BTFSC PORTA, 1 ; RA1 = 0 mı?

GOTO       DEVAM         ; Değilse DEVAM’a
CALL      GECİKME ;Evetse GECIKMEye

RA0 = 0 DECFSZ SAYAC2 ; SAYAC2’i 1 azalt HAYIR mı? GOTO DEVAM ;Sonuç 0 değilse EVET MOVLW h‘FF’

MOVWF      PORTB         ;PORTB’ye FF yükle
GECİKME
; GECİKME ALT PROGRAMI
GECİKME

SAYAC1’i 1 azalt MOVLW h‘FF’

MOVWF     GECİK1       ;GECIK1’e FF yükle

DONGU1 MOVLW h‘FF’ SAYAC1 MOVWF GECİK2 ;GECIK2’ye FF yükle 0 mı? HAYIR DONGU2 DECFSZ GECIK2, F ; GECIK2’yi 1 azalt

GOTO      DONGU2 ;Sonuç 0 değilse

EVET DECFSZ GECİK1,F ;GECIK1’i 1 azalt RA1 = 0 GOTO DONGU1 ; DONGU1 ‘e git. HAYIR mı? RETURN ; Alt Programdan dön

END       ; SON
GECİKME

SAYAC2’yi 1 azalt

SAYAC2

0 mı? HAYIR

EVET

PORTB’ ye FF yaz

SON

LOJİK İŞLEM KOMUTLARI

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 11: Bir programla önce B portunun sadece 0. bitini (RB0) 1 yapın. 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.

Çözüm: ; PROGRAM 11 . ASM_ TARİH

LIST        P = 16F84
INCLUDE     “ P16F84.INC”
BASLA
GECİK1   EQU         h‘0C’
GECİK2   EQU         h‘0D’
BCF          STATUS, 0 ; Elde yi sıfırla

16F84’ ü tanıt BSF STATUS, 5 ; Bank1’e geç PORTB çıkış CLRF TRISB ; PORTB Çıkış

BCF         STATUS, 5 ; Bank0’a geç
MOVLW        h‘01’

PORTB 01

MOVWF        PORTB      ;PORTB’ ye 01 yaz
CALL         GECIKME_ALTPROG
CALL GECIKME                  CALL         GECIKME_ALTPROG

BEKLE GOTO BEKLE

CALL GECIKME

GECIKME_ALTPROG ; Önceki Gecikme Alt Prog ile aynı

RLF PORT B
MOVLF                h‘FF’
MOVWF                GECIK1

DONGU 1 MOVLW h‘FF’

SON

MOVWF                GECIK2

DONGU2 DECFSZ GECIK2, F

GOTO                  DONGU2
DECFSZ               GECIK1, F
GOTO                 DONGU1
RETURN
END
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 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.

Program Örneği 12: Önce C bayrağını (1) yapın ve başlangıçta sıfırlanmış PORT B üzerinden birer bit sola kaydırın. Her kaydırma arasında GECIKME alt programına gönderin. C bayrağı tekrar ( 1 ) olunca programı bitirin.

NOT: GECIKME_ALTPROG Gösterilmeyecektir.

Çözüm

; PROGRAM 12.ASM----------Tarih

BAŞLA INCLUDE “PIC16F84.INC”

BSF         STATUS, 5           ; Bank1’e geç
CLRF        TRISB               ; PORTB Çıkış

16F84’ ü tanıt BCF STATUS, 5 ; Bank0’ a geç PORTB çıkış KAYDIR

RLF          PORTB               ; PORTB yi sola kaydır

C 1 CALL GECIKME_ALTPROG

BTFSS        STATUS, 0                ; C bayrağı 1 mi?

PORTB 00 GOTO KAYDIR ; Değilse KAYDIR’a

DONGU

RLF PORTB                   GOTO DONGU       ; Evetse burada bekle
END
CALL GECIKME

C=1 mi?

SON

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 FİLE REGİSTER , d Sonucun gideceği yer ( destination ) ( W yada F yazılır )

şeklindedir. Örnek: HAFIZA1 adlı registere ( 1F )16 yüklendikten sonra bunun tersi olan ( E0 )16 ’ ı HAFIZA2’ ye saklayın. Bunun için gerekli rutini (Program Parçasını) yazın.

Çözüm

HAFIZA1

0001 1111

MOVLW          h‘0F’
MOVWF          HAFIZA1                                       HAFIZA2

COMF HAFIZA1, W

MOVWF          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       FİLE REGİSTER ,                    d         şeklindedir.

Örnek: PORTB’ ye ( 3F ) yazdıktan sonra ilk ve son bitlerin yerini değiştiren ve sonucu W ye yazan Program parçası yazın.

MOVLW          h‘3F’
MOVWF          PORTB
SWAPF          PORTB, W
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ı;

ANDLW              Sabit sayı
ş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 4 3 2 1 0

1 0 1 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

ANDLW                h’B3’                  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]

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ı

MOVLW            b’00101100’ ; W Registerine 2C yükle.
ANDWF            PORTB , F ; PORTB ile W yi AND (VE) işlemine tabi tut
; ve sonucu yine PORTB ye yaz.

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ı:

IORLW Sabit sayı ş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 5 4 3 2 1 0

1 1 1 0 0 0 0 0 = E0 (Sayıda 1 yapılacak bitler 1)

Bu durumda gerekli program parçası (komut)

IORLW b’1110 0000’ 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

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ı

IORWF File Register , d (Sonucun yeri, W ya da F)

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ı

XORLW Sabit Sayı ş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 PORTA ya yazmak için gerekli komutları verin. Bu durumda sonuç ne olur?

MOVLW           h ‘3B’             ;W ye 3b yaz

XORLW b’10101010’ ; maskede 7,5,3,1. bitler 1, yapıldı

MOVWF           PORTA              ; Sonuç PORTA ya 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]

Örnek: PORTA da bulunan bir baytlık sayı (09)16 dan farklı ise A Portu test edilmeye devam edilecek, (09)16 ‘a eşit ise bu sayı PORTB ‘ye yazılsın isteniyor. Gerekli Program Parçası:

MOVLW         h’09’
TEST

XORWF PORTA,W ; W ile PortA ya Lojik EXOR işlemi uygula

BTFSS         STATUS,2       ; Z bayrağı 1 mi?
GOTO          TEST           ; Değilse TEST ‘e git
MOVF          PORTA , W      ; Evetse PortA yı W ye aktar.
MOVWF         PORTB          ; 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 (07) 0000 1001 (09) 0000 1110 (0E) Sonuç 0 ‘dan farklı olduğuna göre test etmeye devam et.

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 adresine atlayan aksi takdirde test etmeye devam eden bir program parçasını IOR türü bir komutla yazın.

TEST
MOVF          PORTA ,W       ; PortA yı W ye kopyala (yaz)

IORLW h’00’ ; W ile 00 arasında Lojik VEYA uygula

BTFSS         STATUS , 2     ; Sonuç=0 mı ( Z=1 mi?)
GOTO          TEST           ; Değilse TEST ‘e git
GOTO          ILERI          ; Evetse ILERI adresine git.

Program Örneği 13 : 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]

; PROGRAM13.ASM-------TARİH
LIST     P=16F84
INCLUDE  “P16F84.INC”
CLRF     PORTB
BSF      STATUS,5
MOVLW    h’FF’
MOVWF    TRISA          ;PortA Giriş
CLRF     TRISB          ;PortB Çıkış
BCF      STATUS,5 ;Bank0 a geç
TEST
MOVLW    b’00011000’ ;Maskeyi W ye

XORWF PORTA,W ;PortA ile EXOR

BTFSS    STATUS,2 ; Z bayrağı 1 mi?
GOTO     TEST           ;Değilse TEST e
MOVLW    h’0F’     ;Evetse W ‘ ye 0F yaz
MOVWF    PORTB          ; PortB ye aktar
END

ÇEŞİTLİ ÖRNEKLER

1) PORTA ‘nın 0. bitine (RA0) Lojik 0 uygulanarak enerji verilen bir PIC16F84’e daha sonra

PORTA ‘nın tamamına (FF)16 uygulanırsa PORTB nin tüm bitleri (1) yapılacak aksi takdirde PORTA

test edilmeye devam edilecektir. Akış diyagramı çizerek gerekli assembly programını yazınız.
; ORNEK1.ASM
LIST           P=16F84
INCLUDE        “P16F84.INC”
CLRF           PORTB
BSF            STATUS,5
MOVLW          h’FF’
MOVWF          TRISA
CLRF           TRISB
BCF            STATUS,5
TEST
BTFSC          PORTA,0 ; RA0=0 mı?
GOTO           TEST       ; Değilse TEST’e
BEKLE

XORWF PORTA,W ; W ile PORTA aynı mı?

BTFSS          STATUS,2 ; Z bayrağı 1 mi?
GOTO           BEKLE          ; Değilse BEKLE ’ye
MOVLW          h’FF’
MOVWF          PORTB          ; Aynıysa PORTB ye FF yaz
END                           ; Son

2) PORTA nın 1. bitine (RA1) 2 kere üstüste bir Lojik devreden (0) uygulandığı takdirde W

Registerine (01)16 yazıp son bulan bir program yazınız. Tuşa basılmalar arasında 10 tane NOP komutunun yaklaşık 255 defa icrası ile elde edilecektir. Gecikmeden hemen sonra ikinci (0) işareti gelmediği halde test işlemine baştan başlanacaktır. (Yani, yeniden iki (0) beklenecektir, Gecikme için Alt Program kullanılmayacaktır.) Gerekli assembly programını yazınız.

;ORNEK2.ASM
LIST               P=16F84
INCLUDE            “P16F84.INC”
SAYAC     EQU                h’0C’       ; SAYAC için 1 bayt yer ayır.
BSF                STATUS,5 ; Bank1 ‘e geç
MOVLW              h’FF’
MOVWF              TRISA       ; PORTA yı Giriş yap
BCF                STATUS,5 ; Bank0 ‘a geç
TEST
BTFSC              PORTA,1        ; RA1=0 mı?
GOTO               TEST           ; Değilse TEST ‘e git
MOVLW              h’FF’          ; Evetse W ‘ye FF yükle
MOVWF              SAYAC          ; Sayaca W deki FF sayısını yaz
GECIKME
NOP
NOP
NOP
.

. .

NOP                          ; 10 tane NOP komutu
DECFSZ         SAYAC,F       ; Sayacı 1 azalt
GOTO           GECIKME       ; SAYAC sıfırdan farklıysa GECIKME’ye
BTFSC          PORTA,1       ; SAYAC sıfırsa, tekrar RA1=0 mı? bak
GOTO           TEST          ; Değilse TEST ‘e git, yeniden iki 0 bekle
MOVLW          h’01’         ; İstenen (01) sayısını W ‘ye yükle
END                          ; Son

3) PORTA ‘da bulunan 8 bitlik (1 baytlık) sayı 2 kere sola ötelendikten sonra ortaya çıkan sayı

(6C)16 ise PORTB ‘ye (01) ; aksi takdirde yine PORTB ‘ye (02) yazan bir programı assembly dilinde yazınız.

NOT: Başlangıçta C bayrağı (0) yapılacaktır.
;ORNEK3.ASM
LIST            P=16F84
INCLUDE         “P16F84.INC”
BSF             STATUS,5
MOVLW           h’FF’
MOVWF           TRISA       ; PortA Giriş
CLRF            TRISB       ; PortB Çıkış
BCF             STATUS,5 ; Bank0 ‘a geç
BCF             STATUS,0 ; C Bayrağı sıfır yapıldı.
RLF             PORTA,F     ; PortA ‘yı 1 bit sola ötele
RLF             PORTA,F     ; PortA ‘yı 1 bit (kere daha) sola ötele
MOVLW           h’FF’       ; W registerine FF yükle

XORWF PORTA,W ; W deki (FF) ile PortA daki sayı aynı mı?

BTFSS           STATUS,2 ; Z bayrağı 1 ise bir satır atla.
GOTO            GIT         ; Değilse GIT etiketine git.
MOVLW           h’01’

YAZ MOVWF PORTB ; PortB ye (01) yaz

GOTO            SON         ; SON etiketine git.

GIT MOVLW h’02’

MOVWF           PORTB       ; PortB ye (02) yaz

SON END

KAYNAKLAR

1- Mikroişlemciler Ders Notları 1 - 2 (6502) , Doç. Dr. Hakan ÜNDİL 2- Mikrodenetleyiciler ve PIC Programlama, Orhan ALTINBAŞ 3- Adım Adım PIC Programlama, Yaşar BODUR 4- PIC Microcontroller Uygulama Devreleri, Gökhan DİNÇER 5- PIC16F8X, Microchip PIC Data Sheet, (www.microchip.com)

help2 (1): sayfa 1, devre, tablo ve şekiller
help2 (1), sayfa 1.
help2 (1): sayfa 3, devre, tablo ve şekiller
help2 (1), sayfa 3.

help3

MİKROİŞLEMCİLER VE MİKRODENETLEYİCİLER 1 - DERS NOTLARI (Kısım 2) Doç. Dr. Hakan Ündil

INCLUDE Dosyalar

Assembly programlarını yazarken kullanılacak register adreslerini (EQU) komutu ile tanımlamak hem kolaylık sağlamakta hem de anlaşılırlığı arttırmakta idi. Ancak her sefer bu tanımları tekrar tekrar yapmak gereksiz gibidir. Bunun yerine Include Dosya kullanarak aynı isimli her PIC için sabit olan bu tanımları her programda yeniden yapmaktan kurtulmuş oluruz. Mesela; P16F84.INC dosyası PIC16F84 için gerekli tanımları içerir ve MPASM klasörü içinde ( .asm) dosyamızla aynı yerde bulunmalıdır. Include dosyası içinde Register adres tanımlarının yanı sıra RAM bölgesinin tanımı ve Konfigüration Bitleri denilen bazı bitlerin tarifi de yapılmaktadır. Programımız içinde Include Dosyası kullanabilmemiz için (PIC16F84 de) INCLUDE “P16F84.INC” satırını yazmamız yeterlidir.

Include dosya sayesinde (örneğin) STATUS registerinin her bir bitine isim verildiği için:
BCF STATUS, 5                yerine
BCF STATUS, RP0              yazmak mümkündür. Aynı şeyler INTCON, OPTION gibi diğer

registerler içinde geçerlidir. Artık her File Register için kullanılan (EQU) komutları kalktığı için kaynak (assembly) programımız önemli ölçüde kısalıp sadeleşecektir. Sadece Genel Amaçlı RAM bölgesinde kullanacağımız bir değişken için (SAYAC gibi) EQU komutu yazmamız gerekebilecektir.

KONFİGÜRASYON BİTLERİ

Bu bitler PIC’ e gerilim verildiği anda geçerli kuralları belirlemek içindir. Mesela; PIC devremizin saatini (osilatörünü) RC tipi olarak kullanacaksak bunu programda bildirmemiz lazımdır. Benzer şekilde; Watchdog timer’ i devreye sokmak veya çıkarmak, Power-on Reset özelliğini devreye sokmak ya da çıkarmak, Kod korumayı devreye almak veya almamak için bu konfigürasyon bitleri kullanılır. Aslında konfigürasyon bitleri programa yazılmadan programlama esnasında da doğrudan belirlenebilir. Zira bütün programlayıcı programları bu imkanı vermektedir. Eğer program içersinde bir satır olarak Konfigürasyon Bitlerini vermek istersek bu komutun yazılışına ait bir örnek şöyle

verilebilir

_CONFIG _CP_ OFF & WDT_OFF & PWRTE_OFF & RC_OSC

Kod Komut Yok Watchdog Timer OFF Power-on Reset Yok Osilatör Tipi (RC)

& : “ve” demektir. _ : Alt çizgi boşluk yerine kullanılıyor. OFF : Yok, devre dışı anlamına gelir.

VERİ AKTARMA İŞLEMLERİ

PIC’ de veri aktarma (transfer) işlemleri W registeri üzerinden yapılmaktadır.

Örnek

İŞLEM 1 İŞLEM 2

W Reg.

PORTB

PORTA

Bu işlemi yapmak için Gerekli Komutlar

MOVF         PORT A , W    ; (İŞLEM 1) Port A ’ yı W’ ye aktar.
MOVWF        PORT B        ; (İŞLEM 2) W ’yi Port B’ ye aktar.
NOT: PORTA asla doğrudan Port B’ ye aktarılmaz.

Örnek: ‘0F’ sayısını PORT B’ ye yazmak için

MOVLW           h‘OF’
MOVWF           PORT B        yazılmalıdır.

Program Örneği 1: PIC’ e enerji verildiği anda PORTA da basılı bütona karşılık gelen B Portundaki LED’ leri söndüren bir program yazalım.

Çözüm: Önce akış diyagramını çizelim

BAŞLA

NOT: Akış Diyagramında Bank değiştirme işlemi ayrıntıları
gösterilmemiştir.
PIC16F84
tanıt

Port A’ yı Giriş, Port B’ yi Çıkış yap

PORT A’ yı oku

PORT B’ ye gönder

Döngü

SON

Programda INCLUDE komutu kullanalım.

; PROGRAM1.ASM ---------09 / 11 / 2003
LIST    P = 16F84
INCLUDE “P16F84.INC”
CLRF    PORTB
BSF          STATUS,5                    ; BANK 1’ e geç
CLRF         TRISB                       ; B portu tümü çıkış
MOVLW        h‘FF’
MOVWF        TRISA                           ; TRISA’ yı FF yükle, PORTA tamamen Giriş.
BCF          STATUS,5                        ; BANK 0’ a geç
OKU
MOVF    PORTA,W                              ; PORTA’ yı oku sonucu W’ ye yaz
MOVWF   PORTB                                ; W ‘ yi PORT B’ ye yaz (kopyala)
DONGU
GOTO DONGU                                    ; Sonsuz Döngü, GOTO OKU da denebilir.
END                                          ; Son

Pratik Gerçekleştirme İçin Gerekli Adımlar

1) Programı yazıp PROGRAM1.ASM olarak kayıt (save) ediniz.

2) MPASM ile derleme yapıp (PROGRAM1.hex) dosyasını elde ediniz. Konfigürasyon bitlerine

dikkat ederek programlayıcıya PIC’ i yerleştirip programı yükleyiniz. Konfigürasyon bitleri için Osilatör tipi : RC PWRT : ON WDT : OFF CP : OFF yazılabilir.

Not: INCLUDE ( .INC) dosya kullanıldığı için 16F84.INC dosyasının da aynı klasör (directory)

içinde bulunmasını sağlamayı ihmal etmeyin.

3) Devreyi aşağıdaki gibi kurun.

NOT 1: RA0, RA3 girişleri de (+) beslemeye bağlıdır. Yani Lojik 1 almaktadır.
NOT 2: PIC devrelerinde besleme gerilimi (+ 5V) en az 0,1 F bir kondansatör ile şaseye
bağlanmalıdır.

4) Devreye enerji vermeden A1, A2, A4 butonlarına tek yada birlikte basınız.

5) Basılan buton ve yana LED ilişkisini inceleyin.

NOT: Hiçbir butona basılmazsa PortA bitlerinin harici pull-up dirençleri (10k) dolayısıyla LED’ leri

yaktığı görülecektir. Zira A portu normalde (1) olup basınca (0) olmaktadır.

6) Durum değiştirirken önce istediğiniz butonlara basın sonra RESET yapın.

Sonsuz Döngü: PIC16F84 de duraklama komutu olmadığı için Döngü kullanılmaktadır. Programda bekleme yerine yeni butonların durumu okunmak isterse,

DONGU

GOTO DONGU                        komutu yerine
GOTO OKU         yazabiliriz. Artık RESET ‘e gerek kalmadan tuşlara bastıkça LED

değişmelerini göreceğiz.

KARAR İÇİN BİT TEST ETME İŞLEMİ

Herhangi bir register içindeki bir bit BTFSC ve BTFSS komutları ile test edilip sonuca göre ya bir sonraki (sıradaki) satırdan devam edebilir yada bir satır atlanabilir (Program Yönlendirilir).

BTFSC Komutu: Bu komut ingilizcede “File Register bitini test et, bu bit (0) ise bir

sonraki komuta atla” anlamına gelmektedir.

Komut Formatı: 7, 6, 5, 4, 3, 2, 1, 0

BTFSC     File Register           ,

f b (0,........,7 arası bir sayı)

şeklindedir. Bir örnek program parçası için akış diyagramı ile birlikte komutun çalışmasını

inceleyelim:

Bu program parçası PORTA’ nın 3. bitini (RA3) test etmekte bu bit (0) ise PORTB’ nin 5. bitini (1) yapmakta ; aksi halde test etmeye devam etmektedir.

PORTA, TEST

Evet bit 3 BTFSC PORTA, 3 0 mı? GOTO TEST

BSF   PORTB, 5
Hayır

Tekrar Test NOT: PORTA ve PORTB’ nin önceden tanımlandığı kabul edilmiştir.

PORTB’nin 5. bitini (1) yap

BTFSS Komutu: Bu komut ise BTFSC komutuna benzerdir. Ancak, file register bitinin (0)

yerine (1) olduğunu test etmektedir. Bu bit eğer (1) ise komuttan sonraki (sıradaki) komut atlanmakta; değilse (0) ise sıradaki komuttan devam edilmektedir.

Program Örneği 2: ( Yukarıdaki aynı devre için)

A portunun 2. bitindeki bütona basınca B portunun (RB0,.........,RB4) LED’ lerini yakan bir program yazalım.

Çözüm

; PROGRAM 2.ASM------08 / 12 / 2003
LIST     P = 16F84
INCLUDE “P16F84.INC”

BAŞLA CLRF PORTB

BSF     STATUS, 5
CLRF    TRISA
MOVLW   h‘FF’

PIC16F84’ ü

MOVWF   TRISA
tanıt
BCF     STATUS, 5
TEST

B portunu sil BTFSC PORTA, 2

GOTO    TEST
MOVLW h‘0F’

PORT A Giriş,

MOVWF PORTB

PORT B Çıkış yap

END

PORT A’ nın Evet 2.biti 0 mı? Hayır Tekrar test et

RB0,.....RB4

(1) yap

SON

Program Örneği 3: PORTA’ nın 1. bitine (RA1) bağlı bütonuna basılı olarak enerji verildikten sonra PORTB’ deki RB4’ e bağlı (LED4) yakacak, daha sonra bütondan el çekilince PORTB’ nin tüm LED’ lerini yakan bir program yapınız. [Bütona basılı değilken PORTA ‘nın girişlerinin (1) kabul edilmektedir.]

( Devamı Yan Tarafta)

-;PROGRAM3.ASM----08/12/ 2003

LIST     P = 16F84
INCLUDE  “P16F84.INC”
BSF             STATUS, 5
CLRF            TRISB          ; B Portu Çıkış
MOVLW          h‘FF’
MOVWF          TRISA           ;PortA Giriş
BCF            STATUS, 5       ; Bank 0 ‘ a geç
BSF            PORTB, 4        ; RB4 ‘ü 1 yap.
TEST2
BTFSS             PORTA, 1     ;RA1 =1 mi?
GOTO              TEST2        ;Değilse TEST2 ye git
MOVLW             h‘FF’
MOVWF             PORTB        ;PortB ‘nin tümünü 1 yap
DONGU
GOTO             DONGU
END

Program Örneği 4: PORTA’ nın 5. bitine bağlı buton normalde (0) durumunda olup butona basılınca (1) gönderilmektedir. PORTA’ nın 5. bitine 1 (RA5 = 1) gelince B portuna bağlı 8 LED’ in tamamının yanması istenmektedir. Akış diyagramı ile birlikte programı PIC16F84 için yazınız.

Çözüm

BAŞLA

;PROGRAM 4.ASM---11 / 12 / 2003
LIST     P = 16F84

PIC 16F84 INCLUDE “P16F84.INC”

tanıt CLRF PORTB ;B Portunu sil

BSF      STATUS, 5     ; Bank 1 ‘e geç

PORTB’ yi sil CLRF TRISB ; B Portu Çıkış

MOVLW    h‘FF’
MOVWF    TRISA         ; A Portu Giriş

PORTB Çıkış

BCF     STATUS, 5      ; Bank 0 ‘ a geç

PORTA Giriş TEST

BTFSS           PORTA, 5         ;RA5=1 mi?

PORTA EVET GOTO TEST ;Değilse TEST ’e bit 5 MOVLW h‘FF’ 1 mı? MOVWF PORTB ;PortB ‘ye FF yaz.

HAYIR DONGU

Tekrar Test Et GOTO DONGU

END

PORTB nin tüm bitlerini yap

DONGU

SON

Program Örneği 5: Enerji verildiği anda A portunun 3. ve 4. bitleri (RA3, RA4) Lojik 1 olduğuna göre, her ikisine de (0) verildiğinde B portunun 5. , 6. , 7. bitlerini (1), diğerlerini (0) yapan aksi takdirde test etmeye devam eden bir assembly programını PIC16F84 için yazınız. Çözüm: ; PROGRAM 5.ASM----11 / 12 / 2003

LIST     P = 16F84
INCLUDE “P16F84.INC”
CLRF     PORTB
BSF             STATUS, 5         ; Bank 1’ e geç
CLRF            TRISB             ; PORTB tamamı Çıkış
MOVLW           h‘FF’
MOVWF           TRISA             ; PORTA Giriş
BCF             STATUS            ; BANK 0’ a geç
TEST
BTFSC          PORTA, 3          ; PORTA’ nın 3. biti 0 mı?
GOTO           TEST
BTFSC          PORTA, 4          ; PORTA’ nın 4. biti 0 mı?
GOTO           TEST
MOVLW          b‘11100000’       ; W ‘ye h‘E0’ yükle.
MOVWF          PORTB             ; PortB ‘ye (E0) yükle
DONGU
GOTO            DONGU
END

DÖNGÜ KULLANMAK

Bazen belli işlem ya da işlemlerin belirli sayıda tekrarlanması istenebilir. Böyle bir durumda bir register SAYAÇ olarak kullanılır. Genellikle tekrar sayısı ( SAYAÇ)’ a yüklendikten sonra her seferinde ( SAYAÇ ) 1 azaltılarak ( 0 )’ a ulaşılana kadar Döngü devamı ettirilir. Bu amaçla

DECFSZ komutu kullanılması gerekir.

Bu komut her icra edildiğinde bu register ( burada SAYAC ) 1 azaltılır ve SAYAC =0 olunca bir sonraki komuta atlanır. Aksi halde ( SAYAC  0 ise ) DECFSZ komutundan hemen sonraki (sıradaki) komut icra edilir.

Bu komutun formatı

DECFSZ                 Sayaç       ,      d          W yada F       şeklindedir.

Aşağıdaki program parçasında SAYAC’ ın daha önce tanımladığı ve belli bir değerle ( döngü sayısı ) yüklendiği farz edilmiştir. Döngü bitince PORTB’ ye ( FF ) yüklenmektedir.

.

SAYAC = SAYAC - 1 .

TEKRAR

DECFSZ SAYAC, F

SAYAC EVET GOTO TEKRAR

0 mı? MOVLW h‘FF’

HAYIR MOVWF PORTB

Tekrar Et . . Port B’ yi FF yap

Program Örneği 6: PORTA’ nın 2. bitine bağlı butona 10 kere basıldıktan sonra PORTB’ nin 0. bitine bağlı LED’ in yakılması isteniyor ( Her butona basılması arasında 25 peryot beklenmesi arzu edilmektedir. Böylelikle butondan doğan parazitler engellenmiş ve bir basışta 10 kereyi birden saymasının önüne geçilmiş olacaktır ). Gerekli programı PIC 16F84 için assembly dili ile yazınız.

Çözüm: : ; PROGRAM 6.ASM-----20 / 12 / 2003

LIST            P = 16F84
INCLUDE         “P16F84.INC”
SAYAC       EQU             h‘0C’     ; Genel amaçlı RAM ilk adresi
CLRF            PORTB
BSF             STATUS, 5
CLRF            TRISB
MOVLW           h‘FF’
MOVWF           TRISA
BCF             STATUS, 5
BASLA
MOVLW           d‘10’
MOVWF           SAYAC
TEST
BTFSC               PORTA, 2        ; RA2= 0 mı?
GOTO               TEST             ; Değilse TEST etmeye devam et
NOP                                 ; İşlem yapma
.

. ; . ;(NOP : İşlem yapma. 1 peryot bekleme için ) . .

NOP                                 ; Toplam 25 adet NOP komutu var.
DECFSZ               SAYAC, F        ; Sayacı 1 azalt sonuç 0 mı?
GOTO                 TEST            ; Değilse TEST ‘e git
BSF                  PORT B, 0       ; Evetse, PORTB nin 0. bitini 1 yap.
DONGU
GOTO                DONGU
END

Yukarıdaki örnekte 25 adet NOP kullanılmıştır. Böyle bir sistemde iki basma arasında bekleme süresi arttırılmak istenirse bu sayı arttırılır. Ancak bu durumda hafızanın gereksiz dolması gibi bir sorunla karşılaşırız. Bunun yerine 2. bir sayaç tanımlayarak az sayıda (aşağıdaki örnekte 3 tane ) NOP’ un defalarca icrası ( mesela 255 kere) sağlanabilir. Bunun için STATUS ‘un 2. bitini olan

SAYAC 2’ yi FF yap

3 tane NOP komutu

SAYAC2 =

SAYAC2 - 1

HAYIR

SAYAC 2

0 mı?

EVET

SAYAC1 ‘i azaltma ve diğerleri aynı, Dış ta bir çevrim daha var

KARŞILAŞTIRMA İŞLEMİ VE DÖNGÜ

SAYAC her zaman azalan yönde çalışmaz. Her döngüde SAYAC’ ın arttığı durumlarda SAYAC değeri istenen bir sayı ile karşılaştırılmalıdır. Eşitlik sağlanınca döngü sona erdirilir. Örnek olarak ( 09 ) kere tekrarlanan tekrar etiketli bir döngü ( çevrim ) düzenleyelim: ( Program parçası )

............ ............ SAYAC’ ı sıfırla CLRF SAYAC

TEKRAR

SAYAC’ ı 1 arttır INCF SAYAC, F ; SAYAC ‘ı 1 arttır

MOVLW         h‘09’
SUBWF         SAYAC, W              ; SAYACdan W yi çıkart

W h‘09’ BTFSS STATUS, 2 ; Z bayrağı 0 mı?

GOTO          TEKRAR                ; Değilse TEKRAR ‘a git

W’ den SAYACI çıkart DONGU

GOTO         DONGU                  ; Evetse burada   bekle
STATUS
END

HAYIR 2 biti 1 mi?

EVET

SON

Programda SAYAC o ana kadar ki tekrar sayısını belirtir. Çıkarma komutu SUBWF ile STATUS registerinde bulunan Z ( Sıfır bayrağı ) ve C ( Elde bayrağı ) etkilenir.

2 0

STATUS

Register Z C Elde bayrağı

Sıfır bayrağı

SUBWF Komutu:

Bu komut o andaki File registerinin içeriğini W registerinden çıkarır ve sonucu W yada file registerine yazar.Komut Formatı;

SUBWF          File registeri       , W yada f

Çıkarma sonucunda Z ve C bayraklarının değeri çıkartılan iki sayı arasındaki ilişki bilgisini taşır. File registeri > W ise Z = 0 C = 1 File registeri = W ise Z = 1 C = 0 File registeri < W ise Z = 0 C = 0 olur. Bu bayrakların değerine göre dallanma gerçekleştirilir.

SUBLW Komutu:
SUBLW komutuna benzer olup bu komutla sabit sayıdan W nin içeriği çıkarılır. Sonuç W registerine

yazılır. Komut formatı aşağıda verilmiştir.

SUBLW       k         ; Burada k sabit sayıyı temsil etmektedir.

Örnek: Önce HAFIZA adı verilen ve daha önce tanımlanmış bir adreste h‘35’ sayısını yazalım. Bu sayı W’ ye yüklenen sayıdan küçük yada büyük ise PORTB’ nin 0. bitini ( 1 ) yapalım. Aksi takdirde

(GIT) adresine gönderelim. Gerekli program parçası

Çözüm

MOVLW      h‘35’
MOVWF     HAFIZA
MOVLW     ( SAYI )

HAFIZA > SUBWF HAFIZA, W

< SAYI HAFIZA = SAYI

ise BTFSC STATUS, 2 ise

GOTO      GIT
BSF       PORTB, 0
NOT
  • ( SAYI ) yerine h‘28’, h‘35’, h‘4A’ gibi bir baytlık sayı yazılacaktır.
  • GIT adresi programda başka yerdedir.

Örnek: W registerine h‘60’ yazdıktan sonra, h‘50’ sayısından W ’de bulunan sayıyı çıkartalım. C bayrağı ( 0 ) ise PORTB’ nin 3., 4., ve 5. bitlerine ( 1 ) yüklensin. Aksi halde GIT adresine dallanmak üzere bir program parçası yazalım.

Çözüm

MOVLW      h‘60’
SUBWF      h‘50’
BTFSC      STATUS, 0
GOTO       GIT
MOVLW      b‘00111000’
MOVWF      PORTB

Program Örneği 7: PIC 16F84 için bir program 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. Çözüm: ;PROGRAM 7.ASM---08 / 12 / 2003

LIST     P = 16F84
INCLUDE “P16F84.INC”
CLRF     PORTB
BSF     STATUS, 5      ; Bank 1’ e geç
CLRF    TRISB         ; B portu çıkış
BCF     STATUS, 5      ; Bank 1’ e geç
BASLA
MOVLW    h‘09’
SUBLW    h‘1A’         ; 1A sayısından W deki 09 u çıkar
MOVWF    PORTB          ; Fark Port B’ ye yazıldı
MOVF     STATUS, W ; STATUS Reg.’ i W’ ye aktarıldı
DONGU
GOTO     DONGU
END

STATUS REGİSTER

Bu register PIC 16F84 için 0x03 ve 0x83 adreslerinde bulunur. İçerdiği bitler şunlardır

C ( bit 0 ) :Elde Bayrağı denir. ( En soldaki 7. bitte taşma varsa 1 olur ). DC ( bit 1) : Dijit Elde Bayrağı adını alır. Alt 4 bit ( nibble )’ den 5. bite elde ya da borç geçişinde ( 1 ) olur. Z ( bit 2 ) : Sıfır bayrağı denir. Bir aritmetik yada mantık komutun sonucu ( 0 ) ise bu bayrak ( 1 ) olur. PD ( bit 3) :Enerji kesilme biti.

  • PIC’ e enerji verilince yada CLRWDT komutu çalışınca ( 1 ) olur.
  • SLEEP komutu ile ( 0 ) olur.

TD ( bit 4 ) : Zaman doldu biti.

  • PIC’ e enerji verildiğinde CLR WDT ve SLEEP komutu ile ( 1 ) olur.
  • WDT zamanlayıcısı zamanı dolduğu vakit (0) olur.

RP1 – RPO ( bit 6 – bit 5 ) : Bank seçme bitleridir. ( 00 ) yapılırsa Bank 0, ( 01 ) yapılırsa Bank 1 seçilir ( 16F84’ de daima RP1 = 0 kalmalıdır). IRP ( bit 7 ) : PIC 16F84’ de kullanılmaz ve daima ( 0 ) kalmalıdır.

Program Örneği 8: PORT B’ ye ( 00 )16’ dan başlayarak ( 08 )16’ e kadar sayılan ( 00, 01, 02, ........., 08 ) ( sayıcı gibi ) yazan bir program PIC16F84 için assembly dilinde yazınız.

Çözüm: ; PROGRAM8.ASM----08 / 12 / 2003

LIST     P = 16F84
INCLUDE “P16F84.INC”
SAYAC        EQU      h‘0E’         ; Sayaç genel amaçlı RAM de ( 0E ) de olsun.
CLRF     PORTB         ; Bank 1 e geç
BSF      STATUS, 5
CLRF     TRISB           ; Port B tamamı çıkış
BCF      STATUS, 5       ; Bank 0 a geç
BASLA
CLRF           SAYAC
TEKRAR
MOVF          SAYAC, W          ; SAYAC ‘yı W ‘ ye yükle
MOVWF         PORT B           ; Port B den yolla
INCF          SAYAC, F          ; SAYAC’ ı 1 arttır
MOVLW         h‘09’
SUBWF         SAYAC, W          ; ( SAYAC – W ) yi W ye yaz
BTFSS         STATUS, Z        ; Z bayrağı 1 mı?
GOTO          TEKRAR            ; Değilse TEKRAR’ a
DONGU
GOTO          DONGU            ; Bekle
END

ZAMAN GECİKTİRME DÖNGÜLERİ

Bazı programlarda GECİKME bloğu kullanıldığı yani hiçbir şey yapmadan bir süre beklenmesi gerektiği daha önce belirtilmişti. Zaman geciktirme için ya yazılım ya da donanım imkanlarından yararlanmak gerekir. Yazılım kullanıldığında her komutun icra süresi bilinmeli ve ona göre toplam GECİKME 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.

Komut Peryodu: 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 frekans elde edilir. Bu da 1 1 T  1μs bir komut icra süresidir. f 1MHz

Bazı komutlar ise 2 peryotta icra edilir. Bunlar

GOTO                                          RETFIE
CALL                                          INCFSZ ( Sayaç  0 ise 1 peryot )
RETURN                                        BTFSC ( Bit 1 ise 1 peryot )
DECFSZ ( Sayaç  0 ise 1 peryot )             BTFSS ( Bit 1 ise 1 peryot )
RETLW                                         PC’ye (Prog. Sayacına) veri yazan komutla

Tek Döngü İle Maksimum ve Minimum Gecikme Bir sayaç için “FF” yazarsak maksimum, “01” yazarsak minimum gecikme elde edilir. Aşağıdaki programda maksimum gecikme ( N = FF = 255 ) sağlanmaktadır.

Komut Peryot Sayısı

MOVLW                 h‘FF’                                 1
MOVWF                 SAYAC                                 1                 N-1
TEKRAR
DECFSZ                SAYAC, F                              1 x 254 + 2
GOTO                  TEKRAR                               2 x 254

Toplam : 766 peryot

Ö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. 4 MHz 1MHz  1μs Bir dahili komut peryodu

Komut Peryot Sayısı

MOVLW    h‘52’                                     1                             MOVWF

SAYAC 1

NOP                                                  1             ( 56 )16 = ( 82 )16
NOP                                                  1
NOP                                                  1
TEKRAR
DECFSZ   SAYAC, F                                    1 x 81 + 2
GOTO     TEKRAR                                      2 x 81

250 peryot 1 x 250 = 250 s gecikme süresi

İçiçe İki Döngü İle Gecikme 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 ). İçiçe iki Döngü kullanan Program Algoritması ve Programı aşağıda verilmiştir. Böyle bir program için elde edilebilecek yaklaşık Gecikme süresi de tabloda verilmiştir.

SAYAC 1 h‘FF’

SAYAC 2 h‘FF’

HAYIR

SAYAC 2 SAYAC 2’ yi 0 mı? 1 azalt

EVET

HAYIR

SAYAC 1 SAYAC 1’ i 0 mı? 1 azalt

EVET

Komut Peryot Sayısı

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
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 yaklaşık gecikme elde edilir. SAYAC 1 ile SAYAC 2 farklı da olabilir. Bu durumda ( 255 ) yerine o sayının karşılığı olan desimal sayı hesaba katılmalıdır.

ALT PROGRAMLAR

Program içerisinde birden fazla kullanılacak rutinler ( program parçaları ) varsa bunlar tekrar yazılmaz ( Hafıza tasarrufu ! ). Bu durumda tekrar kullanılacak program parçaları ALTPROGRAM olarak düzenlenir . Ana (asıl) Programdan Alt Programa CALL komutu ile gidilir, RETURN komutu ile geri dönülür. 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 bununla ilgilenmesi gerekmez.

Bir alt programın çalışmasını şematik çizersek ve numaralanmış olarak gerçekleşen

işlemleri gösterirsek

Ana CALL ALTP Program STACK REG

END

İlk Komut

Alt Program

RETURN

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.

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 işlemler otomatik olarak yapılmaktadır.

help3: sayfa 2, devre, tablo ve şekiller
help3, sayfa 2.
help3: sayfa 6, devre, tablo ve şekiller
help3, sayfa 6.

eem332-pic-undil.zip

ZIP arşivi · 344 KB · 15.12.2003

⬇ (344 KB)