ENCODER Okuma sorunu

Başlatan BenC, 21 Ocak 2010, 12:51:03

camby

encoder için PORTB4-7 kesmesini kullanmakta sorun çekiyorum , kodlarım şu şekilde:

;===============KESME ALT PROGRAMI========================================

KESME		
		movf		PORTB,w       ; PORTB okunmalı

		incf		konum_l
 		bsf		Flag,0		; Encoder takip biti
		
		movlw		.10
		subwf		konum_l,w
		btfsc		STATUS,Z
		clrf		konum_l

		bcf		INTCON,0 	; (RBIF) RB Port Change Interrupt Flag bit		
	
		retfie
...
...
;===============KONFİGÜRASYON=============================================

AYAR		clrf		PORTA
		clrf		PORTB
		bsf 		STATUS,5	; Bank1'e geç	
		clrf		TRISA		; A portu çıkış olarak ayarlandı
		movlw		b'11110000'	
		movwf		TRISB
		bcf 		STATUS,5	; Bank0'a geç
		movlw 		0x07 		; Turn comparators off and
		movwf 		CMCON 		; Enable pins for I/O;functions
		bsf		INTCON,7	; (GIE) Global Interrupt Enable bit
		bsf		INTCON,3 	; (RBIE) RB Port Change Interrupt Enable bit
		bcf		INTCON,0 	; (RBIF) RB Port Change Interrupt Flag bit

;===============ANA PROGRAM===============================================

ANA		btfsc		Flag,0
		CALL		LCD_REFRESH

		GOTO 		ANA


PORTB değişim kesmesi gerçekleşip işlemleri yaptıktan sonra ana programa geri döndüğümde , proteustan attempt to unimplemented mem. loc. 0x0abc ignored diye hata alıyorum her satırda , bida kesme geldiğinde de bu sefer kesmeden çıkmıyor program , nerden yanlış yapıyorum acaba?

ete

#16
Bildiğim kadarı ile INTCON.0 biti program ile silinemiyor.
Bu nedenle Kesme kısmının sonundaki

bcf      INTCON,0    ; (RBIF) RB Port Change Interrupt Flag bit   

ifadesini kaldırın. Yada en doğrusu bu ifadeden önce portB yi okuyun. Zira okumazsanız  BCF INTCON.0 komutu çalışmayacaktır.

Bu bayrağın silinmesi ancak PortB nin durumunu okumakla otomatik yapılıyor.
Bu nedenle Kesme kısmının başında bulunan ;

movf      PORTB,w       ; PORTB okunmalı

İfadesini satırın en sonuna aktarın.
Bu şekilde bir deneyin bakalım.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

camby

#17
Dediğiniz gibi PortB okunmamışsa INTCON,0 temizlenemiyor , kesme içinde sonsuz döngüde kalıyor. PORTB'yi okuduktan sonra da INTCON,0 bayrağı otomatik olarak temizlenmiyor , bcf ile temizlemek gerekiyor.

      movf      PORTB,w
      nop
      bcf      INTCON,0    ; (RBIF) RB Port Change Interrupt Flag bit

Şeklinde yaptım kesme çıkışını , ilk kez kesme geldiğinde sorunsuz bir şekilde çıkıyor program kesmeden , 2. kez kesmeye gittiğinde ise bayrak temizlenmiyor ,  program kesmede kalıyor.

Ardından bayrağı temizledikten sonra da PORTB'yi okutayım dedim yine durum aynı.

      movf      PORTB,w
      nop
      bcf      INTCON,0    ; (RBIF) RB Port Change Interrupt Flag bit      
      nop
      movf      PORTB,w

Bazen 2. kez kesme geldiğinde de kesmeden sorunsuz bir şekilde çıkıyor , fakat 3.de yine tıkanıyor :) bazen 2.de bazen 3. de tıkanması sinir bozucu bir durum:)
Anlamadım gitti

ete

İşin içinde ASM olunca elim kolum bağlanıyor. Bu sistem Pic basic de sorunsuz çalışıyor aslında.
Biraz ASM den analdığım için akıl vereyim dedim ama sorun beklediğimden de öte bir şey beni aşıyor.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

camby

teşşekürler yine de uğraştığınız için,
Bugün bir pic kitabı karıştırdım , PORTB4-7 kesmesinde , kesme içerisinde PORTB'yi bile okumadan direk bayrağı temizleyip kesmeden çıkılmış , denenmişmidir ordaki kodlar merak ediyorum.

camby

ey assembly beni zorluyorsun:)

Çözüm: Kesme rutini tam olarak bu şekilde idi ,

KESME		movwf		w_sakla		; W yazmacı kaydedildi
		movf		STATUS,w
		movwf		s_sakla		; Status yazmacı kaydedildi
		
		incf		konum_l
 		bsf		Flag,0		; Encoder takip biti
		
		movlw		.10
		subwf		konum_l,w
		btfsc		STATUS,Z
		clrf		konum_l
	 	
		movf		PORTB,f
		nop
		bcf		INTCON,0 	; (RBIF) RB Port Change Interrupt Flag bit		
		nop
		movf		PORTB,f

		movf		s_sakla
		movwf		STATUS		; Status yazmacı geri yüklendi
		movf		w_sakla,w	; W yazmacı geri yüklendi
	
		retfie


Kesme girişi ve çıkışındaki W ve Status yedek alma işlemini her programda aynen bu şekilde kullanıyordum . Fakat bu programda çalışmadı , çıkıştaki
movf      s_sakla   
satırını
movf      s_sakla,w
yapınca sayma işlemi sorunsuz bir şekilde yapıldı.

movf başka yerde yanına w yazmadan çalışıyorda neden burda benim 2 günümü yedi anlamış değilim. >:(