H

TMR0 kesmesi hakkında yardım

Başlatan hgungor, 19 Temmuz 2014, 21:34:34

hgungor

TMR0 kesme ile ilgili bir soru sormak istiyorum arkadaşlar. Programı kısaca sorunun olduğu kısmı göz önünde bulundurarak yazıyorum,

—————————————
kontrol equ 0×30

ORG 0×000

goto main

ORG 0×004

bsf kontrol,0
retfie

main

bsf status,rp0
movlw b'10000010′ ; prescaler'i 8′e ayarladım
movwf option_reg
bcf status,rp0

bcf kontrol
movlw b'10100000′
movwf intcon
movlw d'94′ ; 1296 mikro saniye sonra kesme gelmesini istiyorum
movwf tmr0

a3
btfss kontrol,0 ;    kesmeden geri dönüşte buradan çıkmıyor
goto a3

—————————————————-

Sorun kesmeden geri dönüşte a3 döngüsünden çıkmaması, acaba sıkıntı ne olabilir. Kesme vektöründe kontrol dosyası setlenemiyormu.

Yardımcı olmaya çalışacak arkadaşlara şimdiden teşekkür ederim.

efsanepoldem

Ilk önce org 0x004 intterrupt adresinden sonra. Bcf intcon.2 yazıp tmr0 bayragini temizlemen gerekli. Ayrıca burada bir leri yakıp söndürmek istiyorsan a3 adresindeki yazılımla yanlış olmuş. Burada bir delay alt programı yazip bir sure beklenen gerekir eğer bunu yapmazsan led çok çabuk yanıp döneceğinden bunu farkademezsin.

ete

Kesme oluşturmanın kuralları vardır. Her şeyden önce program neden kesme ye girer onu anlamak gerekiyor. Bunun başlıca sebebi aktif edilmiş kesme nin bayrağının set edilmiş olmasıdır. Program bayrağı (flag) set edilmiş gördüğü anda kesmeye girer. Kesmeden çıkmadan önce kesme bayrağını sıfırlamak ve tmr0 kesmesi kullanıyorsanız bu sayaca yeniden önyükleme değerini vermeniz gerekir. Aksi halde kesme süresi değişir. Bayrağı sıfırlamazsanız program sürekli kesmede kalır.
Diğer konuda yanan sönen ledler için bir yanık kalma süresi birde aönük kalma süresi vermeniz gerekir aksi halde hep sönük yada hep yanık görürsünü? Bu süre en az 100 ms olmalıdır.

Ete

hgungor

#3
Çok teşekkürler efsanepoldem ve ete

Benim için ledlerin yanıp sönmesini görmek çok önemli değil zaten ortada yakmak istediğim bir let yok sadece deneme amaçlı bir led koymuştum, ilk denememde başarısız olunca onlarca değişiklik yaptım programda şuan tam hatırlamıyorum ama sanırım şu programı yazarsam 1296mikro saniye sonra  a3 döngüsünden sonraki  kısımda  b1 portundaki led yanar,  doğrumudur ?

kontrol equ 0×30

ORG 0×000

goto main

ORG 0×004

bsf kontrol,0
bcf intcon,2
retfie

main

bsf status,rp0
movlw b'10000010′ ; prescaler'i 8′e ayarladım
movwf option_reg
bcf status,rp0

bcf kontrol
movlw b'10100000′
movwf intcon
movlw d'94′ ; 1296 mikro saniye sonra kesme gelmesini istiyorum
movwf tmr0

a3
btfss kontrol,0 ;    kesmeden geri dönüşte buradan çıkmıyor
goto a3

bcf intcon,7  ; birdaha kesmeye girmesini istemiyorum sadece bir kere 1296 usec sonra ledi yakmak önemli benim için

bsf portb,1
end

Tekrardan teşekkürler arkadaşlar

ete

İlk kesme 1296 us sonra gerçekleşir. Hesabı şöyle 256-94=162 bu tmr0 sayacının kesme oluşturması için sayacağı değerdir. Ancak ayrıca bölücüyü 1/8 ayarladığın için 162*8=1296 us sonra kesme oluşacaktır. Ancak ortalama 6-7 us de komut gecikesi dikkate alınmalıdır.
İlk kesme bu sürede meydana gelir. Ancak ikincisinde tmr0=94 değeri kesmeden çıkmadan yeniden tmr0 ra verilmelidir. Aksi halde ikinci kesme 256*8=2048us de gerçekleşir.

Ete

hgungor

