TMR0 YARDIM

Başlatan designer.21, 23 Şubat 2023, 12:29:58

designer.21

S.a. herkese. TMR0 kesmesine çalışırken aşağıdaki kod programında bir yeri anlamadım.
RETFIE komutu ile program ana programa dönüyor, orası anladım da
ana program derken ORG 0x00 yani BASLA komutu mu oluyor. normalde KESME_ALT_PROG'a gitmesi gerekmez mi?

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
;-----------------------------------------------------------
SAY_10mS	EQU	h'20' ;10 mS'leri sayma değişkeni
	ORG	h'000'		;Reset veya ilk gerilim verildiğinde
	GOTO	BASLA		;Ana program başlangıcına git.
	ORG	h'004'		;Kesme oluştuğunda
	GOTO	KESME_ALT_PROG	;Kesme alt programına dallan
BASLA					;Ana program başlangıcı
	CLRF	PORTB		; PORTB'deki LED'leri tüm söndür		
	BANKSEL	TRISB		; BANK1'e geç 
	CLRF	TRISB		; PORTB'nin tüm uçları çıkış
	MOVLW	b'11010111'	; T0CS=0, PSA=0, Fre_Böl=1/256
	MOVWF	OPTION_REG	; W'yi OPTION saklayıcıya yükle
	BANKSEL	PORTB		; BANK0'a geç
	BSF	INTCON,7	; Tüm kesmeler izin ver.
	BSF	INTCON,5	; TMR0 kesmesine izin ver.
	BSF	PORTB,0		; RB0 LED'ini yak
	BCF	PORTB,1		; RB1 LED'ini söndür
DONGU				; Ana program sonsuz dongü içerisinde
	GOTO	DONGU		; devamlı olarak çalışır.
KESME_ALT_PROG
	BCF	INTCON,2	; TMR0 kesmesini sonrakilere hazırla
	MOVLW	h'D9'		; TMR0 ilk sayısı = d'217'
	MOVWF	TMR0		; TMR0 saymaya başlar
	INCF	SAY_10mS,F	; 10 mS'leri tutan sayacı 1 arttır
	MOVLW	d'100'		; W ? d'100'
	SUBWF	SAY_10mS,W	; W = SAY_10mS - W
	BTFSS	STATUS,Z	; SAY_10mS = 100 oldu mu?
	GOTO	KESME_SONU	; Hayır, ana programa git ve bekle.
	CLRF	SAY_10mS	;Evet,10 mS'leri tutan sayacı sıfırla
	MOVLW	b'00000011'	; Terslenecek bit'leri W'ye yükle
	XORWF	PORTB,F		; RB0 ve RB1'i LED'lerini tersle
KESME_SONU
	RETFIE				; ana programa dön.
	END



kudretuzuner

#1
Merhaba,
Bildiğim kadarı ile, kesme olduğu zaman program akışı durur, istenilen eyleme atlar o eylem gerçekleştirilir. eylem bitince kesmenin olduğu satırın hemen altından kaldığı yerden program koşmaya devam eder. Goto komutunun gideceği satırı ise  yazılımcı belirler ama kesmeden sonraki işlemler yazılımcının insiyatifinde değildir diye biliyorum.


designer.21

Teşekkür ederim hocam, benim bu programda anlamadığım, normalde RETFIE komutu ile işlem ana programa döner, bu programda ise ana program, BASLA komutunun bulunduğu yer. ana programa dönülecek diye neden her seferinde bu aşağıya yazdığım kodlar tekrarlanıyor, bu aşağıdaki kodları tek seferde girmek yetmiyor mu. mesela her seferinde PORTB'Yİ siliyoruz OPTION_REG değerlerini falan giriyoruz.

ana programı BASLA yerine DONGU yapsak daha mantıklı olmaz mıydı. biraz karışık oldu ama inşallah derdimi anlatabilmişimdir  :)


BASLA
        CLRF   PORTB      ; PORTB'deki LED'leri tüm söndür      
   BANKSEL   TRISB      ; BANK1'e geç
   CLRF   TRISB      ; PORTB'nin tüm uçları çıkış
   MOVLW   b'11010111'   ; T0CS=0, PSA=0, Fre_Böl=1/256
   MOVWF   OPTION_REG   ; W'yi OPTION saklayıcıya yükle
   BANKSEL   PORTB      ; BANK0'a geç
   BSF   INTCON,7   ; Tüm kesmeler izin ver.
   BSF   INTCON,5   ; TMR0 kesmesine izin ver.
   BSF   PORTB,0      ; RB0 LED'ini yak
   BCF   PORTB,1      ; RB1 LED'ini söndür

