BTFSS ve BTFSC

Başlatan Hadi, 20 Mart 2015, 10:23:55

Hadi

Merhaba arkadaşlar.

Aşağıdaki devreye, RB7 ye bağlı butona basılınca RB0 ye bağlı LED yansın diye iki ayrı program yazdım.


http://wle.ir/hadi/ISIS.png

Programların birinde butona basılıp basılmadığını BTFSS komutu, diğerinde ise BTFSC komutu ile test ettim. Her ikisinde de LED yanıyor.

Program 1:

LIST	P=16F628A
		INCLUDE	"P16F628A.INC"
		
		
		CLRF	PORTB
		BSF	STATUS,	5
		MOVLW	0xFE
		MOVWF	TRISB
		BCF	STATUS,	5
				
START	BTFSC	PORTB,	7
		BSF	PORTB,	0
		GOTO	START		
	
		END



Program 2:

LIST	P=16F628A
		INCLUDE	"P16F628A.INC"
		
		
		CLRF	PORTB
		BSF	STATUS,	5
		MOVLW	0xFE
		MOVWF	TRISB
		BCF	STATUS,	5
				
START	BTFSS	PORTB,	7
		GOTO	START
		BSF	PORTB,	0		
	
		END


Ama BTFSS komutu ile yazılan program da ise elimi butondan çektiğim anda istemediğim halde LED sönüyor. Bunun nedenini bana açıklar mısınız?

Yani aklıma takılan bu ki:

1- Ben BSF ile bir biti set ettiğimde, neden tekrar o bit (BCF komutu kullanmadığım halde) reset oluyor?

2- Birde butona basıldığında döngüden çıkıp BSF komutu satırına geldiğinde nasıl oluyor da tekrar (GOTO komutu kullanmadığım halde) tekrar yukarı çıkıp butonun durumunu tekrar test ediyor?


Note: ben bu programları sadece Proteus da denedim. Acaba sorun Proteus'dan olabilir mi?

Bu arada yazdığım kodlar, hex ve isis dosyalarını buradan indirebilirsiniz.

http://wle.ir/hadi/Hadi.rar

Şimdiden cevap verecek arkadaşlara teşekkür ederim.  :)

Asof544

Merhaba kardeşim cevap veremeyecğim üzgünüm ama belkı sen bana yardımcı olursun benım sorunum assembly yenı başlıyorum ama derleyıcı olarak ne kullanmalıyım hala şaşkınım MPLA XIDE 2.35 yukledım ama yenı sayfa oluışturulurken nelere dıkkat etmem gerekıyor bıllmıyorum bana bıraz yardım cı olursan mınnettar kalırım, Assembly ıle ılgılı hıç ders vıdeosu bulamadım ama elımde bırsuru yazılı kaynak var bende bunlardan oğrenmeye başlayayım dedım,istersen buraya koyabılırım,sımdıden çok sağol.

Asof544


''Ama BTFSS komutu ile yazılan program da ise elimi butondan çektiğim anda istemediğim halde LED sönüyor. Bunun nedenini bana açıklar mısınız?''
Bunun nedenı belkı de ınen kenar çıkan kenar dıye bırsey var elektronıkte bu yuzden olabılırmı sadece fıkır verır belkı dıye soyledım.

Pyrodigy

#3
Şema resmi açılmıyor.
2. programda       
BSF	PORTB,	0
dan sonra program sonlanıyor.  Programı şu şeklide değiştirip dene bakalım.

START	BTFSS	PORTB,	7
        GOTO	START
        BSF	PORTB,	0	
        GOTO	START	
    
        END


Not: MPLAB ın programını kullanıyorsan Simulator özelliği ile programını adım adım debug yapmayı öğrenmeni tavsiye ederim. Böylece basit veya karmaşık program hatalarını rahatlıkla gözlemleyebilirsin.
Persistance is the name of the game in this business....

Hadi

#4
Hocam linkte sorun yok, tarayıcının adres satırında Entere basınca gösteriyor. Ama yine buraya ekliyorum.

http://wle.ir/hadi/ISIS.png

İşte sıkıntı burada, eğer dediğiniz gibi BSF komutundan sonra program sonlanıyor ise, peki neden tekrar yukarı çıkıp buton durumunu tekrar test ediyor? Butona tekrar basınca LED yine yanıyor çünkü.



MPLAB simülatör de sıkıntı yok. Orda BSF den sonra duruyor.

RaMu

16f628a nın 3,5kb program hafızası var,
4MHz ile cpu çalışsa
1 komut 1mikrosaniyede işleniyor,
3,5kb ın tamamı nop olsa
yaklaşık 4000 us de tüm program hafızası işlenir
yani 4 milisaniye
buda insanın hissedemeyeceği kadar kısa,

