TMR1 sorunsalı

Başlatan eLectronbLue, 26 Şubat 2010, 09:17:09

eLectronbLue

TMR1 kesmesi kullanarak RC0 / T1CKI girişinden 5000 pulse saydirmak istedim fakat kesme oluşturamadım. TMR1L ve TMR1H saklayıcılarının zamanla aldığı değerleri PORTB  ve PORTD ye bağladığım ledlerle görebiliyorum fakat genel olarak FF den 00h 'e geçerken kesme oluşmuyor. Amacım 5000.sinyal gelince herhangi bir port bitinden lojik çıkış vermek.

Devre semasi:
http://www.4shared.com/file/230078242/8aee0bcc/besbin70.html

LIST P=16F877
INCLUDE P16F877.INC

ORG H'00'
GOTO AYAR
ORG H'04'
GOTO KESME

AYAR:
BCF STATUS,6 ; 
BSF STATUS,5 ; bank1 e gectik
MOVLW D'7'
MOVWF ADCON1
CLRF TRISA
CLRF TRISB
CLRF TRISD
BCF STATUS,5 ; BANK0  a gectik
CLRF PORTA
CLRF PORTD
CLRF PORTB
BCF T1CON,0 ; TMR1 disbaled
BCF T1CON,5 ; prescaler 1:1
BCF T1CON,4 ; prescaler 1:1
BCF T1CON,3 ; rc osc disabled
BSF T1CON,2 ; T1SYNC asenkron
BSF T1CON,1 ; t1ck1 pini clock kaynagi secildi
MOVLW D'236'
MOVWF TMR1H
MOVLW D'6'
MOVWF TMR1L
BSF INTCON,7
BSF INTCON,6
BSF T1CON,0 ; TMR1 sayici aktiflestirildi


ANA:
BSF PIE1,0 ; TMR1 kesmeleri aktif
MOVFW TMR1L 
MOVWF PORTB
MOVFW TMR1H
MOVWF PORTD
GOTO ANA

KESME:
BCF PIE1,0 ; TMR1 kesmesi kapali
BCF STATUS,5 ;BANK0 a gecildi
BCF T1CON,0 ; TMR1 saymasi durduruldu
BCF PIR1,0 ; kesme bayragi sifirlandi
BSF PORTA,0 ; porta.0 lojik-1 yapildi
MOVLW D'6' 
MOVWF TMR1L ; TMR1L saklayicisina Desimal 6 degeri yuklendi
MOVLW D'236'
MOVWF TMR1H ; TMR1H saklayicisina Desimal 236 degeri yuklendi
BSF T1CON,0 ; TMR1  sayicisi aktiflestirildi
RETFIE ; kesme donusu
END

Tagli

Ana döngüde BSF PIE1,0 ; TMR1 kesmeleri aktif yazmışsın ama öncesinde Bank 1'e geçmeyi unutmuşsun, bu yüzden kesmeler açılmıyor.

Ayrıca kesme kodunun içinde BCF PIE1,0 demene gerek yok, çünkü kesmeye girince GIE otomatik olarak 0 olur. Zaten yukarıda dediğim bank değiştirme olayını unuttuğun için ve kesme geldiğinde Bank 0'da olduğun için bu komut birkaç satır aşağıda yazmış olduğun BCF PIR1,0 ile aynı işi yapıyor. Kesme kodunun sonuda TMR1IE'yi açacak komut yok, eğer yukarıda bahsettiğim bank değiştime sorunlarını çözersen BCF PIE1,0 satırı kesmeyi kapatacak ve kesme tek kullanımlık olacaktır.

Bu arada kafama takıldı da, "sorunsal" ne demek? "Sorun" kelimesinden anlam olarak bir farkı var mı?
Gökçe Tağlıoğlu

eLectronbLue

24 ten sonra PC kullanmanın dezavantajları işte...  

Demek ki saklayıcılarla oynarken Bank durumuna iyi dikkat edilmesi gerekiyormuş. Saydırma problemini atlattım.

