pic16f628a tek buton ledlerin hareketinin kontrolunde sorun

Başlatan erendil, 14 Ekim 2013, 17:20:50

erendil

Arakadaşlar kusura bakmayın fikrinizi almam lazım. porta nın son bitini giriş olarak alıp her basıldığında bir sonraki fonksiyona geçiş yaptırmaya çalışıyorum.diğerlerini (topl ve blokla) yazmadım.  Şimdi ben b0-b1 ledlerini yakıp porta 6. bitine kadar kaydırıp sonra tersinde kaydırmaya çalışıyorum buna KIT adlı etiketi verdim. Fakat porta dan portbye atlarken kullandığım Status,0 yani cary bitinde bir sorun var sanırsam proteusda portb 0-1 bitler yanarken cary bitini her defasında test ettiği için  2. bite geçince donup o şekilde kalıyor. ama çözemedim olayı bir türlü yardımcı olursanız sevineceğim. SAYGILARIMLA



LIST P=P16F628A
				INCLUDE P16F628A.INC
				__CONFIG  _LVP_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _WDT_OFF & _DATA_CP_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON
				#DEFINE DUGME PORTA,7
		ORG 	H'00'
S1 		EQU 	H'0D'	; BIRINCI SAYI DEGERI
S2 		EQU 	H'13'
S3		EQU		H'14'
S4		EQU		H'1B'
		CLRF 	PORTB		; PORTBYI TEMIZLEDIM	
		CLRF 	PORTA
		BANKSEL TRISB
		CLRF 	TRISB	
		MOVLW	H'80' ; porta en son bit giris olarak ata diğerleri çıkış
		MOVWF	TRISA
		BANKSEL	PORTB
		MOVLW	H'07'
		MOVWF	CMCON
MAIN	
		BTFSS	DUGME
		CALL	KIT
		BTFSS	DUGME
		CALL 	TOPL
		BTFSS	DUGME
		CALL	BLOKLA
KIT
		MOVLW	H'03
		MOVWF	PORTB 
DONGU1	RLF		PORTB,1
		CALL	GEC1
		BTFSS	STATUS,0 ; CARY BITI TEST ET 1 SE SATIR ATLA
		GOTO 	DONGU1
		MOVLW	H'03'
		MOVWF	PORTA
DONGU2	RLF		PORTA,1
		CALL	GEC1
		BTFSS 	PORTA,6
		GOTO	DONGU2
DONGU3	RRF		PORTA,1
		CALL	GEC1
		BTFSS 	PORTA,0
		GOTO	DONGU3
		MOVLW	H'C0'
		MOVWF	PORTB
DONGU4	RRF 	PORTB,1
		CALL	GEC1
		BTFSS 	PORTB,0
		GOTO	DONGU4
		BTFSS	DUGME
		GOTO 	KIT	
		RETURN
TOPL				;daha yazmadım ilk bölüm çalışırsa buraya devam etcem 
		NOP
		RETURN
BLOKLA				;daha yazmadım ilk bölüm çalışırsa buraya devam etcem 
		NOP
		RETURN
GEC1 				; geciktirme
		MOVLW 	H'89'
		MOVWF	 S1
DO1		
		MOVLW 	H'89'
		MOVF 	S2
DO2		
		DECFSZ 	S2,F
		GOTO 	DO2
		DECFSZ	S1,F
		GOTO 	DO1
		RETURN	
		END

RaMu

Proteus simulasyonunu ve
kodların mplab proje dosyası halinde hazırladıysan
o şeklini eklesen öyle baksak
daha kolay olur bizim için
bizde deneyelim görelim ne oluyor şeman nasıl bakalım.

Şimdilik

DO1      
        MOVLW    H'89'
        MOVF    S2


burada
      MOVWF     S2
