16f84a 7 segment titretme hatası

Başlatan AsHeS, 11 Şubat 2012, 01:35:16

AsHeS

İsis te simülasyonda sadece saati ileri geri alırken titreme yaşarken gerçekte 7 segmenti sürerken çılgınlar gibi sayılar atlıyor bazı segmentler kaybolup tekrar yanıyor 7 segmentlerin gecikme süreleri ile de oynadım fakat çok farklı bir sonuç alamadım kodu aşağıya veriyorum kodu ve hex dosyasını da upload ediyorum yardımlarınız için teşekkür ediyorum.
ISIS dosyası ve hex dosyası aşağıdadır.
http://ul.to/umg21poh
LIST     p=16f84a
	INCLUDE "P16f84A.INC"
	__CONFIG  _WDT_OFF &_XT_OSC &_PWRTE_OFF &_CP_OFF
	cblock 0x20
d1
d2
BIRLER_BAS
DAKIKA_0 
DAKIKA_1
SAAT_0
SAAT_1
ara1
ara2
hex_yuksek
hex_dusuk
w_GEC	
status_GEC 
hex_orta 
d3
	endc
	ORG 0x00
RESET
	goto BASLA
	ORG h'04'
	goto ASIL
BASLA
	banksel TRISB
	movlw h'00'
	movwf TRISB
	banksel PORTB
	clrf PORTB
	banksel TRISA
	movlw h'FF'
	movwf TRISA
	banksel PORTA
	clrf PORTA
	movlw b'10000000'
	BANKSEL OPTION_REG
	movwf OPTION_REG
	BCF STATUS,5
	BCF STATUS,6
	clrf BIRLER_BAS
	clrf DAKIKA_1
	clrf DAKIKA_0
	clrf ara1
	clrf ara2
	clrf SAAT_0
	clrf SAAT_1
	movlw b'10100000'
	movwf INTCON
	MOVLW h'07'		; 
	MOVWF hex_yuksek	; HEX_YUKSEK <- h'07'

	MOVLW h'a1'+1		;
	MOVWF hex_orta		; HEX_ORTA <- h'A1'+1

	MOVLW h'20'		; 
	MOVWF hex_dusuk	        ; HEX_DUSUK <- h'20'
	goto GOSTER	
BUTONTEST
	btfss PORTA,0
	call DAKIKAARTTIR
	btfss PORTA,1
	call SAATARTTIR
	goto GOSTER
GOSTER

	movf DAKIKA_0,w
	iorlw b'10000000'
	movwf PORTB
	nop
	call GECIKME

	movf DAKIKA_1,w
	iorlw b'01000000'
	movwf PORTB
	nop
	call GECIKME

	movf SAAT_0,w
	iorlw b'00100000'
	movwf PORTB
	nop
	call GECIKME
	
	movf SAAT_1,w
	iorlw b'00010000'
	movwf PORTB
	nop
	call GECIKME	

	goto BUTONTEST
ASIL
	bcf INTCON,GIE
	movwf w_GEC
	swapf STATUS,w
	movwf status_GEC
	swapf status_GEC,f


	TSTF hex_orta		; ilk test (HEX_ORTA==0 için)
	SKPNZ			; 
	DECF hex_yuksek,F	; 
	DECFSZ hex_orta,F	;
	GOTO CIK		;; 
	TSTF hex_yuksek	; 
	SKPZ			; 
	GOTO CIK		; 

	
	MOVLW h'07'		; 
	MOVWF hex_yuksek	; HEX_YUKSEK <- h'07'

	MOVLW h'a1' 		; 
	MOVWF hex_orta	; HEX_ORTA <- h'A1'

	MOVLW h'20'		; 
	ADDWF hex_dusuk,F	; 
	SKPNC			; 
	INCF hex_orta,F	; 

	BTFSS INTCON,T0IF		
	GOTO   CIK	
	bcf STATUS,2

	call KONTROL
		
	incf BIRLER_BAS,f
	movf BIRLER_BAS,w
	sublw d'60'
	btfss STATUS,2
	goto CIK
	clrf BIRLER_BAS
	
	incf DAKIKA_0,f
	movf DAKIKA_0,w
	sublw d'10'
	btfss STATUS,2
	goto CIK
	clrf DAKIKA_0

	incf DAKIKA_1,f
	movf DAKIKA_1,w
	sublw d'6'
	btfss STATUS,2
	goto CIK
	clrf DAKIKA_1
	
	incf SAAT_0,f
	movf SAAT_0,w
	sublw d'10'
	btfss STATUS,2
	goto CIK
	clrf SAAT_0
	
	incf SAAT_1,f
	movf SAAT_1,w
	sublw d'3'
	btfss  STATUS,2
	goto CIK
	clrf SAAT_1