Çok teşekkürler ete, dediğin gibi sorunu çözdüm , fakat başka birşey dikkatimi çekti denemeler yaparken
kesme programında yaktığım ledi ana programda söndüremiyorum, bu sıkıntı nedendir veya nasıl çözülebilir acaba.


kontrol equ 0×30

ORG 0×000

goto main

ORG 0×004

bsf kontrol,0
bsf portb,0    ; b nin 0. portunudaki ledi yaktım.
bcf intcon,2
retfie

main

bsf status,rp0
movlw b'10000010′ ; prescaler'i 8′e ayarladım
movwf option_reg
bcf status,rp0

bcf kontrol
movlw b'10100000′
movwf intcon
movlw d'94′ ; 1296 mikro saniye sonra kesme gelmesini istiyorum
movwf tmr0

a3
btfss kontrol,0 ;    kesmeden geri dönüşte buradan çıkmıyor
goto a3

Gecikme:
---------              ; burda belirli bir sürelik gecikme var (500msn yaklaşık)
---------
goto gecikme

bcf portb,0    ; portbnin 0. ledi sönmüyor.

bcf intcon,7  ; birdaha kesmeye girmesini istemiyorum sadece bir kere 1296 usec sonra ledi yakıp- söndürmek önemli benim için

end

ete

Bir kere kesme oluşturacak isen ilk kesme oluştuğunda kesmeden çıkmadan intcon.7 yi sıfırlaman gerekir. Main kısmında bunu yaparsan 500 ms lik gecikme esnasında yaklaşık 250 defa daha kesme oluşur.

Bir gecikme ayarlamışsın ama altına goto gecikme demişsin bu durumda program gecikme kısmından hiç çıkamayacaktır. Goto gecikme komutunu bcf portb.o  komut satırından sonrasına koymalısın.
Ete

hgungor

Aslında ileriki safhalarda kesmeyi birden fazla yapacağım ama şuan bir tane ile programı çalışır duruma getirmek istiyorum, fakat dediğim gibi led yanmıyor, dediğiniz gibi kesmeye girince intcon.7 yi sıfırlıyorum , gecikmeden çıkacak algoritma var kesik çizgiyle belirtiğim yerde ,karmaşa olmasın diye programı kısaltıp yazmaya çalışmıştım

Programın tamamını yazıyorum

;**** tmr0 DENEME ****
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
KONTROL EQU 0X30
DELAY1 EQU 0X31
DELAY2 EQU 0X32

ORG H'000'
goto main

ORG H'004'
bcf INTCON,7
bsf KONTROL,0
BSF PORTB,1
BCF INTCON,2
retfie

main:
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS,RP0

bsf STATUS,RP0
MOVLW B'10000010' ; prescaler'i 8'e ayarladım
movwf OPTION_REG
bcf STATUS,RP0

BCF KONTROL,0
MOVLW B'10100000'
movwf INTCON
MOVLW D'94' ; 1296 mikro saniye sonra kesme gelmesini istiyorum
movwf TMR0

AA3:
btfss KONTROL,0
GOTO AA3

;-------GECİKME---------------
MOVLW D'255'
MOVWF DELAY2
LOOP2
MOVLW D'255'
MOVWF DELAY1
LOOP1
nop
nop
DECFSZ DELAY1,1
GOTO LOOP1
DECFSZ DELAY2,1
GOTO LOOP2

BCF PORTB,1  ;  Led sönmüyor burada
NOP
NOP
END



ete

Asm de çok iyi değilim. Mantık yütütebiliyorum ama komutları kullanmakta zorlanıyorum.
Biraz üzerinde çalıştım anlamadığım sebeplerden dolayı program kesmeyi durduramıyor.
Hal böyle oluncada kesme içinde ilgili bitler sürekli set ediliyor.
Bazı değişik mantıklar kullanarak bu sorunu aşmaya çalıştım. İlişikteki örnek çalışıyor. her ne kadar sol el ile sağ kulağı göstersede iş görüyor. Sorunun bank seçimi ile alakalı olduğunu sanıyorum.

Ete

hgungor

Uraşların için gerçekten çok teşekkür ederim ete
Bende baya tırmaladım ama dediğin gibi program sürekli kesmeye giriyor, taki ana programa bir sonsuz döngü koyana kadar, zaten sende öyle bişey yapmışın, ama ben ilerde birkaç defa daha kesmeye ihtiyacım olacağından  birazdaha tırmalayayım bakalım bişeyler bulabilecekmiyim, bulunca mutalaka burayıda haberdar etmeye alışacağım.

Herkese kolay gelsin

Powered by EzPortal