her komut işlenirken mcu nun Program Counter (PC)
arttırılır veya goto return vs. gibi komutlara göre manipule edilir,
senin programında
PC sonuna kadar sayıyor
bütün boş program hafızasını işliyor
ve bu 4ms sürüyor
daha sonra PC 0 a dönüyor
bu sayede tekrar programın başına dönmüş oluyor.

Veya 16f628a PC 13 bittir
en büyük sayabileceği sayı 8181 dir
bu şekilde bile saysa başa dönmesi 8ms sürer
bundada programın başa dönüşünü insan algılayamaz.

Bunlar benim tahminlerim.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Hadi

Program bitine PC sıfırlanıp program başa mı donuyor?  :o

ltcelik

#7
Alıntı yapılan: RaMu - 20 Mart 2015, 16:11:59
16f628a nın 3,5kb program hafızası var,
4MHz ile cpu çalışsa
1 komut 1mikrosaniyede işleniyor,
3,5kb ın tamamı nop olsa
yaklaşık 4000 us de tüm program hafızası işlenir
yani 4 milisaniye
buda insanın hissedemeyeceği kadar kısa,

her komut işlenirken mcu nun Program Counter (PC)
arttırılır veya goto return vs. gibi komutlara göre manipule edilir,
senin programında
PC sonuna kadar sayıyor
bütün boş program hafızasını işliyor
ve bu 4ms sürüyor
daha sonra PC 0 a dönüyor
bu sayede tekrar programın başına dönmüş oluyor.

Veya 16f628a PC 13 bittir
en büyük sayabileceği sayı 8181 dir
bu şekilde bile saysa başa dönmesi 8ms sürer
bundada programın başa dönüşünü insan algılayamaz.

Bunlar benim tahminlerim.

Arkdaşın dediğinden olabilir..Programı  butonun görevini icra ettikten sonra gecikme alt programına yönlendirmelisin, program gecikme alt programında oyalanırken sen butondan parmağını çekecek vakit bulursun

Bir de kod yazarken yan tarafına ; ile o kodu niçin yazdığını açıklayan kısa notlar yaz ki hata kontrolü kolay olsun.. yanlışlıkla amaca uymayan kod yazıp yazmadığını, kendin kontrol ederken de burda olduğu bize kontrol ettirirken de kolaylık olur..

        LIST   P=16F628A
        INCLUDE   "P16F628A.INC"
       
       
        CLRF   PORTB ; port byi temizle
        BSF   STATUS,   5 ; bank 1 e geç
        MOVLW   0xFE   ; port b i/oayarlarını
        MOVWF   TRISB ; yükle
        BCF   STATUS,   5 ; bank 1e geç
               
START   BTFSC   PORTB   7; B 7. biti test et 0 ise atlat
                BSF           PORTB,   0; B 0 ı set et ( ledi yak )
                GOTO   START   ;sonsuz döngüye gir   
   
        END

gibi.. zaten bu kodu incelediğinde PORT B 0'ı 0'a çeken yani söndüren bir kod  da gözükmüyor..

Hadi

@asof544

Merhaba kardeş.
Eğer PIC16F seri için kod yazacaksan MPLAB X versiyonu değil 8.92 versiyonunu kurmanı tavsiye ederim.

Buradan indirebilirsin:

http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_IDE_8_92.zip

RaMu

#9
Alıntı yapılan: ltcelik - 20 Mart 2015, 21:44:30
.. zaten bu kodu incelediğinde PORT B 0'ı 0'a çeken yani söndüren bir kod  da gözükmüyor..

Alıntı Yap
        LIST   P=16F628A
        INCLUDE   "P16F628A.INC"
       
       
        CLRF   PORTB ; port byi temizle
        BSF   STATUS,   5 ; bank 1 e geç
        MOVLW   0xFE   ; port b i/oayarlarını
.
.
.

mesaj birleştirme:: 20 Mart 2015, 23:11:13

goto start dediği için sadece bir defa program başlangıcında kullanılıyor.

ama 2. programında
yukarıdaki mesajımda anlattığım gibi
program başa dönüp portb yi sıfırlıyor led sönüyor.

Programda portb hiç sıfırlanmayıp denenebilir.
(mcu reset ve ilk enerjilenme durumunda
portb durumuna datasheet ten bakmak lazım)
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ltcelik

START    BTFSC   PORTB,   7; Port butonuna basılmadıysa satır atlat
                 BSF   PORTB,   0 ; port butonuna basılmıştır B0ı set et

SONDUR   BTFSS   PORTB, 7 ; port butonuna basıldıysa satır atlat (ledi söndüren kodu atlat)
                 BCF       PORTB, 0 : B0'ı 0a çek ( ledi söndür)
       
                GOTO   START

yukarıda ledi söndüren kod ekledim ..

