P16 da 0 dan 9 a kadar sayan program yardim...

Başlatan mabool, 14 Ocak 2011, 22:30:30

mabool

ornek programda 7 segment displayde 0 dan f e kadar sayip tekrar 0 a gecip dongu seklinde devam eden programin kodlari asagidaki gibidir ve programin mantigini kodlarin nasil ve neden kulanildigini gayet guzel anladim

LIST         P=16F628A
INCLUDE         "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF

SAYAC1      EQU      H'20'
SAYAC2      EQU      H'21'
DALLAN      EQU      H'22'
   ORG            H'00'
   CLRF         PORTB
   BANKSEL         TRISB
   CLRF         TRISB
   BANKSEL         PORTB
BASLA   
   MOVLW         H'00'
   MOVWF         DALLAN
DONGU   
   MOVF         DALLAN,W
   ANDLW         B'00001111'
   CALL         CEV7SEG
   MOVWF         PORTB
   INCF         DALLAN,F
   CALL         GECIKME
   GOTO         DONGU
CEV7SEG
   ADDWF         PCL,F
   RETLW         H'3F'
   RETLW         H'06'
   RETLW         H'5B'
   RETLW         H'4F'
   RETLW         H'66'
   RETLW         H'6D'
   RETLW         H'7D'
   RETLW         H'07'
   RETLW         H'7F'
   RETLW         H'6F'
   RETLW         H'77'
   RETLW         H'7C'
   RETLW         H'39'
   RETLW         H'5E'
   RETLW         H'79'
   RETLW         H'71'
GECIKME
   MOVLW         H'FF'
   MOVWF         SAYAC1
DONGU1
   MOVLW         H'FF'
   MOVWF         SAYAC2
DONGU2
   DECFSZ         SAYAC2,F
   GOTO         DONGU2
   DECFSZ         SAYAC1,F
   GOTO         DONGU1
RETURN
END

kendiniz deneyiniz bolumunde ise 0 dan 9 a kadar sayan programi kendiniz yapiniz demistir bende asagidaki gibi degisiklikler yaptim fakan 9-8-8. yapiyor bi mudet bekliyor sonra 1-9-8-8. seklinde dongu devam ediyor
1. burada yukaridaki gibi andlw komutunu kulanmamin benim bi isime yaramica kanisina vardim bu dogru mu?
2.onun yerine xorlw ile karsilastirma yaptim eger sayi 9 yani 1001 olunca statusun zero bayraginin 1 olmasindan faydalanarak programi istedigim yere cekmi denedim fakat basaramadim xorwf burada kulanarak hata mi ettim onun yerine ne kullanmaliydim?tesekkurler....

LIST         P=16F628A
INCLUDE         "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF

SAYAC1      EQU      H'20'
SAYAC2      EQU      H'21'
DALLAN      EQU      H'22'
   ORG            H'00'
   CLRF         PORTB
   BANKSEL         TRISB
   CLRF         TRISB
   BANKSEL         PORTB
BASLA   
   MOVLW         H'00'
   MOVWF         DALLAN
DONGU   
   MOVF         DALLAN,W
   XORLW         B'00001001'
   BTFSC         STATUS,2
   GOTO         BASLA
   CALL         CEV7SEG
   MOVWF         PORTB
   INCF         DALLAN,F
   CALL         GECIKME
   GOTO         DONGU
CEV7SEG
   ADDWF         PCL,F
   RETLW         H'3F'
   RETLW         H'06'
   RETLW         H'5B'
   RETLW         H'4F'
   RETLW         H'66'
   RETLW         H'6D'
   RETLW         H'7D'
   RETLW         H'07'
   RETLW         H'7F'
   RETLW         H'6F'
GECIKME
   MOVLW         H'FF'
   MOVWF         SAYAC1
DONGU1
   MOVLW         H'FF'
   MOVWF         SAYAC2
DONGU2
   DECFSZ         SAYAC2,F
   GOTO         DONGU2
   DECFSZ         SAYAC1,F
   GOTO         DONGU1
RETURN
END

ipek

gece yarısı bende anlamadım biraz uzattım programı ayarıca gecikme rutinin çok hızlı..

LIST P=16F628A
INCLUDE "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF

SAYAC1 EQU H'20'
SAYAC2 EQU H'21'
DALLAN EQU H'22'
   ORG H'00'
   CLRF PORTB
   BANKSEL TRISB
   CLRF TRISB
   BANKSEL PORTB
BASLA


;1.ADIM
   MOVLW   H'3F'
   MOVWF   PORTB      ;AKUDEKI SAYI PORTB YE YUKLENIR
   CALL   GECIKME   ;  BEKLETME

;2.ADIM
   MOVLW   H'06'
   MOVWF   PORTB      
   CALL   GECIKME    

;3.ADIM
   MOVLW   H'5B'
   MOVWF   PORTB      
   CALL   GECIKME    

;4.ADIM
   MOVLW   H'4F'
   MOVWF   PORTB      
   CALL   GECIKME   

;5.ADIM
   MOVLW   H'66'
   MOVWF   PORTB      
   CALL   GECIKME   

;6.ADIM
   MOVLW   H'6D'
   MOVWF   PORTB      
   CALL   GECIKME   

;7.ADIM
   MOVLW   H'7D'
   MOVWF   PORTB      
   CALL   GECIKME   

;8.ADIM
   MOVLW   H'07'
   MOVWF   PORTB      
   CALL   GECIKME   