CIK
	bsf INTCON,GIE
	bcf INTCON,T0IF
	swapf status_GEC,w
	movwf ara1
	swapf ara1,w
	movwf STATUS
	swapf w_GEC,w
	movwf ara1
	swapf ara1,w
	RETFIE
KONTROL
	movf DAKIKA_0,w
	sublw d'9'
	btfss STATUS,2
	return

	movf DAKIKA_1,w
	sublw d'5'
	btfss STATUS,2
	return

	movf SAAT_0,w
	sublw d'4'
	btfss STATUS,2
	return

	movf SAAT_1,w
	sublw d'2'
	btfss STATUS,2
	return

	clrf DAKIKA_0
	clrf DAKIKA_1
	clrf SAAT_0
	clrf SAAT_1
	movlw h'FF'
	movwf BIRLER_BAS
	return
		
DAKIKAARTTIR
	bcf INTCON,GIE
	clrf TMR0
	call GECIKME1
	btfsc PORTA,0
	goto DON

	incf DAKIKA_0,f
	movf DAKIKA_0,w
	sublw d'10'
	btfss STATUS,2
	goto DON
	clrf DAKIKA_0

	incf DAKIKA_1,f
	movf DAKIKA_1,w
	sublw d'6'
	btfss STATUS,2
	goto DON
	clrf DAKIKA_1
DON
	bsf INTCON,GIE
	return
SAATARTTIR	
	bcf INTCON,GIE
	clrf TMR0
	call GECIKME1
	btfsc PORTA,1
	goto DON1
	
	movf SAAT_0,w
	sublw d'3'
	btfss STATUS,2
	goto INCREASE
	
	movf SAAT_1,w
	sublw d'2'
	btfss STATUS,2
	goto INCREASE
	goto SIFIRLAMA
SIFIRLAMA
	clrf SAAT_0
	clrf SAAT_1
	goto DON1
             
INCREASE
	incf SAAT_0,f
	movf SAAT_0,w
	sublw d'10'
	btfss STATUS,2
	goto DON1
	clrf SAAT_0
	
	incf SAAT_1,f
	movf SAAT_1,w
	sublw d'3'
	btfss STATUS,2
	goto DON1
	clrf SAAT_1

	goto DON1
DON1
	bsf INTCON,GIE

	return

GECIKME
			;4998 cycles
	movlw	0xE7
	movwf	d1
	movlw	0x04
	movwf	d2
Delay_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	Delay_0

			;2 cycles
	goto	$+1		
	RETURN
GECIKME1
			;249998 cycles
	movlw	0x4F
	movwf	d1
	movlw	0xC4
	movwf	d2
Dela_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	Delay_0

			;2 cycles
	goto	$+1
	return
	END

Kabil ATICI

dosyarı yüklediğin sunucu ile ben anlaşamadım. Keşke şemanı resim olarak koysaydın (bulunduğum bilgisayarda isin yok)

programda gözüme çarpan birkaç hata olarak:
    call SAATARTTIR
    goto GOSTER
GOSTER
    movf DAKIKA_0,w
-----
    goto INCREASE
    goto SIFIRLAMA
SIFIRLAMA
    clrf SAAT_0
-----
    clrf SAAT_1

    goto DON1
DON1
    bsf INTCON,GIE

    return
