PortB <4:7> değişim kesmesi kullanımı

Başlatan camby, 10 Haziran 2010, 19:48:47

camby

Sorunu assembly bölümüne açmam daha doğru olur sanırım ,

Encoder'dan gelen veriyi okuyabilmem için PORTB4-7 kesmesini kullanmakta sorun çekiyorum , kodlarım şu şekilde:

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

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

      movf      PORTB,w  ; PORTB oku
      nop
      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

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

ANA		btfsc		Flag,0
		CALL		LCD_REFRESH

		GOTO 		ANA


PORTB değişim kesmesi gerçekleşip kesme bölümündeki 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 , 2. kesme geldiğinde de bu sefer kesmeden çıkmıyor program , hatta bazen 2. kesmeden de çıkıyor , 3.de tıkanıyor ..
nerden yanlış yapıyorum acaba?

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. >:(


Tagli

Soruna cevap veremeyeceğim malesef ama gözüme çarpan bir ayrıntıyı düzeltmek için yazıyorum. STATUS'un yedeği alınırken ve eski yerine geri yazılırken swapf komutu kullanılır. Çünkü movf kullanılırsa geri yazma sırasında Z'yi değiştirebilir. Öyle ki, kesme öncesinde Z 1 ise, kesme sonrasında 0 olur. MPASM'nin template dosyalarında yedekleme kodlarının örnekleri mevcut.

Açıkçası movf komutunda hedef belirtilmediğinde 0 mı yoksa 1 mi (W mi F mi) alınıyordu hep karıştırırım. O yüzden bu kodun sonuna mutlaka gereken harfi eklerim. İşin kötüsü MPASM, söz konusu harf unutulduğunda hata değil uyarı veriyor ve bu da bazen gözden kaçıyor. Bu mesele benim de çok zamanımı yemiştir.
Gökçe Tağlıoğlu