;9.ADIM
   MOVLW   H'7F'
   MOVWF   PORTB      
   CALL   GECIKME   

;10.ADIM
   MOVLW   H'6F'
   MOVWF   PORTB      
   CALL   GECIKME   

   GOTO BASLA      ;ALGORITMA TEKRARLANIR


GECIKME
   MOVLW H'FF'
   MOVWF SAYAC1
DONGU1
   MOVLW H'FF'
   MOVWF SAYAC2
DONGU2
   DECFSZ SAYAC2,F
   GOTO DONGU2
   DECFSZ SAYAC1,F
   GOTO DONGU1
   RETURN
   END

Tagli

mabool, sorunun XORLW işleminin tabloya gitmeden önce W'nin içini değiştirmesinden kaynaklanıyor, yani tabloya giderken W'nin içinde ihtiyaç duyduğun sıra numarası değil XOR'dan sonraki karşılaştırma sonucun kalmış oluyor.

Adamın yöntemi ilginç, benim aklıma gelmezdi açıkçası. Ancak sadece 2'nin kuvveti bir sayı için geçerli. Tabloya doğru sayı ile gitmek için bir register'ı sayaç olarak kullan. Karşılaştırma yöntemin doğru. Yapman gereken şey tabloya gitmeden hemen önce sayaç içindeki değeri W'ye almak. Hatta bunu CALL'dan hemen sonra, yani tablonun başında da yapabilirsin.
Gökçe Tağlıoğlu

bigbey

İlgili bölümü şu şekilde yapabilirsiniz.
   
BASLA   
	CLRF	DALLAN
DONGU   
	MOVFW	DALLAN
	CALL    CEV7SEG
	MOVWF	PORTB
	INCF	DALLAN,F
	MOVLW	.10
	XORWF	DALLAN,W
	BTFSC	STATUS,Z
	CLRF	DALLAN	
	CALL    GECIKME
	GOTO	DONGU
TA6R

mabool

yardimlariniz icin hepinize tesekkurler en son ornek aradigim seydi sanirim hatami anladim yalniz tek bi sorun var 9 dan sonra displayin tum segmentleri yaniyor sonrasinda 1 den tekrar basliyor

Tagli

Ama normalde 0'dan başlaması gerekiyor öyle değil mi? Programın son halini ekle, bir bakalım. 0'la tüm segmentlerin yanması arasında sadece bir segment fark var. Tablo değerinde bir dikkatsizlik yapmış olabilir misin? Gerçi yukarıda verdiğin kodda sorun yok gibiydi.
Gökçe Tağlıoğlu

mabool

#6
programin son hali simdiden tesekkurler (hepsi ynaiyor arti nokta isaretide)

LIST         P=16F628A
INCLUDE         "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF

SAYAC1      EQU      H'20'
SAYAC2      EQU      H'21'
DALLAN      EQU      H'22'
   ORG            H'00'
   CLRF         PORTB
   BANKSEL         TRISB
   CLRF         TRISB
   BANKSEL         PORTB
BASLA   
   MOVLW         H'00'
   MOVWF         DALLAN
DONGU   
   MOVF         DALLAN,W
   CALL         CEV7SEG
   MOVWF         PORTB
   INCF         DALLAN,F
   MOVLW         H'10'
   XORWF         DALLAN,W
   BTFSC         STATUS,2
   CLRF         DALLAN
   CALL         GECIKME
   GOTO         DONGU
CEV7SEG
   ADDWF         PCL,F
   RETLW         H'3F'
   RETLW         H'06'
   RETLW         H'5B'
   RETLW         H'4F'
   RETLW         H'66'
   RETLW         H'6D'
   RETLW         H'7D'
   RETLW         H'07'
   RETLW         H'7F'
   RETLW         H'6F'
GECIKME
   MOVLW         H'FF'
   MOVWF         SAYAC1
DONGU1
   MOVLW         H'FF'
   MOVWF         SAYAC2
DONGU2
   DECFSZ         SAYAC2,F
   GOTO         DONGU2
   DECFSZ         SAYAC1,F
   GOTO         DONGU1
RETURN
END

Tagli

Bu ikiliyi

MOVLW         H'10'
XORWF         DALLAN,W


şu şekilde yazmayı dene:

MOVLW         D'10'
SUBWF         DALLAN,W


Bazen standart çözümler hata yapmaya karşı daha korumalı oluyor. Bir kaç us kazanmak için riske girmeye gerek olmayabilir.
Gökçe Tağlıoğlu

mabool

Alıntı yapılan: Tagli - 15 Ocak 2011, 15:17:10
Bu ikiliyi

MOVLW         H'10'
XORWF         DALLAN,W


şu şekilde yazmayı dene:

MOVLW         D'10'
SUBWF         DALLAN,W


Bazen standart çözümler hata yapmaya karşı daha korumalı oluyor. Bir kaç us kazanmak için riske girmeye gerek olmayabilir.


hay allah ya simdi senin ornekten dank etti neden h10 demisimki ha demem lazimdi :D ama senin subwf de oluyor tekrar tesekkurler

Tagli

Sayı 10 olmuş mu diye karşılaştırmak için kullanılıyor. DALLAN'dan 10 çıkarıp sonuç 0 mı diye bakıyoruz. Aslında senin yaptığın şekli de doğru. Çünkü bir sayının kendisiyle XOR işlemine sokulması durumda sonuç 0 olur. Bir anlık dikkatsizliğime denk gelmiş...
Gökçe Tağlıoğlu