-----
kesma içini baya uzun tutmuşsun. Umarım gecikmesini hesaba katmışsındır. Saatin geri kalabilir.

    movf SAAT_1,w (sanırım ekran sürmek için kod çözücü kullanılıyor.)
    movwf PORTB
bcf portb.4
    call GECIKME
bsf portb,4

şeklide olabilir.
goto   $+1 için nop komutunu kullanabilridin.

alt program başlık açılamalarını ve önemli noktalarına açıklama yap. Bulmaca çözmek zor oluyor.


ambar7

AsHeS

Şema aşağıda ki gibi hocam bugün bende kurcalıyacam düşüncem kesmenin içinin aşırı kabarık olması ve kontrol döngülerinin çok fazla üzerinden geçmesi diye düşünüyorum 1-2 tane değişiklik yapıp arttırma komutlarını kesmenin dışına almaya çalışacağım.

AsHeS

#3
Kodu aşağıda ki gibi biraz kurcaladım titreme baya azaldı fakat yine de sayıları displaye basarken 7 segmentin en sağ tarafta ki üst üste iki led i  kıprıyor.
Bu arada göstergeleri anahtarlamak için bc237 kullandım sorun olur mu ki acaba ?
LIST     p=16f84a
	INCLUDE "P16f84A.INC"
	__CONFIG  _WDT_OFF &_XT_OSC &_PWRTE_OFF &_CP_OFF
	cblock 0x20
d1
d2
BIRLER_BAS
DAKIKA_0 
DAKIKA_1
SAAT_0
SAAT_1
ara1
ara2
hex_yuksek
hex_dusuk
w_GEC	
status_GEC 
hex_orta 
d3
	endc
	ORG 0x00
RESET
	goto BASLA
	ORG h'04'
	goto ASIL
BASLA
	banksel TRISB
	movlw h'00'
	movwf TRISB
	banksel PORTB
	clrf PORTB
	banksel TRISA
	movlw h'FF'
	movwf TRISA
	banksel PORTA
	clrf PORTA
	movlw b'10000010'
	BANKSEL OPTION_REG
	movwf OPTION_REG
	BCF STATUS,5
	BCF STATUS,6
	clrf BIRLER_BAS
	clrf DAKIKA_1
	clrf DAKIKA_0
	clrf ara1
	clrf ara2
	clrf SAAT_0
	clrf SAAT_1
	movlw b'10100000'
	movwf INTCON
	MOVLW h'01'		; 
	MOVWF hex_yuksek	; HEX_YUKSEK <- h'07'

	MOVLW h'e8'+1		;
	MOVWF hex_orta		; HEX_ORTA <- h'A1'+1

	MOVLW h'48'		; 
	MOVWF hex_dusuk	        ; HEX_DUSUK <- h'20'
	goto GOSTER	
BUTONTEST
KONTROL
	movf SAAT_1,w
	sublw d'2'
	btfss STATUS,2
	goto GOSTER

	movf SAAT_0,w
	sublw d'3'
	btfss STATUS,2
	goto GOSTER
	
	movf DAKIKA_1,w
	sublw d'5'
	btfss STATUS,2
	goto GOSTER

	movf DAKIKA_0,w
	sublw d'9'
	btfss STATUS,2
	goto GOSTER	

	clrf DAKIKA_0
	clrf DAKIKA_1
	clrf SAAT_0
	clrf SAAT_1

GOSTER
	btfss PORTA,0
	call DAKIKAARTTIR
	btfss PORTA,1
	call SAATARTTIR

	movf DAKIKA_0,w
	iorlw b'10000000'
	movwf PORTB
	nop
	call GECIKME

	movf DAKIKA_1,w
	iorlw b'01000000'
	movwf PORTB
	nop
	call GECIKME

	movf SAAT_0,w
	iorlw b'00100000'
	movwf PORTB
	nop
	call GECIKME
	
	movf SAAT_1,w
	iorlw b'00010000'
	movwf PORTB
	nop
	call GECIKME	

	goto BUTONTEST