olacak hata var, gecikme süresi farklı olur ama
asıl sıkıntı movf komutu eğer movf  s2 dediğinde
s2 nin içinde ne varsa s2 ye yazıyor diye gözükür
bunun yanında aslında movf  portb  ( veya movf  portx,F) şeklinde kullanılır
burada eğer portx veya movf in karşısına yazılan değişken in içeriği sıfır ise
status un zero (sıfır) bayrağı set olur,
gecikme ilk defa çağrıldığında s2 nin içinde ne var bilmiyorum fakat
gecikme 2. defa çağrıldığında artık s2 nin içi kesin sıfır durumunda olur
bu sefer z bayrağı set olur yani
bunların senin program için şimdilik bir etkisi yok sanırım
demek istediğim aslında küçük bir hata çok farklı sonuçlara yol açabilir,
misal şuanda senin gecikme döngün s2 ye 256 yüklenebilmiş gibi davranıyor.

Bence asıl mesele şu bir dene onun nedeninide sonra yazalım çalışırsa program,

RLF      PORTB,1

satırı yerine şu üç satırı yaz

RLF      PORTB,W    ;portb içeriğini w registerına al
NOP
MOVWF                PORTB         ;w içeriğini portb ye yaz


birde her ihtimale karşı DONGU1 etiketinden hemen önce
BCF STATUS,C
diyerek carry bayrağını silsen baştan iyi olur,
yani KIT etiketinin hemen sonuna bunu yazabilirsin.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

erendil

dediklerinizi inceledim ufak tefek düzeltmeler yaptım artık hiç tepki vermiyor nasıl ölümcül bir hata yaptığımı bir görebilsem ... teşekkürler ilgilendiğiniz için
aşağıdaki linke yükledim efendim..

http://rapidshare.com/share/9809B35C270CBBE4AA499EA5D2E4E949

RaMu

File not found hatası aldım dosyayı indiremedim.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

erendil

https://docs.google.com/file/d/0BzoSt387pA0WYmlydVNnenpteW8/edit?usp=sharing

google üzerinden atayım belki bir engelleme vardır rapidde.....sanırım ben sorunu çözdüm portA lardan birini giriş diğerlerini çıkış yapıyordum RRF RLF komutlarında giriş kısmında saklanan bitte kaydığı için sorun oluyor  araştırdım hiçkimse benim kullandığım şekilde kullanmamış sorun ordan kaynaklı sanırım ama yinede tecrübesizim saygılarımla

RaMu

Program hafiften istediğin gibi çalışıyor,
birkaç hatanı programı düzenleyerek yazdım,
https://www.picproje.org/index.php?topic=45427.0
https://www.picproje.org/index.php?topic=23711.0

Bu iki konuyu okuyunca daha net göreceksin kalan diğer problemi,
kısaca RA5 aslında MCLR pini
ve bu pini reset amacıyla kullandığında Vdd (+5V a) ye çekmek zorundasın,
config satırnında MCLR_OFF yaptığında ise bu pin artık bir giriş pini olur
ve md. kendi içerisinden bu pini Vdd ye bağlar
sen bu pini çıkış olarak kullanamazsın
istersen sadece giriş olarak kullanabilirsin
giriş olarak kullanırkende zaten kendisi hep 5V a bağlıdır dirençle 5V a çekmene gerek yoktur
sadece direnç ve buton ile toprağa çekmen yeter
eğerki butona basıldı durumu oluşturdu şeklinde kullanmak istersen
bu durumda butona basılmazsa 1, basılırsa 0 görür RA5 pini.

Yani sen porta da kaydırma yaparken
porta,5 biti hep 1 durumunda olarak okunuyor rlf komutu sırasında
buda erkenden carry bitinin 1 olmasına sebep oluyor
bunu farrklı yöntemler kullanarak önler yani
programının porta daki ledleride kaydırmasını sağlayabilirsin,
öncelikle butonu porta,5 taşıyacksın
sonrası içinde sen birşeyler düşün bakalım yapamazsan yine fikir alışverişi yaparız,

kodlarının biraz düzeltilmiş hali

