Güncel Oyun & Program & Resim & Msn Forumu
Elektronik Bölümü icinde Pic Programlama Ders - 10 konusu , DERS - 10 STATUS REGISTER: Bank 0 ve Bank 1 de 03H ve 83H adreslerinde bulunan 8 bit bir register olan STATUS register bulunur. Status register , aritmetik logic ünitin ...
|
|||||||
| Anlık İletiler | Kayıt ol | Yardım | Üye Listesi | Ajanda | Arama | Bugünki Mesajlar | Forumları Okundu Kabul Et |
|
|
|
DERS - 10
STATUS REGISTER: Bank 0 ve Bank 1 de 03H ve 83H adreslerinde bulunan 8 bit bir register olan STATUS register bulunur. Status register , aritmetik logic ünitin durumunu,reset halini ve bank seçimini belirleyen bitler içerir.Status register bir komut hedefi oldugunda Z,DC,C bitleri etkilenebilir ve daha sonra bu bitlere tekrar yazilmaz.Bu bitler duruma göre 0 veya 1 olurlar.TO ve PD bitleri yazilamaz bitlerdir. CLRF STATUS komutu ile ilk 3 bit 0 olur TO ve PD degismez,Z 1 olur sonuç ‘ 000DD1DD’ olur,burada D =degismez anlamindadir.Durum degisikligi olmasin istendiginde ; BCF,BSF,SWAPF,MOVWF komutlari kullanilabilir,bu komutlarla STATUS register bitleri etkilenmez. Status registerin icerigini daha ayrintili gormek icin Tiklayin SUBWF : File register ve Destination ile ( F,D ) kullanilir File Registerden ,write registeri çikarir ve sonucu file veya write registere yazar. SUBWF = FILE REGISTER – WRITE REGISTER W veya F'e yazilir. Sonuca göre Status register içinde bulunan Z ve C flaglarinin durumu degisir. Sonuç Z Flag C Flag Pozitif 0 1 0 1 1 Negatif 0 0 SUBLW : Bir sabit ile kullanilan komuttur. Bir sabitten write register içerigini çikarir ve sonucu WRITE registere yazar. SUBLW = SABIT – WRITE REGISTER W registere yazilir Bu sabit binary, hexadecimal veya decimal olabilir,sabitten daha evvel write registere yazilan degeri çikardigimizda,çikan sonuca göre Z ve C flag durumu degisir Sonuç Z Flag C Flag Pozitif 0 1 0 1 1 Negatif 0 0 Bu komutlarin kullanilmasi ile flag durum degisikligini kontrol ederek,programda kullaniriz. …………………………… …………………………… CLRF SAYAC1 ;sayac1 sifirla _X INCF SAYAC1,F ;sayac1 1 arttir ve file registere yaz MOVLW D’200’ ;write registere 200 yaz SUBWF SAYAC1,W ;file registerdan, write registeri çikar BTFSS STATUS,2 ;z flag kontrol et GOTO _X ;_X git MOVLW B’11100111’ ;write register a bu binary degeri gir MOVWF PORTB ;port b ye bu binary degeri ata END Bu programda 200 ‘ e kadar sayildiktan sonra port b de ki ledler yanar,fakat bu yine de çok kisa bir süre oldugu için göz bunu farkedemez,bu nedenle bu bir baska döngü ile kullanilabilir.Burada bu program kismi teorik bilgi için verilmistir. Keza buna benzer olarak SUBLW de kullanilabilir. …………………………… …………………………… CLRF SAYAC1 ; sayac1 sifirla _X INCF SAYAC1,W ;sayac1 1 arttir ve file registere yaz SUBLW D’255’ ;sabitten write registeri çikar BTFSC STATUS,0 ;C flag kontrol et GOTO _X ;_X git MOVLW B’11100111’ ;write register a bu binary degeri gir MOVWF PORTB ;port b ye bu binary degeri ata END Burada Write register 256 oldugunda sonuç negatif olur ve C flag 0 olur BTFSC komutu ile bu durum tespit edilir ve program devam eder. . . . Pratikte yazdigimiz programlarin gözle görülebilmesi için zaman geciktirme islemini ögrenip bunu kullanmamiz gerekir.Bu nedenle döngü islemlerini ögrenmeye baslayalim. Zaman geciktirme isleri ya donanim gecikmeleri olarak TMR0 ve WDT ile veya simdi yapacagimiz gibi yazilim döngüleri olarak yapilabilir. 16F84 de dahili komut saykili 1 Mhz dir ve bunun karsiligi 1 mikrosaniyedir.Her komutun ne kadar komut zamani kullandigi liste ile belirlenmistir.Komut seti listesinde bu zamanlar bellidir. Bir döngü ile maksimum 766 mikrosaniye gecikme elde edilir,bu da göz ile takip için yeterli degildir. MOVLW D’255’ ;write registere 255 yükle MOVWF SAYAC1 ;sayac1 registerine 255 i aktar DONGU DECFSZ SAYAC1,F ;file register de ki 255 sayisini bir azalt GOTO DONGU ;dongu etiketine git ………………………….. Burada ilk iki komut 1 mikrosaniye ,DECFSC komutu ilk uygulamada bir eksittigi için 255-1 =254 defa 1 mikrosaniye yani 254 mikrosaniye ,komut gerçeklestiginde yani 0 oldugunda ise 2 mikrosaniye (iki komut zamani kulalnir).GOTO komutu da 254 kez 2 mikrosaniye kullandigi için,sonuçta: 1+1+254+2+ (2X254) = 766 mikrosaniye olur.Bu kadar gecikme led ile çalisilan durumlarda yeterli degildir.göz 100 msn nin üstünü algilayabildigi için ,böyle bir döngüyü ikinci bir sayaç tan geçirip 250 kez daha tekrarlarsak yaklasik 200 msn elde ederiz,100 degil de 200 olmasi nedeni dir döngünün 2 saykillik 2 komuttan olusmasi nedeni iledir. Program içinde döngü kullanmak pek pratik olmadigi için CALL RETURN ikilisi ile alt programlar yazilir. CALL komutu ile geçikme yapilan satira yollanir ve RETURN ile kaldigi yerden devam için geri dönülür. CALL komutu ile program yön degistirdiginde ,geri dönülecek adresin yazilmasi ve saklanmasi gerekir bu saklama islemi STACK registerdir bu is otomatik olarak yapilir. ;döngü ile ilgili bir program denemesi ;karasimsek ;PortB ye bagli ledler saga sola yanar list p=16f84 include "16f84a.inc" CLRF PORTB BCF STATUS,0 BSF STATUS,5 CLRF TRISB BCF STATUS,5 MOVLW B'00000001' MOVWF PORTB ;port b nin ilk bitini yak SOL CALL GECIKME ;gecikme döngüsüne gir RLF PORTB,F ;port b yi sola kaydir BTFSS PORTB,7 ;7. bit 1 ise atla GOTO SOL SAG CALL GECIKME RRF PORTB,F ;portb ye atanan degeri saga kaydir BTFSS PORTB,0 ;0 . bit 1 ise bir komut atla GOTO SAG ;0. bit 1 degilse sag etikete git GOTO SOL GECIKME MOVLW D'25' MOVWF SAYAC1 DON1 MOVLW D'25' MOVWF SAYAC2 DON2 MOVLW D'250' MOVWF SAYAC3 DON3 DECFSZ SAYAC3,F GOTO DON3 DECFSZ SAYAC2,F GOTO DON2 DECFSZ SAYAC1,F GOTO DON1 RETURN END Bu programda SAYAC registerleri 16f84a inc. file içindedir.Daha evvel de söyledigimiz gibi bu file editorda açilip istenen ilaveler yapilir.Tekrar hatirlatmakta yarar olan sey ise sudur: INC. FILE IÇINDE YAZILAR BÜYÜK HARF ISE PROGRAMDA DA BÜYÜK,KÜÇÜK ISE KÜÇÜK OLMALIDIR.MPLAB IÇINDEKI INC FILE IÇINDE BÜYÜK HARF KULLANILDIGINDAN PROGRAM YAZIMINDA INC.FILE KULLANIYORSANIZ BÜYÜK HARF ILE PROGRAM YAZINIZ. Burada kullanilan ve bizim bahsetmedigimiz iki komut vardir bunlar RRF ve RLF komutlaridir.Her iki komut da F,D ile kullanilir. RLF : Bir file register içindeki bitleri bir sola kaydirir,en soldaki bit ne olur o da gider STATUS,0 ‘a yazilir,yani CARRY FLAG ‘e gider.CARRY FLAG içindeki de en sag bite gider. CARRY 7 6 5 4 3 2 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 1 RRF : Bir file register içindeki bitlerin pozisyonunu her defasinda bir saga kaydirir.Bu kez de en sag bit,yani bit 0 yerinden atilir ve gider CARRY FLAG ‘e yazilir.CARRY FLAG içerigi ise en sol bite yazilir. 7 6 5 4 3 2 1 0 CARRY 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 COMF : F,D ile kullanilan bir komuttur,bir register içindeki bitleri ters çevirir,yani 0 lar 1 olur 1 ler ise 0 olur. 7 6 5 4 3 2 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 SWAPF : F,D ile kullanilir bir file register içindeki bitlerin ilk ve son dört bitinin yerini degistirir. 7 6 5 4 3 2 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 ;TA2FR ;BIR RPOGRAM DENEMESI ;INCF,SUBWF,CALL,RETURN KULLANILMASI ;ADIM ADIM PIC DENEME 3 ;RB0 RB1 VE RB2 LED YANMASI LIST P=16F84 INCLUDE "16F84A.INC" CLRF PORTB BCF STATUS,0 BSF STATUS,5 CLRF TRISB BCF STATUS,5 BAS CLRF SAYAC1 _X INCF SAYAC1,F MOVLW D'250' SUBWF SAYAC1,W BTFSS STATUS,2 GOTO _X CALL GECIKME MOVLW B'00000111' MOVWF PORTB CALL GECIKME CALL GECIKME MOVLW B'00000000' MOVWF PORTB GOTO BAS GECIKME MOVLW D'250' MOVWF SAYAC2 DON1 MOVLW D'250' MOVWF SAYAC3 DON2 DECFSZ SAYAC3,F GOTO DON2 DECFSZ SAYAC2,F GOTO DON1 RETURN END ;TA2FR ;BIR RPOGRAM DENEMESI ;INCF,SUBWF,CALL,RETURN KULLANILMASI ;ADIM ADIM PIC DENEME 5 ;RB0-RB1-RB2 DE LED YANMASI LIST P=16F84 INCLUDE "16F84A.INC" CLRF PORTB BCF STATUS,0 BSF STATUS,5 CLRF TRISB BCF STATUS,5 BAS CLRF SAYAC1 _X INCF SAYAC1,F MOVLW D'250' SUBWF SAYAC1,W SUBWF SAYAC1,W BTFSS STATUS,2 BTFSS STATUS,2 GOTO _X CALL GECIKME CALL GECIKME CALL GECIKME CALL GECIKME MOVLW B'00000111' MOVWF PORTB CALL GECIKME CALL GECIKME CALL GECIKME CALL GECIKME MOVLW B'00000000' MOVWF PORTB GOTO BAS GECIKME MOVLW D'250' MOVWF SAYAC2 DON1 MOVLW D'250' MOVWF SAYAC3 DON2 DECFSZ SAYAC3,F GOTO DON2 DECFSZ SAYAC2,F GOTO DON1 RETURN END |
![]() |
| Seçenekler | |
| Stil | |
|
|
| LinkBack |
LinkBack URL |
About LinkBacks |
| Bookmark & Share |
Digg this Thread! |
Add Thread to del.icio.us |
Bookmark in Technorati |
Furl this Thread! |