ASIL
	bcf INTCON,GIE
	movwf w_GEC
	swapf STATUS,w
	movwf status_GEC
	swapf status_GEC,f


	TSTF hex_orta		; ilk test (HEX_ORTA==0 için)
	SKPNZ			; 
	DECF hex_yuksek,F	; 
	DECFSZ hex_orta,F	;
	GOTO CIK		;; 
	TSTF hex_yuksek	; 
	SKPZ			; 
	GOTO CIK		; 

	
	MOVLW h'01'		; 
	MOVWF hex_yuksek	; HEX_YUKSEK <- h'07'

	MOVLW h'e8' 		; 
	MOVWF hex_orta	; HEX_ORTA <- h'A1'

	MOVLW h'48'		; 
	ADDWF hex_dusuk,F	; 
	SKPNC			; 
	INCF hex_orta,F	; 

	BTFSS INTCON,T0IF		
	GOTO   CIK	
	bcf STATUS,2

		
	incf BIRLER_BAS,f
	movf BIRLER_BAS,w
	sublw d'60'
	btfss STATUS,2
	goto CIK
	clrf BIRLER_BAS
	
	incf DAKIKA_0,f
	movf DAKIKA_0,w
	sublw d'10'
	btfss STATUS,2
	goto CIK
	clrf DAKIKA_0

	incf DAKIKA_1,f
	movf DAKIKA_1,w
	sublw d'6'
	btfss STATUS,2
	goto CIK
	clrf DAKIKA_1
	
	incf SAAT_0,f
	movf SAAT_0,w
	sublw d'10'
	btfss STATUS,2
	goto CIK
	clrf SAAT_0
	
	incf SAAT_1,f
	movf SAAT_1,w
	sublw d'3'
	btfss  STATUS,2
	goto CIK
	clrf SAAT_1

CIK
	bsf INTCON,GIE
	bcf INTCON,T0IF
	swapf status_GEC,w
	movwf ara1
	swapf ara1,w
	movwf STATUS
	swapf w_GEC,w
	movwf ara1
	swapf ara1,w
	RETFIE

		
DAKIKAARTTIR
	bcf INTCON,GIE
	clrf TMR0
	call GECIKME1
	btfsc PORTA,0
	goto DON

	incf DAKIKA_0,f
	movf DAKIKA_0,w
	sublw d'10'
	btfss STATUS,2
	goto DON
	clrf DAKIKA_0

	incf DAKIKA_1,f
	movf DAKIKA_1,w
	sublw d'6'
	btfss STATUS,2
	goto DON
	clrf DAKIKA_1
DON
	bsf INTCON,GIE
	return
SAATARTTIR	
	bcf INTCON,GIE
	clrf TMR0
	call GECIKME1
	btfsc PORTA,1
	goto DON1
	
	movf SAAT_1,w
	sublw d'2'
	btfss STATUS,2
	goto INCREASE
	
	movf SAAT_0,w
	sublw d'3'
	btfss STATUS,2
	goto INCREASE
SIFIRLAMA
	clrf SAAT_0
	clrf SAAT_1
	goto DON1
             
INCREASE
	incf SAAT_0,f
	movf SAAT_0,w
	sublw d'10'
	btfss STATUS,2
	goto DON1
	clrf SAAT_0
	
	incf SAAT_1,f
	movf SAAT_1,w
	sublw d'3'
	btfss STATUS,2
	goto DON1
	clrf SAAT_1

	goto DON1
DON1
	bsf INTCON,GIE

	return

GECIKME
			;3998 cycles
	movlw	0x1F
	movwf	d1
	movlw	0x04
	movwf	d2
Delay_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	Delay_0

			;2 cycles
	goto	$+1	
	RETURN
GECIKME1
			;249998 cycles
	movlw	0x4F
	movwf	d1
	movlw	0xC4
	movwf	d2
Dela_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	Delay_0

			;2 cycles
	goto	$+1
	return
	END

kaypic38

Bir şeyi gerçekten öğrenmek, yapmak istiyorsan o şeyi yapmışsın, öğrenmişsin demektir...

kaypic38