ancak RAMU arkadaşın dediği gibi çok hızılı çalıştığı için - buton geciktirme kodu olmadığı için-  sonucu büyük ihtimal fark edemiyeceksin

ltcelik

Alıntı yapılan: RaMu - 20 Mart 2015, 23:06:46

mesaj birleştirme:: 20 Mart 2015, 23:11:13

goto start dediği için sadece bir defa program başlangıcında kullanılıyor.

ama 2. programında
yukarıdaki mesajımda anlattığım gibi
program başa dönüp portb yi sıfırlıyor led sönüyor.

Programda portb hiç sıfırlanmayıp denenebilir.
(mcu reset ve ilk enerjilenme durumunda
portb durumuna datasheet ten bakmak lazım)

Demek istediğim programın asıl çalışma kısmında , sonsuz döngü kısmında B-0 'ı  sıfıra çeken  yani yanmış ledi söndüren bir kod yok (yani START - GOTO START arasında )

Hadi

Alıntı yapılan: ltcelik - 20 Mart 2015, 21:44:30
Arkdaşın dediğinden olabilir..Programı  butonun görevini icra ettikten sonra gecikme alt programına yönlendirmelisin, program gecikme alt programında oyalanırken sen butondan parmağını çekecek vakit bulursun

Bir de kod yazarken yan tarafına ; ile o kodu niçin yazdığını açıklayan kısa notlar yaz ki hata kontrolü kolay olsun.. yanlışlıkla amaca uymayan kod yazıp yazmadığını, kendin kontrol ederken de burda olduğu bize kontrol ettirirken de kolaylık olur..

        LIST   P=16F628A
        INCLUDE   "P16F628A.INC"
       
       
        CLRF   PORTB ; port byi temizle
        BSF   STATUS,   5 ; bank 1 e geç
        MOVLW   0xFE   ; port b i/oayarlarını
        MOVWF   TRISB ; yükle
        BCF   STATUS,   5 ; bank 1e geç
               
START   BTFSC   PORTB   7; B 7. biti test et 0 ise atlat
                BSF           PORTB,   0; B 0 ı set et ( ledi yak )
                GOTO   START   ;sonsuz döngüye gir   
   
        END

gibi.. zaten bu kodu incelediğinde PORT B 0'ı 0'a çeken yani söndüren bir kod  da gözükmüyor..

Zaten bu kodda sorun yok, yanlış kodu incelemişsiniz.

Hadi

#13
Alıntı yapılan: RaMu - 20 Mart 2015, 23:06:46

mesaj birleştirme:: 20 Mart 2015, 23:11:13

goto start dediği için sadece bir defa program başlangıcında kullanılıyor.

ama 2. programında
yukarıdaki mesajımda anlattığım gibi
program başa dönüp portb yi sıfırlıyor led sönüyor.


Programda portb hiç sıfırlanmayıp denenebilir.
(mcu reset ve ilk enerjilenme durumunda
portb durumuna datasheet ten bakmak lazım)

2. programda hangi komutla başa donduğunu söyler mısınız? Yoksa program END komutunu görünce tekrar başa mı döner?

Bu arada PORTB'nın sıfırlanması her iki programda da var. Onunla alakalı olduğunu sanmıyorum.

RaMu

END derleyici komutudur,
yani programı yazdığın MPLAB ide (Integrated Development Enviroment)
derleyiciyi kullanarak yazdığın asm komutlarını
pice yükleyebileceğin hex e çevirir,
bu esnada programı yazdım bitti buraya kadar
anlamını o yazdığın end den anlar
yani pice yüklenen birşey değildir bu end.


PORTB nin sıfırlanmasının neyle alakalı olduğunu sanmıyorsun,
işler iyice karıştı.

Diyorumki
1. programında (BTFSC ile yazılan)
goto ile start a gönderiyorsun,
program sonsuz döngüde
ki böyle olması lazım zaten.
Bu programda program ilk çalıştığında led sönüktür,
butona bastığında led yanar,
ve hep yanık kalır.

2. programında uzun uzun anlattığım olay olur,
bu oly neticesinde
program ilk enerji verdiğin andaki hali gibi çalışmaya başlar
yani ilk komuttan itibaren işlemeye başlar
ve clrf portb komutunu işler
buda portb yi sıfırladığı için yanmakta olan led
bu komutla doğal olarak söndürülmüş olur.
Daha devamı var ama yazmaya üşeniyorum.

Ben kısaca yapman gerekeni söyleyeyim,
programı hiçbirzaman başıboş bırakmayacaksın,
herzaman biryerde birşey yapıyor olacak,
goto oraya yoksa goto buraya
veya goto şuraya,
şunuda bol bol görebilirsin
son goto son

yapılacak hiçbirşey yoksa
boş boş hep aynı satırı işlemiş olur.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html