Kesme oluşunca GIE nin otomatik olarak sıfıra düşmesini ilk defa duydum, simülasyonda defalarca denedim ama GIE 1 den sıfıra inmedi , bu konuda yanıldığınız bir nokta olabilir.

Aşağıdaki kodda ise sadece 1 defaya mahsus 1mS'lik kesme oluşturdum fakat pek hassas olmadı. Proteus 7.4 SP3'te ve 7.6 SP0'da counter timer'da ölçtüğüm değer 1040 uS oluyor.

1000uS elde etmek için = 4 x 250 kombinasyonunu düşündüm.

TMR1H = 256 - 4   = 252
TMR1L = 256 - 250 = 6

Bank0= INTCON , PIR1 , TMR1L , TMR1H , T1CON , PORTD
Bank1= TRISD , PIE1

LIST P=16F877
INCLUDE P16F877.INC

ORG H'00'
GOTO AYARLAR
ORG H'04'
GOTO KESME

AYARLAR:
BCF STATUS,6 
BSF STATUS,5 	; BANK1 e gecildi 
CLRF TRISD 		; portd cikis ayarlandi
BSF PIE1,0 		; tmr1 kesmesi aktiflestirildi
BCF STATUS,5	; BANK0 a gecildi 
CLRF PORTD		;portd cikislari lojik-0
BCF INTCON,6	;cevresel kesmeler kapatildi
BCF INTCON,7	;genel kesmeler kapatildi
BCF T1CON,5		; prescaler 1:1
BCF T1CON,4		; prescaler 1:1
BSF T1CON,3		; tmr1 osc aktiflestirildi
BCF T1CON,1		;dahili clock secildi
MOVLW D'252'	
MOVWF TMR1H		; TMR1H saklayicisina 252 degeri yuklendi 
MOVLW D'6'
MOVWF TMR1L		; TMR1L saklayicisina 6 degeri yuklendi
BSF T1CON,0		; TMR1 saymaya basladi
BSF INTCON,6	; cevresel kesmeler aktiflestirildi
BSF INTCON,7	;genel kesmeler aktiflestirildi



ANA:
GOTO ANA ; kisir dongu

KESME:
BCF T1CON,0   ; TMR1 sayicisi kapatildi
BSF PORTD,7
BCF PIR1,0      ; kesme bayragi sifira cekildi
RETFIE
END


Bu arada  "sorunsal" hayatın küçük problemlerine verdiğim isim  :)

Tagli

Alıntı yapılan: "eLectronbLue"Kesme oluşunca GIE nin otomatik olarak sıfıra düşmesini ilk defa duydum, simülasyonda defalarca denedim ama GIE 1 den sıfıra inmedi , bu konuda yanıldığınız bir nokta olabilir.
Referans vermek gerekirse, PICmicro Mid-Range MCU Family Reference Manual'in 8-3 sayfasında (PDF'ye göre 125. sayfa) 4. paragraf dediklerimi destekler nitelikte. Zaten otomatik olarak GIE 0 olmasaydı sürekli iç içe kesmeye girerdi, örneğin senin programda h'4'te "GOTO KESME" var, bu komutu işleyemeden yine kesmeye gitmesi gerekirdi. Kesme sonunda "return" değil de "retfie" yazmamızın sebebi de bu. retfie, return'un yaptığına ek olarak GIE'yi de 1 yapar. Eğer istersen retfie yerine "bsf INTCON,GIE" + "return" ikilisini de kullanabilirsin. Fazladan kaybedeceğin bir cycle dışında değişen birşey olmaz.

1040 us de normal gözüküyor. 1000 us için 1:1 oranı ile
65536 - 1000 = 64536 yüklenmesi gerekir. Bu da FC18'e denk gelir.
TMR1H = h'FC' = 252
TMR1L = h'18' = 24

Senin yazdığınla arasında 18 us var. 17 us de programın başından "BSF T1CON,0" komutuna gelene kadar geçer. Kalan 5 us için kesin bir açıklamam yok ama kesmeye atlama sırasında bir miktar gecikme olur, herhalde ondandır.
Gökçe Tağlıoğlu

eLectronbLue

Problem çözüldü sanırım. Açıklamanız için teşekkür ederim.