clrf BIRLER_BAS
    clrf DAKIKA_1
    clrf DAKIKA_0
    clrf ara1
    clrf ara2
    clrf SAAT_0
    clrf SAAT_1

amaç nedir burada ?
Bir şeyi gerçekten öğrenmek, yapmak istiyorsan o şeyi yapmışsın, öğrenmişsin demektir...

AsHeS

Alıntı yapılan: kaypic38 - 11 Şubat 2012, 19:04:26
clrf BIRLER_BAS
    clrf DAKIKA_1
    clrf DAKIKA_0
    clrf ara1
    clrf ara2
    clrf SAAT_0
    clrf SAAT_1

amaç nedir burada ?
Bir şekilde benim atadığım adreste 0 olmayan bir bit olursa diye önlem olarak onları baştan sıfırlıyorum.Çünkü derleyici sıfır atamama riski var benim aldığım adreslere o da önlem yani :)

kaypic38

Bence gereksiz işlemciyi boşuna yoruyorsun bir sefer dene derleyici sorun çıkarmıyorsa ki mplab kullanıyorsan çıkartmaz yazmana gerek yok sonuçta derleyici senin yazmadığın hiç bir işlemi yazılmış sayıp hexe çevirmiyor.
Bir şeyi gerçekten öğrenmek, yapmak istiyorsan o şeyi yapmışsın, öğrenmişsin demektir...

AsHeS

#8
Alıntı yapılan: kaypic38 - 11 Şubat 2012, 19:49:07
Bence gereksiz işlemciyi boşuna yoruyorsun bir sefer dene derleyici sorun çıkarmıyorsa ki mplab kullanıyorsan çıkartmaz yazmana gerek yok sonuçta derleyici senin yazmadığın hiç bir işlemi yazılmış sayıp hexe çevirmiyor.
İyi de sizin önerdiğiniz yöntemin garantisi yok ya derleyici kafasına göre sayı atarsa adrese olmayacak birşey değil riske girmek yerine 7 us harcayarak bu komutları 1 kez harcamak mantıklı geliyor ki hangi assembly koduna bakarsanız %90 ı atanan değişkenlerin bununla başlar zaten benim sorunumun bununla pek bir alakası yok.Ayrıca derleyiciler dediğiniz gibi yapmadığım işlemi hex e çevirmez yani o sayıya birşey atamadıysam ilk kez sayıyı çağırdığım da belirsizlikten başka hiçbirşey olmaz daha da kötüsü eğer 0 dan farklı birşey atadığında 7 segmentte ne göreceğinizi bile tespit edemezsiniz.

kaypic38

#9
Hocam farkındayım soru bu değil fakat düzeltmek istedim yerinizde olsam ki bana bu tür yorumlar yapılınca direkt deniyorum direkt denerim size en az 50 tane kendi yazdığım ve program içerisinde kendi atadığım registerlara kullanacağım satıra gelene kadar hiç bir değer girmediğim program yazabilirim ve hepside sorunsuz çalışıyor şöyle düşünün equ komutu ile örneğin BUS diye bir register atadınız adresi xxxx olsun bu adrese bir şey atamadığınız da yani BUS'ı oluşturduğunuzda içine bir veri girmediğiniz de kullanılmaz peki xxxx adresine hiç bir register atamadığınızda boş olduğunda ne olur ? Aynısı olur yine kullanılmaz örneğin bir 16f84 entegresi için basit başlangıç programlarına bakıldığında sadece portb kullanılacaksa sadece portb ve trisb ile işlem görülür fakat sizin mantıkla porta da için kendi kendine değerler alabilir o zaman onuda sıfırlayalım ayrıca özel registerlar var bu registerların kendi kendilerine değer almaları çok büyük bir sorun teker teker hepsini sıfırlayalım o zaman. Bence hiç gereği yok çok fazla register kullanacağınız zaman sadece boşa komut yazmış olursunuz.
Bir şeyi gerçekten öğrenmek, yapmak istiyorsan o şeyi yapmışsın, öğrenmişsin demektir...

AsHeS

