PIC Assembler Komut Seti ve Macro Kullanımı
-
Assembler Komut Seti
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:
PROCESSOR 16F84 Her programın başında bu tanımlama yapılır.
INCLUDE “P16F84.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 işlemci 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ı. Pic’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 Macro 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 Carry 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
