Upload
darius-maynard
View
119
Download
0
Embed Size (px)
DESCRIPTION
PROGRAMLAMA VE ASSEMBLY DİLİ. 4.Hafta. Sembol Tanımlamaları : f - Register File Adress: kayıtçı adı veya adresi (0x00 ile 0x7F) w - Akümülatör, çalışma kayıtçısı - PowerPoint PPT Presentation
Citation preview
PROGRAMLAMPROGRAMLAMA VE A VE
ASSEMBLY ASSEMBLY DİLİDİLİ
Mikrodenetleyiciler 1
4.Hafta 4.Hafta
Mikrodenetleyiciler 2
Sembol Tanımlamaları :f - Register File Adress: kayıtçı adı veya adresi (0x00 ile 0x7F)w - Akümülatör, çalışma kayıtçısıb - Bit tanımlayıcısı; 8 bitlik kayıtçının 0~7 arasındaki bir biti veya etiket. (EQU komutu ile adresi tanımlanmış olması gerekir)d - Destination : Gönderilecek yer; komutun çalıştırılmasından sonra sonucun nereye yazılacağını belirler.
d = 0 - W kayıtçısına, d = 1 - dosya kayıtçısınak - Sabit bir sayı (0x0C veya 0CH, 00001100B, 10D) veya adres etiketix - “0” yada “1” önemli değilTO - Zaman aşımı biti (Time-out bit)PD - Güç kesimi biti (Power-down)
Mikrodenetleyiciler 3
Sembol Tanımlamaları :f - Register File Adress: kayıtçı adı veya adresi (0x00 ile 0x7F)w - Akümülatör, çalışma kayıtçısıb - Bit tanımlayıcısı; 8 bitlik kayıtçının 0~7 arasındaki bir biti veya etiket. (EQU komutu ile adresi tanımlanmış olması gerekir)d - Destination : Gönderilecek yer; komutun çalıştırılmasından sonra sonucun nereye yazılacağını belirler.
d = 0 - W kayıtçısına, d = 1 - dosya kayıtçısınak - Sabit bir sayı (0x0C veya 0CH, 00001100B, 10D) veya adres etiketix - “0” yada “1” önemli değilTO - Zaman aşımı biti (Time-out bit)PD - Güç kesimi biti (Power-down)
Mikrodenetleyiciler 4
Örnek: 20h tan başlayan 0x25h ta biten bir tablodaki sıfırları sayan program.
list p=pic16f877a#include<p16f877a.inc>
tbasi equ 0x20tsonu equ 0x25sayac equ 0x30org 0x000goto basla
basla:clrf sayacmovlw tbasimovwf FSR
geri:movf INDF,wbtfsc STATUS,Zincf sayac,fincf FSR,fmovlw tsonusubwf FSR,wbtfss STATUS,Zgoto geriend
Mikrodenetleyiciler 5
list p=pic16f877a#include<p16f877a.inc>
tbasi equ 0x20tsonu equ 0x25sayac equ 0x30org 0x000goto basla
basla:clrf sayaccall tdoldurmovlw tbasimovwf FSR
geri:movf INDF,wbtfsc STATUS,Zincf sayac,fincf FSR,fmovlw tsonusubwf FSR,wbtfss STATUS,Zgoto gerigoto son
Örnek: 20h tan başlayan 0x25h ta biten bir tablodaki sıfırları sayan program. (Tablo verileri program ile yüklenir)
tdoldur:movlw 0x3fmovwf tbasimovlw 0x00movwf tbasi+1movlw 0x5bmovwf tbasi+2movlw 0x00movwf tbasi+3movlw 0x66movwf tbasi+4movlw 0x00movwf tbasi+5
returnson:end
Mikrodenetleyiciler 6
ÖDEV1: 0x20h tan başlayan 0x25h ta biten bir tablodaki sayıları toplayıp sonucu 0x2A ya program
(Tablo verileri sırasıyla; 0x02, 0x0A, 0x05, 0x0C, 0x08, 0x0E )
ÖDEV2: 16 bitlik A sayısının düşük anlamlı 8 biti 0x20h adresinde, yüksek anlamlı bitleri 0x21h adresindedir. Aynı şekilde B sayısı için düşük bitler 0x22h ve yüksek bitler 0x23h ta bulunmaktadır. İki 16 bitlik sayıyı toplayan sonucun düşük bitlerini 0x25h yüksek bitlerini 0x26h a yazan program.(Test değerleri: A=0x650F, B=0x30B2, A=0x25C8, B=0xA0DE)
(Olası elde durumlarını göz önünde bulundurunuz. )
Mikrodenetleyiciler 7
list p=pic16f877a#include<p16f877a.inc>tbasi equ 0x20tsonu equ 0x26toplam equ 0x2Aorg 0x000goto baslabasla:clrf toplam ; toplam=0call tdoldurmovlw tbasimovwf FSRgeri:movf toplam,w ;w <- toplamaddwf INDF,w ;toplam (w) <- toplam (w) + indfmovwf toplam ; w tasi toplamincf FSR,f ; FSR i 1 arttirmovlw tsonu ; tablo sonunu yuklesubwf FSR,w ; o anki FSR dan cikarbtfss STATUS,Z ; tablo sonuna gelindiyse w sifir olur 1 komut atlanirgoto gerigoto son
tdoldur:movlw 0x02movwf tbasimovlw 0x0Amovwf tbasi+1movlw 0x05movwf tbasi+2movlw 0x0Cmovwf tbasi+3movlw 0x08movwf tbasi+4movlw 0x0Emovwf tbasi+5
returnson:end
ÖDEV1: 0x20h tan başlayan 0x25h ta biten bir tablodaki sayıları toplayıp sonucu 0x2A ya program
Mikrodenetleyiciler 8
ÖDEV2: 16 bitlik A sayısının düşük anlamlı 8 biti 0x20h adresinde, yüksek anlamlı bitleri 0x21h adresindedir. Aynı şekilde B sayısı için düşük bitler 0x22h ve yüksek bitler 0x23h ta bulunmaktadır. İki 16 bitlik sayıyı toplayan sonucun düşük bitlerini 0x25h yüksek bitlerini 0x26h a yazan program.(Test değerleri: A=0x650F, B=0x30B2, A=0x25C8, B=0xA0DE)(Olası elde durumlarını göz önünde bulundurunuz. )
list p=pic16f877a#include<p16f877a.inc> elde equ 0x28 org 0x000 goto baslabasla: clrf elde ; elde yi sifirla movf 0x20,w ; A nin dusuk anlamli bitleri addwf 0x22,w ; w <- w + B nin dusuk anlamli bitleri btfsc STATUS,C ; Elde olusmadiysa 1 komut atla incf elde,f ; Elde varsa eldeyi artir movwf 0x25 ; Sonuc un dusuk anlamli bitleri movf 0x21,w ; A nin yuksek anlamli bitleri addwf 0x23,w ; w <- w + B nin yuksek anlamli bitleri addwf elde,w ; w <- w + Elde movwf 0x26 ; Sonuc un yuksek anlamli bitleriend
Döngü OluşturmaProgram yazarken bazı işlemlerin belirli sayıda tekrarlanması
gerekebilir. Bu durumda kayıtçılardan biri sayaç olarak kullanılır. Daha sonra her işlem tekrarlandığında sayaç değeri bir azaltılır. Azaltma işlemini DECFSZ komutu ile yapılır.
Bazı işlerin belirli sayılarda tekrarlanması istenebilir. Bu durumda da bir kayıtçı sayaç olarak kullanılır ve sayacın değeri her defasında 1 arttırılır. Arttırma işlemi INCF komutu ile yapılır. Sayaç belirlene değer ulaştığı zaman program akışı başka komuta geçer.
Zaman Gecikmesi ve Alt Programlar Zaman Gecikmesi ve Alt Programlar Bazı işlemlerin yapılması sırasında belirli bir zaman hiçbir şey yapmadan beklenmesi gerekir. Zaman geciktirme işlemlerini yazılım döngülerini kullanarak yapabildiğimiz gibi, donanımın bize sunduğu özel geciktirmeler yapabiliriz. Biz zaman geciktirme döngüsünde, gecikme zamanını tespit etmek için komutların çevrim süreleri dikkate alınır. RC osilatör kullanılan PIC devrelerinde bir komutun çevrim süresini hassas olarak hesaplamak kolay değildir. Ancak kristal veya seramik osilatör kullanılan devrelerde hassas gecikme döngüleri yapabiliriz.
PIC‟in geciktirilmesi için ilk başta kullanıcılar NOP komutlarını kullanmayı tercih edebilirler. Örneğin:
NOP komutu ile 0,1 milisaniyelik bir gecikme yaratmak için ne kadar NOP komutu gerekir. Kristal Osilatör=20 Mhz) PIC16F877 için Bir komutun çevrim süresi = 4×0.05µsn = 0.2 µsn (1/20.000.000)Aynı gecikme için NOP komut sayısı ise (0.1×103)/(0.2) = 500 adettir. Bu sayıda NOP komutunun ardarda yazılması belleğin gereksiz biçimde dolmasına yol açar. Bu yöntem iyi bir programlama tekniği olarak da önerilmez. Bunun yerine daha az sayıda komut kullanarak, istenilen gecikmeyi sağlayabiliriz.
Gecikme programında iç içe iki döngü kullanılmıştır. Her iki döngü kullanıldığında oluşan toplam komut çevrim sürelerini hesaplarsak;
KOMUTLAR KOMUT ÇEVRİM SÜRESİ Gecikme: movlw 0xFF 1 movwf SAYAC1 ;d‟255‟=M 1 Dongu11: movlw 0xFF 1xM movwf SAYAC2 ; d‟255‟=N 1xM Dongu12: decfsz SAYAC2,F 1xMxN goto Dongu12 2xMxN decfsz SAYAC1,F 1xM goto Dongu11 2xM return 2 M ve N yerine 255 yerleştirilirse; Toplam 196.608 çevrim süresi (3xMxN+5xM+4)
196.608 x (0.05 x 4)µsn = 39.321 µsn ≡39 msn
Gecikme sürelerini sayaçlara yüklediğimiz M ve N sabitlerini değiştirerek ayarlamak mümkündür. Örneğin gecikme süresinin 10 ms olması için dış ve iç döngü sayaçlarının değerlerinin ne olması gerektiğini bulalım:
10.000/(0.05 x 4) = 3xNxN N=129 bu değer h‟81‟ değerine karşılık gelir. Böylece 10 ms gecikme elde edilir.
TRISX : 0 Çıkış ; 1 Giriş Örn: TRISB=b’11110000 = 0xF0 (Üst 4 bit giriş, Alt 4 bit çıkış)
PORTX= data; Veri gönderme data= PORTX; Veri alma
Giriş-Çıkış Portları KullanımıGiriş-Çıkış Portları Kullanımı
Mikrodenetleyiciler 14
16F877 Minimum Konfigurasyon16F877 Minimum Konfigurasyon
Mikrodenetleyiciler 15
Örnek: PortB de butonlar bağlıdır, PortC de LED ler. PortB deki bilgiyi PortC ye gönderen programı yazınız. (RBPU aktif edilmeli)
list p=pic16f877a#include<p16f877a.inc>
org 0x000goto basla
basla:;port B ve C için yönlendiricileri ayarlabsf STATUS,RP0 ; Bank 1clrf TRISC ; PortC çıkışbcf OPTION_REG,RBPU ;Pull-up aktifmovlw 0xFFmovwf TRISB ; PortB girişbcf STATUS,RP0 ; Tekrar bank 0
geri:movf PORTB,w ; PortB okunopnopmovwf PORTC ;PORTC ye yaznopgoto geriend
Mikrodenetleyiciler 16
Örnek: PortB de düşük 4 bitine butonlar bağlıdır, yüksek anlamlı bitlerine de LED ler. PortB ilk 4 bitindeki bilgiyi, yüksek bitlerine gönderen programı yazınız. list p=pic16f877a#include<p16f877a.inc>
org 0x000goto basla
temp equ 0x20basla:
;port B için yönlendiricileri ayarlabsf STATUS,RP0 ; Bank 1movlw 0x0F ; ust 4 cikis, alt 4 girismovwf TRISB ; PortB ayarlabcf STATUS,RP0 ; Tekrar bank 0
geri: swapf PORTB,wandlw 0xF0;movwf tempmovf PORTB,wandlw 0x0F;addwf temp,w
movwf PORTBgoto geriend
Mikrodenetleyiciler 17
Örnek: PortB.0 da buton bağlıdır, PortC.0 da LED. Butona basıldığında LED in durumunu tersleyen programı yazın. (Buton basıldıktan sonra gecikme programı ile yeniden basılması geciktirilecek) list p=pic16f877a#include<p16f877a.inc>sayac1 equ 0x20sayac2 equ 0x21
org 0x000goto basla
basla:;port B ve C için yönlendiricileri ayarlabsf STATUS,RP0 ; Bank 1clrf TRISC ; PortC çıkışbcf OPTION_REG,RBPU ;Pull-up aktifmovlw 0xFFmovwf TRISB ; PortB girişbcf STATUS,RP0 ; Tekrar bank 0clrf PORTC
geri: btfsc PORTB,0 ; PortB.0 basili degil ise 1 dir alt komut calisirgoto geri ; basili degilse git gericall led_tersle ;Led konum degistirircall gecikme ;yeni tus basimi icin beklenirgoto geri
Mikrodenetleyiciler 18
gecikme: movlw 0xFF movwf sayac1 ;d’255’=M dongu11: movlw 0xFF movwf sayac2 ; d’255’=N dongu12: decfsz sayac2,f goto dongu12 decfsz sayac1,f goto dongu11 return
led_tersle:comf PORTC,f ;portc durumunu tersle f e tasi
returnend
Mikrodenetleyiciler 19
;====karaşimşek.asm======list p=pic16f877a#include<p16f877a.inc>sayac1 equ 0x20sayac2 equ 0x21
org 0x000goto basla
basla:clrf PORTBbsf STATUS,RP0 ;bank1clrf TRISC ;PORTC cikisbcf STATUS,RP0 ;bank0bcf STATUS,C ;Elde biti
sıfırlandı.movlw 0x01 ;ilk değeri yükle vemovwf PORTC ;C portuna gonder
sol:call gecikme ;Yeni değer için bekle.rlf PORTC,f ;sola kaydırbtfss PORTC,7 ;PORTC<7>=1 mi?goto sol ;hayır.SOL’a dallan.
sag:call gecikme ;evet. Yeni değer için
bekle.rrf PORTC,f ; sağa kaydır.btfss PORTC,0 ; PORTC<0>=1 mi?goto sag ;hayır.SAG’a dallan.goto sol ;evet.SOL’a dallan,
gecikme: movlw 0xFF movwf sayac1 ;d'255'=M dongu11: movlw 0xFF movwf sayac2 ; d'255'=N dongu12: decfsz sayac2,f goto dongu12 decfsz sayac1,f goto dongu11 returnend
Örnek: PortC ye bağlı LED ler baştan sona kadar teker teker yanıp sönen sonra geriye doğru devam eden devre tasarlanacaktır. LED geçişlerinin görülebilmesi için gecikme yazılımı yapılmalıdır. (Karaşimşek devresi)
Mikrodenetleyiciler 20
Örnek: B portundaki değerin 0x4C olup olmadığını test etmek için gerekenprogram parçasını yazınız.
…….…….movlw 0x4C ;W= 0x4C
test_portb:xorwf PORTB,f ;PORTB=(PORTB XOR W)btfss STATUS,Z ; STATUS<2>=1 mi? (Z=1 mi?)goto test_portb ; hayır.Tekrar test et. ; evet. Sonraki komutlar……….…….…….
XORLW ve XORWF komutlarıyla sadece verilerin eşit olup olmadığı testiniyapabiliriz.Bu işlem için istenirse SUBLW ve SUBWF komutları da kullanılabilir. Ayrıca bu ikikomutla , büyük / küçük mü? Testleri de yapılabilir.
Mikrodenetleyiciler 21
Soru1: 4 bitlik iki sayıyı çarpan sonucu belirleyeceğiniz bir RAM bölgesine yazan programı yazınız.
Soru2: 16 bitlik A sayısınından düşük anlamlı 8 biti AL 0x20h adresinde, yüksek anlamlı bitleri AH 0x21h adresindedir. Aynı şekilde B sayısı için düşük bitler BL, 0x22h ve yüksek bitler BH, 0x23h ta bulunmaktadır. İki 16 bitlik sayıyı çıkaran sonucun düşük bitlerini CL, 0x25h yüksek bitlerini CH, 0x26h a, işaret bitini SIGN, 0x27 e yazan program. (A-B=C)(Test değerleri: A=0x650F, B=0x30B2, A=0x25C8, B=0xA0DE)
Soru3: PortC nin ilk 4 bitinde LED bağlıdır. 0’dan F’e kadar hexadecimal sayan çıkıştaki LED leri buna göre yakan programı yazınız.
Çalışma SorularıÇalışma Soruları