sizin öneriniz yanlış anlamadıysam clrf ara1 ve clrf ara2 yi neden kullandığıma yönelik bazı kodları 1 kere yazdıktan sonra blok halinde kopyalıyorum.Onlara da bakmıyorum sonradan

kaypic38

#11
    banksel TRISB
    movlw h'00'
    movwf TRISB
    banksel PORTB
    clrf PORTB
    banksel TRISA
    movlw h'FF'
    movwf TRISA
    banksel PORTA
    clrf PORTA
    movlw b'10000000'
    BANKSEL OPTION_REG
    movwf OPTION_REG
    BCF STATUS,5
    BCF STATUS,6
    clrf BIRLER_BAS
    clrf DAKIKA_1
    clrf DAKIKA_0
    clrf ara1
    clrf ara2
    clrf SAAT_0
    clrf SAAT_1

Hocam bak burada örneğin CLRF PORTB komutu senin amaçladığın şeyi yapması için 4 satır üste başla etiketinden sonra gelen ilk komut olarak yazılmalı aynı şekilde CLRF PORTA ama bence gereksiz özellikle
clrf BIRLER_BAS
    clrf DAKIKA_1
    clrf DAKIKA_0
    clrf ara1
    clrf ara2
    clrf SAAT_0
    clrf SAAT_1

bu satırlar çok gereksiz ilerde çok fazla onlarca register atayıp kullanmanız gerektiğinde sadece komut fazlalığı olur.
Bir şeyi gerçekten öğrenmek, yapmak istiyorsan o şeyi yapmışsın, öğrenmişsin demektir...

kaypic38

#12
.
Bir şeyi gerçekten öğrenmek, yapmak istiyorsan o şeyi yapmışsın, öğrenmişsin demektir...

kaypic38

#13
.
Bir şeyi gerçekten öğrenmek, yapmak istiyorsan o şeyi yapmışsın, öğrenmişsin demektir...

AsHeS

Alıntı yapılan: kaypic38 - 12 Şubat 2012, 10:00:09
    banksel TRISB
    movlw h'00'
    movwf TRISB
    banksel PORTB
    clrf PORTB
    banksel TRISA
    movlw h'FF'
    movwf TRISA
    banksel PORTA
    clrf PORTA
    movlw b'10000000'
    BANKSEL OPTION_REG
    movwf OPTION_REG
    BCF STATUS,5
    BCF STATUS,6
    clrf BIRLER_BAS
    clrf DAKIKA_1
    clrf DAKIKA_0
    clrf ara1
    clrf ara2
    clrf SAAT_0
    clrf SAAT_1

Hocam bak burada örneğin CLRF PORTB komutu senin amaçladığın şeyi yapması için 4 satır üste başla etiketinden sonra gelen ilk komut olarak yazılmalı aynı şekilde CLRF PORTA ama bence gereksiz özellikle
clrf BIRLER_BAS
    clrf DAKIKA_1
    clrf DAKIKA_0
    clrf ara1
    clrf ara2
    clrf SAAT_0
    clrf SAAT_1

bu satırlar çok gereksiz ilerde çok fazla onlarca register atayıp kullanmanız gerektiğinde sadece komut fazlalığı olur.
Sizin önerdiğiniz şey eğer yanlış anlamdıysam SAAT_0 ı ellemeyeyim içeride 70 gibi bi rakam atasın program başlasın ben ilk müdaheleyi yapana kadar saatin üzerinde garip şekillere muhattap olayım hatta benim yazdığım kontrol döngülerine girdiğinde neyle karşılaşacağımı bile bilmiyorum çünkü farkettiyseniz saat_1 sayısı 2 yi geçtiği zaman kontrol döngüsü sıfırlamasını istedim bu yapıyla 70-2 kontrol döngüsü asla sıfırlamıyacaktır.Kısacası size de önerim hangi dil de  yazıyorsanız yazın (bilgisayar  için C de de aynı yöntemi kullandım)eğer bir değişken atarsanız içeriğini sıfırdan başlatmanız olacaktır aksi takdirde programınızda istem dışı durumlarla karşılaşırsınız.