LIST P=P16F628A
				INCLUDE P16F628A.INC
				__CONFIG  _LVP_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _WDT_OFF  & _CP_OFF & _BODEN_OFF & _MCLRE_OFF
; d2 & _DATA_CP_OFF tanımsız derleme hata veriyor
;d3 & _MCLRE_ON  olmaz kulllanılıyor o yüzden & _MCLRE_OFF yaptık
;NOT MCLR sadece giriş olarak kullanılabilir

				#DEFINE DUGME PORTA,7
		ORG 	H'00'
;S1 		EQU 	H'0D'	; BIRINCI SAYI DEGERI
;S2 		EQU 	H'13'
;S3		EQU		H'14'
;S4		EQU		H'1B'

;değişkenleri yanlış yere tanımlamışsın şöyle olmalı
S1 		EQU 	20h	; BIRINCI SAYI DEGERI
S2 		EQU 	21h
S3		EQU		22h
S4		EQU		23h


		CLRF 	PORTB		; PORTBYI TEMIZLEDIM	
		CLRF 	PORTA
		BANKSEL TRISB
		CLRF 	TRISB	
		MOVLW	80h ; porta en son bit bir giris   d4
		MOVWF	TRISA

BANKSEL	PORTB
		MOVLW	H'07'
		MOVWF	CMCON
clrf	PORTB			;iyi olur
clrf	PORTA			;demek

MAIN	
		BTFSS	DUGME
		CALL	KIT
		BTFSS	DUGME
		CALL 	TOPL
		BTFSS	DUGME
		CALL	BLOKLA
KIT
;		MOVLW	03h		; d7 yanlış yazmışsın H'03 yazıyordu   03h veya H'03' şeklinde olmalı
		MOVLW	01h		;aslında ledlerin tek tek kayması için 01 olmalı ilk yükleme
						;hem bu sayede son led rb7 de sönebilir
						;ikili kayma istiyorsan caryy bitinin ardarda iki defa 1 olmasını kontrol etmen gerekir
		MOVWF	PORTB 
DONGU1	RLF		PORTB,W		;d1
		MOVWF	PORTB
		CALL	GEC1
		BTFSS	STATUS,0 ; CARY BITI TEST ET 1 SE SATIR ATLA
		GOTO 	DONGU1
;---
;tekli led kaydırma için gereksiz ama kullanılabilir yöntem başka düşünce için
;		MOVLW	H'03'	; tekli kayma için 01 yüklenmeli
;		MOVLW	H'01'	;d9
;		MOVWF	PORTA
;		CALL	GEC1    ;d9 ilk değer gözüksün porta da
;bcf  STATUS,C			;d8 ek, burada iken carry biti 1 dir alttaki rlf nin yanlış sonuç vermesine neden olur
;---					;çünkü c biti rlf ile porta,0 bitine kaydırılır

clrf PORTA ;d10 şart ik yükleme
DONGU2	RLF		PORTA,W
		MOVWF	PORTA
		CALL	GEC1
		BTFSS 	PORTA,6  ;
		GOTO	DONGU2


DONGU3	RRF		PORTA,W
		MOVWF	PORTA
		CALL	GEC1
		BTFSS 	STATUS,C
		GOTO	DONGU3
		MOVLW	H'C0'
		MOVWF	PORTB
DONGU4	RRF 	PORTB,W
		MOVWF	PORTB
		CALL	GEC1
		BTFSS 	STATUS,W
		GOTO	DONGU4
		BTFSS	DUGME
		GOTO 	KIT	
		RETURN
GEC1 		
		MOVLW 	.255		;onluk tabanda demek başında . olunca
		MOVWF	 S1
DO1		
		MOVLW 	.255
		MOVWF 	S2
DO2		
		DECFSZ 	S2,F
		GOTO 	DO2
		DECFSZ	S1,F
		GOTO 	DO1
		RETURN	
TOPL	
		NOP
		RETURN
BLOKLA	
		NOP
		RETURN


		END



RaMu

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