kudretuzuner

Merhaba, kesme olayının kodlarına bakmam lazım (data kağıdı) siz PIC'e Tam olarak ne yaptırmak istediğinizi yazarsanız kodları daha kolay tetkik etme imkanı olur. Ben, kesme yerine seçtiğim bir pinin on-off olması durumunu kontrol ederek ona göre eylem yaptırıyorum. 

ete

#4
İlk sorunun cevabı şöyle olsa gerek.

ORG h'000'  program kodlarının başlangıç adresi.
ORG h'004'  kesme alt programının başlangıç adresi.

İşlemci ilk çalıştırıldığında ORG h'000' altında yer alan komutu icra eder.Oda GOTO BASLA olduğu için bu işi yapar. Bir kesme olduğunda ise program hemen ORG h'004' altında yer alan komutu icra eder.

Anlayacağın işlem başlangıcı diyebileceğimiz bu adresler işlemcinin hangi durumda nereye gideceğine karar vermesini sağlar.

BU arada program çalışırken bir kesme oluşur ise işlemci hemen programın o anda kaldığı adresi alıp stack içine yazar. Kesme etiketine gider ve oradaki işi bitince RETFIE komutunu görür görmez Stack içindeki adresi geri alır ve programı o adrese yönlendirir. Anlayacağın RETFIE komutu programı sabit bir yere göndermez. Stack de hangi adres kayıtlı ise oraya gider program.
Stack de şöyle bir kaide vardir "en son giren ilk çıkar".

Ete

designer.21

cevaplar için çok teşekkür ederim. kusura bakmazsanız, bu kesme olayını tam anlamak için bu yukarıdaki kod programı üzerinden buradan sorular sormak istiyorum. sizler de fırsat buldukça cevaplarsanız çok sevinirim.

bu yukarıdaki kod programında ilk kesme olayı yani kesme bayrağının 1 olduğu yer, DONGU - GOTO DONGU sonunda TMR0 değerinin 256'ya ulaşması ile mi oluyor.

designer.21

Kudretuzuner ve Ete hocalarım, yazdığınızı atlamışım maalesef, RETFIE komutuyla işlem kaldığı yerden devam ediyor. yani Ete Hocamın da dediği gibi Kesme işlemi başladıktan sonraki ilk komutun adresi STACK Saklayıcıya yazılıp kesme gerçekleştirilir, Kesme işlemi bittiğinde ise işlem gelip STACK Saklayıcıdaki adresten devam eder.
sanırım kafamda yavaş yavaş şekilleniyor :)

verdiğim ve vereceğim rahatsızlıklardan dolayı şimdiden herkesten özür diliyorum.
KESMELER şu PIC'te en zorlandığım konulardan biri olduğu için tam manasıyla hakim olmak istiyorum.

ete

TMR0 kesmesinin nasıl oluştuğunu sormuşsun. Program DONGU etiketinde sonsuz döngüye giriyor. Ama Tmr0 geri planda çalışıyor ve TMR0 değeri 255 değerini aştığı anda kesme bayrağı 1 yapılıyor. Programda kesme bayrağına bakarak KESME etiketine gidiyor.

Kesmelere bu kadar takılmak neden? anlamak da benim için zor. Kesme özel olarak yaratılan bir koşul sadece ve bunu yaratan bazı kaynaklar var. TMR0 da bunlardan birisi kesmeler aktif edilsin edilmesin TMR0 değeri 255'i aştığı anda Kesme Bayrağı set edilir. Kesmeler aktif ise program kesme etiketine gider değilse bir şey yapılmaz ve sayac 255 den sonra sıfır değerine gelir otomatikman ve saymasına devam eder. Sistem kesmenin oluştuğunu kesme bayraklarından anlıyor. Şöyle diyebiliriz. Hangi kesme aktif ise geri planda çalışan bir program kesme bayraklarını sürekli kontrol ediyor yakalarsa ve kime ait ise onunla ilgili kesmeye yolluyor programı.

Ete

designer.21

çok sağolun çok teşekkür ederim. TMR0 kesme mantığını kavradım, şimdi sırada diğer kesmeler var, tabi öncelikle bu TMR0 üzerinde bol bol çalışıp değişik örnekler yazarak tam oturduktan sonra.

daha önceki konularda Tek, Çift veya üç döngü ile zaman gecikmesi yapıyordum, şimdi bu TMR0'ı görünce bu işlemleri çok daha kısa yoldan daha az kod yazarak rahatlıkla yapılabiliyormuş

Powered by EzPortal