Logo Background

PIC Assembler Komut Seti ve Macro Kullanımı

  • Written by ElektronikElektronik İlk Yorumu Sen Yaz. Comments
    Last Updated: Eylül 13, 2009

    assembler

    Tabloda assembler dili komut seti gösteriliyor. En solda komutun adı, sağında bu komut için nelerin girilmesi gerektiği (f data belleğinden gelecek bilgiyi, d sonucun yazılacağı byte’ı, b sonucun yazılacağı biti, k ise dönecek sabit sayıyı ifade eder) ve en sağda komutun anlamı yazılıdır.

    ADDWF

    f, d

    W ile f’i toplar.
    ANDWF

    f, d

    W ile f’i VE işlemine tabi tutar.
    CLRF

    f

    f’i sıfırlar.
    CLRW

    W’yi sıfırlar.
    COMF

    f, d

    f’in tersini alır.
    DECF

    f, d

    f’teki sayıyı bir azaltır.
    DECFSZ

    f, d

    f’teki sayıyı bir azaltır, sonuç 0’sa altındaki komutu atlar.
    INCF

    f, d

    f’teki sayıyı bir arttırır.
    INCFSZ

    f, d

    f’teki sayıyı bir arttırır, sonuç 0’sa altındaki komutu atlar.
    IORWF

    f, d

    W ile f’i VEYA işlemine tabi tutar.
    MOVF

    f, d

    f’teki sayıyı hedef gösterilen yere taşır.
    MOVWF

    f

    W’deki sayıyı f’te hedef gösterilen yere taşır.
    NOP

    Bir periyod boyunca hiçbir şey yapmaz.
    RLF

    f, d

    f’teki 8 biti başa Status,0 bitini ekleyerek sola doğru kaydırır, dokuzuncu bitteki değeri sıfırıncı bite atar.
    RRF

    f, d

    f’teki 8 biti başa Status,0 bitini ekleyerek sağa doğru kaydırır, dokuzuncu bitteki değeri sıfırıncı bite atar.
    SUBWF

    f, d

    W’deki sayıyı f’teki sayıdan çıkartır.
    SWAPF

    f, d

    İlk dört bitle son dört bitin yerlerini değiştirir.
    XORWF

    f, d

    W ile f’i XOR işlemine tabi tutar.
    BCF

    f, b

    f’teki bir biti sıfırlar.
    BSF

    f, b

    f’teki bir biti set eder.
    BTFSC

    f, b

    f’teki sayı 0’sa altındaki komutu atlar.
    BTFSS

    f, b

    f’teki sayı 1’se altındaki komutu atlar.
    ADDLW

    k

    Verilen sabit sayıyı W’deki sayıya ekler.
    ANDLW

    k

    Verilen sabit sayıyla W’deki sayıyı VE işlemine tabi tutar.
    CALL

    k

    Alt programı programın içine enjekte eder.
    CLRWDT

    WDT’deki değeri sıfırlar.
    GOTO

    k

    Programda istenilen yere atlar.
    IORLW

    k

    Verilen sabit sayıyla W’deki sayıyı VEYA işlemine tabi tutar.
    MOVLW

    k

    Verilen sabit sayıyı W’nin içine atar.
    RETFIE

    Kesme sonunda yapılan işlemden normal programa dönüş.
    RETLW

    k

    Tablolama sırasında sayı değerini W’ye atar.
    RETURN

    Call’la çağırılan alt programın sonu.
    SLEEP

    Uyku moduna geçiş komutu.
    SUBLW

    k

    W’deki sayıyı verilen sabit sayıdan çıkartır.
    XORLW

    k

    Verilen sabit sayıyla W’deki sayıyı ÖZELVEYA işlemine tabi tutar

    Burada verilen örneklerde görünmese de Assembly dilinde program içinde kullanılan açıklama metinleri önlerine ; işareti eklenerek ayrılırlar.

    ÖRNEK PROGRAMLAR:

    Portları giriş ve çıkış olarak tanımlama:

    16F84                Her programın başında bu tanımlama yapılır.

    INCLUDE “.INC”           Assembly uzantısından hex uzantısına geçiş sırasında programın byte’ların ve bitlerin adres karşılıklarını görebilmesi için yazılmış dosya

    MAIN:                                            Başlangıç ayarları, RA0’a buton, RB0’a led bağlı

    BSF STATUS, RP0                    Status byte’ının 5. biti (RP0) 1 yapıldı; bank1 seçildi

    MOVLW 00000001b                  00000001b sayısı W’ye atandı

    MOVWF TRISA                            W’deki sayı TrisA’ya taşındı, RA0 giriş, kalan A bacakları çıkış

    CLRF TRISB                                TrisB 00000000b oldu, bütün B bacakları çıkış

    BCF STATUS, RP0                    Bank0’a dönüş

    START:                                          Start bloğunun başlangıcı

    CLRF PORTB                              B bacaklarının hepsi 0V

    BTFSS PORTA,0                      RA0 1’se alttaki satırı atla, değilse alt satıra geç.

    GOTO START                           START bloğunun başına git.

    BSF PORTB,0                             B’ nin 0. portunu 5V yap.

    GOTO START                              START bloğunun başına git.

    END                                           Program sonu.

    Öncelikle led’in takılacağı RB0 çıkış, buton takılacağı RA0 giriş olarak seçildi ve program döngüsünün başında B bacakları sıfırlandı. Sonra program butonun basılı olup olmadığını kontrol etmeye başladı. Butona basılı olmadığı zaman RA0 0V görecek ve program tekrar tekrar buton kontrolü yapacak, butona basıldığında RA0 5V görecek ve program  RB0’ı set edip tekrar kontrol döngüsüne girecek.

    Gecikme kontrolüyle kare dalga üretme:

    PROCESSOR 16F84

    INCLUDE “P16F84.INC”

    DEL EQU 0CH                          Değişkenler için ilk bellek adresi 0Ch’ta DEL değişkeni oluştu.

    SEL EQU 0DH                           0Dh’ta SEL değişkeni tanımlandı.

    MAIN:

    BSF STATUS, RP0                    Bank1 seçildi.

    CLRF TRISB                              B portlarının hepsi output(çıkış) olarak ayarlandı.

    BCF STATUS, RP0                    Bank0’a dönüş.

    START:

    BSF PORTB,0                            RB0 set edildi, RB0’a bağlı led yandı.

    CALL DELAY                              DELAY bloğu çağırıldı.

    BCF PORTB,0                            RB0 reset edildi, RB0’a bağlı led söndü.

    CALL DELAY

    GOTO START                            Start bloğunun başına gidildi.

    DELAY:                                       DELAY program bloğu

    MOVLW .250                              Decimal 250’nin binary karşılığı (11111010b) W’ye atandı.

    MOVWF DEL                              W’deki sayı DEL değişkenine atandı.

    DEL1:                                         DEL1 program bloğu

    MOVLW .100                              Decimal 100’ün binary karşılığı (01100100b) W’ye atandı.

    MOVWF SEL                              W’deki sayı SEL değişkenine atandı.

    DEL2:                                         DEL2 program bloğu

    NOP                                           Bir periyodu boyunca bekle

    DECFSZ SEL,F                          SEL’deki sayıyı bir azalt, sonuç 0’sa alt satırı atla

    GOTO DEL2                               DEL2 program bloğuna git.

    DECFSZ DEL,F                          DEL’deki sayıyı bir azalt, sonuç 0’sa alt satırı atla

    GOTO DEL1                               DEL1 program bloğuna git.

    RETURN                                    DELAY’in çağrıldığı yere geri dönüş.

    END

    Programın başında gecikme işleminde kullanılmak üzere DEL ve SEL değişkenleri oluşturuldu ve hazırlık olarak B portları çıkış yapıldı. Programdaki START döngüsünde önce RB0 set edildi, sonra DELAY işlemi gerçekleştirildi, RB0 reset edildi ve tekrar DELAY işlemi gerçekleştirildi. Sonra tekrar tekrar START döngüsü çalıştı. DELAY işleminin başında DEL’e 250 değeri verildi ve DEL1 işleminde de SEL’e 100 değeri verildi. DEL2 işleminde bir periyod beklendikten sonra SEL sayısı bir küçültüldü ve DEL2 işlemi tekrar başlatılarak SEL sayısı 0 olana kadar DEL2 işlemi tekrarlandı. SEL sayısı 0 olunca DEL sayısı bir küçültüldü ve DEL2 döngüsü DEL değeri 0 olana kadar tekrarlandı. ’in işlemcisi kristalin frekansının 4’te biri hızında çalıştığı için 4 MHz’lik kristalle bir işlem periyodu 1 mikrosaniye’dir ve yazılmış olan DELAY döngüsü yaklaşık olarak 250*100=25000 mikrosaniye bekleme sağlayacağı için çıkışta 50 milisaniye periyodlu kare dalga görülür.

    Makro kullanımı:

    PROCESSOR 16F84

    INCLUDE “P16F84.INC”

    INCLUDE “MYMAC.MAC”         Hazır makroların bulunduğu MAC uzantılı dosyadaki makroları kullanmak için

    DEL  EQU 0CH

    SEL  EQU 0DH

    DELAY1                            DELAY1 makrosunun tanımlanması

    CALL DELAY                              DELAY1 makrosunun içeriği

    CALL DELAY

    CALL DELAY

    CALL DELAY

    ENDM                                          Makronun bitimi

    MAIN:

    Bank1                                          Bank1 makrosunun içeriği işlenir, Bank1’e geçilir.

    CLRF TRISB

    Bank0                                          Bank0 makrosunun içeriği işlenir, Bank0’a dönülür.

    START:

    BSF PORTB,0

    DELAY1                                    Delay1 makrosunun içeriği olan 4 kez DELAY işlenir.

    BCF PORTB,0

    DELAY1

    GOTO START

    DELAY:

    MOVLW .250

    MOVWF DEL

    DEL1:

    MOVLW .100

    MOVWF SEL

    DEL2:

    NOP

    DECFSZ SEL,F

    GOTO DEL2

    DECFSZ DEL,F

    GOTO DEL1

    RETURN

    END

    MYMAC.MAC’in içeriği:

    Bank0   MACRO                       Bank0 makrosunun tanımlanması

    BCF STATUS, RP0                  Bank0 makrosunun içeriği

    ENDM                                       Makronun bitimi

    Bank1 MACRO                         Bank1 makrosunun tanımlanması

    BSF STATUS, RP0                  Bank1 makrosunun içeriği

    ENDM                                       Makronun bitimi

    Programın başında mymac.mac dosyası programın içine yerleştirilir; böylece bu dosyadaki Bank0 ve Bank1 makroları kullanıma açılır. Makro tanımlamalarında önce makronun adı sonuna “Macro” sözcüğü eklenerek yazılır, sonra makro çağırıldığında yapılacak işlemler yazılır ve makronun bitimine “Endm” yazılarak makro tamamlanır. Program içinde makro kullanılacağı zaman sadece adı yazılır.

    Tablo kullanımı:

    PROCESSOR 16F84

    INCLUDE “P16F84.INC”

    INCLUDE “MYMAC.MAC”

    VERI  EQU 0CH                             Veri adında bir değişken tanımlandı.

    #DEFINE BUTON PORTA, 0         Define komutuyla RA0’a “BUTON” adını verdi.

    MAIN:

    Bank1                                             Bank1 makrosuyla Bank1’e geçildi.

    MOVLW .1

    MOVWF TRISA                              RA0 giriş yapıldı.

    CLRF TRISB                                              B portları çıkış yapıldı.

    Bank0                                             Bank0 makrosuyla Bank0’a dönüldü.

    CLRF VERI                                    Veri değişkenini sıfırladı.

    CLRF PORTB                                B portlarını sıfırladı.

    START:

    BTFSS BUTON                              RA0’a 1 geliyorsa  alt satırı atlayacak.

    GOTO START

    INCF VERI                                     Veri’deki sayı bir arttı.

    CALL TABLO                                 TABLO program bloğunu çağırıyor.

    MOVWF PORTB                            TABLO’nun sonucunda W’ye atanan değeri PortB byte’ına yazar.

    BUTONCHECK:                             Butondan elimizi çekmemizi bekliyor. Bu

    BTFSC BUTON                              olmasaydı Pic çok hızlı olduğu için biz göremeden

    GOTO BUTONCHECK                   0’dan 9’a kadar saymayı bitirirdi.

    GOTO START

    TABLO:

    MOVLW VERI                                 Veri’deki sayı W’ye atanıyor.

    ADDWF PCL,1                                Tablo çağırma komutunun bulunduğu satır

    RETLW 01000000b                         numarasına W’deki sayıyı ekleyip sonucu olan

    RETLW 01111001b                         sayıya karşılık gelen satıra atlar. Örneğin,

    RETLW 00100100b                         Veri’deki sayı 0’sa ilk RETLW seçeneğine , 1 ise

    RETLW 00110000b                         ikinci, 2 ise üçüncü,… RETLW satırına

    RETLW 00011001b                         geçerek oradaki binary sayıyı W’ye aktarır.

    RETLW 00010010b                         Burada yazılı olan binary sayılar 0’dan 9’a kadar

    RETLW 00000010b                         sayıların ortak anot display’de görünmeleri için

    RETLW 01111000b                         gerekli olan değerlerdir. Bu sayılar belirlenirken

    RETLW 00000000b                          display’in a bacağından g bacağına kadar

    RETLW 00010000b                         sırayla RB0-RB6 portlarına bağlı olacağı

    END                                                 düşünülmüştür.

    Programdaki TABLO bloğu aşağıdaki gibi de yazılabilir.

    TABLO:

    MOVLW VERI

    DT 01000000b, 01111001b, 00100100b, 00110000b, 00011001b, 00010010b, 00000010b, 01111000b, 00000000b, 00010000b

    Hexadecimal Decimal Çevirici:

    PROCESSOR 16F84

    INCLUDE “P16F84.INC”

    SAYI   EQU 0Ch

    YUZ    EQU 0Dh

    ON      EQU 0Eh

    BIR     EQU 0Fh

    TEMP EQU 10h

    MAIN:

    BSF STATUS, RP0

    CLRF TRISA

    CLRF TRISB

    BCF STATUS, RP0

    START:

    MOVLW 7Bh                                             7Bh (01111011) sayısını W’ye atar.

    MOVWF SAYI                               W’deki değeri Sayı’ya atar.

    CALL CONVERT_DECIMAL        Convert_Decimal bloğunu çağırır.

    MOVF YUZ,W                               Convert_Decimal sonucunda Yuz’e atanan değeri W’ye atar

    BCF STATUS,C                            bitini sıfırlıyor.

    RLF YUZ,F                                    YUZ değişkeninin içindeki sayıları dört kez

    RLF YUZ,F                                    sola kaydırıyor.

    RLF YUZ,F

    RLF YUZ,F

    MOVF YUZ,W                               YUZ değişkeninin son değerini W’ye atar.

    ADDLW ON                                   ON değişkeninin son değerini W’deki sayıyla    toplar.

    MOVWF PORTB                             Çıkan sonucu PortB’ye atar.

    MOVF BIR,W                                 BIR değişkeninin son değerini W’ye atar.

    MOVWF PORTA                            W’deki değeri PortA’ya atar.

    CONVERT_DECIMAL:

    CLRF YUZ

    CLRF ON

    CLRF BIR

    DEC_100:

    MOVLW .100                                  Decimal 100 değerini W’ye atar.

    SUBWF SAYI,W                             SAYI’daki değerden W’deki değeri çıkarır.

    MOVWF TEMP                               Sonucu TEMP değişkenine atar.

    BTFSS STATUS,C                         Status,C (Carry) biti 1’se alttaki satırı atla

    GOTO DEC_10                                 DEC_10 bloğuna gider.

    MOVF TEMP,W                                 TEMP’teki sayı değerini W’ye atar.

    MOVWF SAYI                                    W’deki sayı değerini SAYI’ya atar.

    INCF YUZ,F                                       YUZ’deki sayıyı bir arttırır.

    GOTO DEC_100                                DEC_100 bloğuna gider.

    DEC_10:

    MOVLW .10                                       Decimal 10 değerini W’ye atar.

    SUBWF SAYI,W                                SAYI’daki değerden W’deki değeri çıkarır.

    MOVWF TEMP                                  Sonucu TEMP değişkenine atar.

    BTFSS STATUS,C                            Status,C (Carry) biti 1’se alttaki satırı atla

    GOTO DEC_1                                    DEC_10 bloğuna gider.

    MOVF TEMP,W                                 TEMP’teki sayı değerini W’ye atar.

    MOVWF SAYI                                    W’deki sayı değerini SAYI’ya atar.

    INCF ON,F                                         ON’daki sayıyı bir arttırır.

    GOTO DEC_10                                  DEC_10 bloğuna gider.

    DEC_1:

    MOVLW .1                                          Decimal 10 değerini W’ye atar.

    SUBWF SAYI,W                                 SAYI’daki değerden W’deki değeri çıkarır.

    MOVWF TEMP                                   Sonucu TEMP değişkenine atar.

    BTFSS STATUS,C                             Status,C (Carry) biti 1’se alttaki satırı atla

    RETURN                                             Convert_Decimal’in çağırıldığı yere geri döner.

    MOVF TEMP,W                                  TEMP’teki sayı değerini W’ye atar.

    MOVWF SAYI                                     W’deki sayı değerini SAYI’ya atar.

    INCF BIR,F                                         BIR’deki sayıyı bir arttırır.

    GOTO DEC_1                                    DEC_10 bloğuna gider.

    END

    Bu programda Carry bitinin taşma anlarında 1’den 0’a dönmesi ve RLF (RRF’de de aynı şekilde geçerli) işleminde byte’ın içindeki bitlerin Carry bitiyle beraber kayması özellikleri kullanılıyor. Bu programa göre programın içinde girilmiş olan 7Bh sayısı decimal’e çevrilerek,  biri RB4-RB7, biri RB0-RB3 ve biri RA0-RA3 arasındaki portlara bağlı üç tane 74LS247 entegresi yoluyla Pic’ten çıkan 4’er bit üzerinden üç ayrı display’e gönderilir.

    Programın başındaki BIR, ON, YUZ değişkenleri display’e gidecek birler, onlar ve yüzler basamaklarındaki sayıları tutacak değişkenler, TEMP ve SAYI program çalışırken çıkan sonuçların kaydedildiği geçici değişkenlerdir. Başta 7Bh sayısı SAYI’ya yüklendi ve DEC_100’ün içinde decimal 100 sayısı SAYI değişkenindeki sayıdan çıkartıldı. Pic’e voltaj verildiğinde her zaman 1 olan Status,C (Carry) biti, işlem sırasında sonuç 0’ın altına düşerse veya 255’in üstüne çıkarsa 0 olur. SAYI değişkeninden 100 çıkartıldıkça Carry biti 0 olmadığı sürece program yeni SAYI olarak eski sayının 100 eksiğini atar ve YUZ değişkenindeki değeri bir arttırır. Böylece SAYI’daki değerin 100’ün kaç katı olduğu YUZ değişkenine yazılır. Carry biti 0 olduğunda program SAYI’nın içindeki değerde başka 100 bulunmadığını anlar ve onlar basamağını kontrol etmek için DEC_10 bloğuna gider. DEC_10 ve DEC_1’te de benzer işlemler 10 ve 1 çıkartılarak yapılır. Tek fark DEC_1’de de Carry biti sıfırlandığında programın başka hane kalmadığı için Convert_Decimal’in çağırıldığı yere geri dönmesidir. Program yüzler ve onlar hanesini sırasıyla RB4-RB7 ve RB0-RB3 üzerinden yolladığı için YUZ değişkeninin ilk dört biti PortB’nin son dört biti olmak üzere dört kez sola kaydırılıyor ve elde edilen sayı ON değişkenindeki sayıyla toplanıp W’ye atılıyor. Bu işlemden hemen önce Carry biti sıfırlanıyor çünkü Carry biti taşmadan dolayı 0 olduktan bir işlem sonra tekrar kendini set ediyor. RLF sırasında Carry biti de kaydığından YUZ değişkeninin ilk dört bitine 1 gelmemesi için Carry bitinin işlem öncesinde sıfırlanması gerekir. YUZ değişkeninde RLF işlemi yapılırken ilk dört bitin 0 olmasını istememizin nedeni toplama sırasında herhangi bir 1’in PortB’ye gidecek sayı değerinde değişikliğe neden olmaması gerektiğidir.

    Ör. YUZ: 00000100       ON:  00000010

    Carry sıfırlanmadan önce Carry ve W:              1 00000100

    Carry sıfırlanmazsa RLF sonrası Carry ve W:   0 00001001      Eski Carry biti

    Carry sıfırlandıktan sonra Carry ve W:              0 00000100

    İlk RLF sonrası Carry ve W:                              0 00001000

    Programın kalanında W’de oluşturulan yüzler ve onlar basamağı sayısı PortB’ye, BIR değişkenindeki sayı da PortA’ya atanarak display’de görüntü elde ediliyor.


  • Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /home/xdelete/public_html/forum/cache/data_c1176e3b86b838cc919e441a620ca4b6-SMF-modSettings.php on line 1

    Parse error: syntax error, unexpected ':' in /home/xdelete/public_html/forum/cache/data_c1176e3b86b838cc919e441a620ca4b6-SMF-modSettings.php on line 1