DECFSZ KOMUTU ÇALIŞMIYOR

Başlatan cirak05, 31 Temmuz 2011, 15:14:08

cirak05

Merhaba

Kare dalga sinyalini saymak için aşağıdaki kodu yazdım ama proteus da çalışmıyor. Devrede mi hata var yazılımda mı anlamadım?

DECFSZ komutu işlem yapmıyor sanki...

Bir fikri olan var mı acaba?

Teşekkürler.


LIST	P=16F84A
		INCLUDE "P16F84.INC"


SAYAC		EQU	h'0C'			;SAYAC register adresi		

		CLRF 	PORTB			
		BSF	STATUS, 5		
		CLRF	TRISB			
		MOVLW	H'FF'
		MOVWF	TRISA
		BCF	STATUS, 5

BASLA
		MOVLW	D'100'			;W register'a 100 sayısını ata
		MOVWF	SAYAC			;W register içeriğini SAYAC değişkenine ata

TEST
		BTFSC	PORTA,4			;PORTA 4. biti 0 mı?
		GOTO 	TEST			;TEST'e git
		
		DECFSZ	SAYAC,F			;SAYAC'tan 1 eksilt, sonuç 0 olunca sonraki komuta atla
		GOTO	TEST			;TEST'e git

		MOVLW	H'FF'			;W register'a h'55' sayısını ata
		MOVWF	PORTB			;W register içeriğini PORTB'ye ata
DONGU
		GOTO	DONGU
			
		END


[IMG]http://img42.imageshack.us/img42/6166/devre.th.jpg[/img]

Uploaded with ImageShack.us

volkii

TEST      

BTFSC   PORTA,4         ;PORTA 4. biti 0 mı?      
GOTO    TEST         ;TEST'e git            

nop

TEST2

BTFSS   PORTA,4         ;PORTA 4. biti 1 mı?      
GOTO    TEST2         ;TEST'e git

nop   

DECFSZ   SAYAC,F         ;SAYAC'tan 1 eksilt, sonuç 0 olunca sonraki komuta atla   
GOTO   TEST         ;TEST'e git      

MOVLW   H'FF'         ;W register'a h'55' sayısını ata      
MOVWF   PORTB         ;W register içeriğini PORTB'ye ata

test alt programını bu şekilde değiştirirmisiniz. reel uygulamada, nop yazdığım yerlerde daha parazitleri bastırma açısından sayacağınız frekansa uygun bir bekleme koyarsanız daha iyi olur

cirak05

Yok maalesef,  olmadı....

Teşekkürler.

-Hasan-

Yanlış anlamadıysam PORTA,4 ' ten 100 tane pals aldıktan sonra PORTB ' ye 0xFF vermek istiyorsunuz.

cirak05

#4
Evet...

Anlamadığım nokta problem yazılımda mı yoksa proteusta mı?

-Hasan-

Yazılımını inceledim ancak ben hiçbir hata bulamadım, gayet mantıklı. Biraz önce ben de proteusta denedim ve hemen ilk palste PORTB=FF oldu, sende de mi böyle oluyor?

cirak05

Aynen öyle hiç saymadan hemen ledleri yakıyor.

-Hasan-

Kardeşim o zaman kesinlikle proteusun hatasıdır. Proteus beni de sık sık yanıltıyor. Bir devre gerçekte farklı, proteusta farklı çalışabiliyor. Gerçek devrede denemeni tavsiye ederim.

Önemli:
Eğer palsleri buton ile vereceksen mutlaka palsi aldıktan sonra 100-200 Ms bekleme yaptır. Buton arkları yüzünden 100 pals daha gelmeden PORTB=FF olabilir.

Kolay gelsin.

cirak05

Evet mecburen deneyeceğiz.

Palsleri düzgün sinyal veren bir yerden alırsam (Örneğin 555'li kare dalga osilatör gibi...) yinede gecikme vermeli miyim?

Bir de volkii arkadaşın verdiği kodlarla benim yazdığım kodlar arasında hangisi daha doğru olur acaba?

Teşekkürler.

-Hasan-

Alıntı YapPalsleri düzgün sinyal veren bir yerden alırsam (Örneğin 555'li kare dalga osilatör gibi...) yinede gecikme vermeli miyim?

Hayır, o zaman gecikme vermene gerek kalmaz.

Alıntı YapBir de volkii arkadaşın verdiği kodlarla benim yazdığım kodlar arasında hangisi daha doğru olur acaba?

Sen kendi yazdığın kodları kullan, çünkü; volkii arkadaş düşen kenarı aldıktan sonra tekrar sinyalin 1 ' e çıkmasını beklemiş, bu yöntem genellikle pals genişliği ölçme işlemlerinde kullanılır, senin yapmak istediğin sadece palsleri saymak olduğu için kendi kodlarını kullanabilirsin.

cirak05


volkii

sen sinyalin sıfır olma durumunu bekliyorsun. sinyal sıfır oldu diyelim ee sonra ne olacak? sinyalin bir olma durumunu bekleyeceksin ki bir periyot tamamlansın. ayrıca senin kare dalganın periyodu 1ms olsun diyelim. sinyal sıfıra düştü, sayaç 99 oldu. test döngüsünün başına geldin tekrardan ve giriş sinyalinin sıfır olmuş olmamış tekrar kontrol ettin ama sinyal hala sıfırda, tekrar sayacını 1 azaldı 98 oldu. bu böylece bir çırpıda sen anlayamadan 0'a kadar düşecek. bu nedenle bu programda sinyalin hem sıfır hemde bir olma durumunu okuman gerekiyor. programın diğer kısımlarını (port ayarlamalarını vs.) kontrol etmenizi öneririm

-Hasan-

#12
Alıntı yapılan: volkii - 01 Ağustos 2011, 00:51:16
sen sinyalin sıfır olma durumunu bekliyorsun. sinyal sıfır oldu diyelim ee sonra ne olacak? sinyalin bir olma durumunu bekleyeceksin ki bir periyot tamamlansın. ayrıca senin kare dalganın periyodu 1ms olsun diyelim. sinyal sıfıra düştü, sayaç 99 oldu. test döngüsünün başına geldin tekrardan ve giriş sinyalinin sıfır olmuş olmamış tekrar kontrol ettin ama sinyal hala sıfırda, tekrar sayacını 1 azaldı 98 oldu. bu böylece bir çırpıda sen anlayamadan 0'a kadar düşecek. bu nedenle bu programda sinyalin hem sıfır hemde bir olma durumunu okuman gerekiyor. programın diğer kısımlarını (port ayarlamalarını vs.) kontrol etmenizi öneririm

volkii arkadaşım çok haklısın; eğer sinyal 1 ' e çıkmadan tekrar komut işlenirse fazla sayımış olur. İşin orasını düşünemedim; arkadaşın şemasında PORTA,4 ' te buton olduğu için sinyalin buton ile verileceği yerleşmiş kafama. :)

ekucuk arkadaşım eğer sinyali butondan vereceksen kendi programına bir ark söndürme gecikmesi ekle. Eğer 555, sinyal jeneratörü vb. gibi doğru sinyal veren bir yerden alacaksan programını volkii arkadaşın verdiği şekilde düzenle.