21
PROGRAMLAMA PROGRAMLAMA VE ASSEMBLY VE ASSEMBLY DİLİ DİLİ Mikrodenetleyiciler 1 4.Hafta 4.Hafta

PROGRAMLAMA VE ASSEMBLY DİLİ

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

Page 1: PROGRAMLAMA  VE ASSEMBLY DİLİ

PROGRAMLAMPROGRAMLAMA VE A VE

ASSEMBLY ASSEMBLY DİLİDİLİ

Mikrodenetleyiciler 1

4.Hafta 4.Hafta

Page 2: PROGRAMLAMA  VE ASSEMBLY DİLİ

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)

Page 3: PROGRAMLAMA  VE ASSEMBLY DİLİ

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)

Page 4: PROGRAMLAMA  VE ASSEMBLY DİLİ

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

Page 5: PROGRAMLAMA  VE ASSEMBLY DİLİ

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

Page 6: PROGRAMLAMA  VE ASSEMBLY DİLİ

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. )

Page 7: PROGRAMLAMA  VE ASSEMBLY DİLİ

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

Page 8: PROGRAMLAMA  VE ASSEMBLY DİLİ

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

Page 9: PROGRAMLAMA  VE ASSEMBLY DİLİ

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.

Page 10: PROGRAMLAMA  VE ASSEMBLY DİLİ

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.

Page 11: PROGRAMLAMA  VE ASSEMBLY DİLİ

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.

Page 12: PROGRAMLAMA  VE ASSEMBLY DİLİ

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.

Page 13: PROGRAMLAMA  VE ASSEMBLY DİLİ

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ı

Page 14: PROGRAMLAMA  VE ASSEMBLY DİLİ

Mikrodenetleyiciler 14

16F877 Minimum Konfigurasyon16F877 Minimum Konfigurasyon

Page 15: PROGRAMLAMA  VE ASSEMBLY DİLİ

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

Page 16: PROGRAMLAMA  VE ASSEMBLY DİLİ

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

Page 17: PROGRAMLAMA  VE ASSEMBLY DİLİ

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

Page 18: PROGRAMLAMA  VE ASSEMBLY DİLİ

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

Page 19: PROGRAMLAMA  VE ASSEMBLY DİLİ

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)

Page 20: PROGRAMLAMA  VE ASSEMBLY DİLİ

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.

Page 21: PROGRAMLAMA  VE ASSEMBLY DİLİ

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ı