kesme sırasında delayms veremiyorum

Başlatan uardal, 07 Ocak 2011, 11:29:19

uardal

merhaba

protonda rb0 kesmesi kullanıyorum fakat kesme sırasında ms düzeyinde bekleme vermeye çalıştığımda yazılım sapıtmaya başlıyor, sebebini bilen varmı acaba? delayms 10 verdiğimde sistem karışıyor ama bu satırı kaldırdığımda sorun düzeliyor.

gloin

interrupt içinden bir an önce çıkmanız gerekir, orada bekleteceğinize bir flag set edit, o flag 1 iken normal kodunuzun içinde bekletme yapmanız doğru olur, ya da bir timer interrupt ı içinde bekletme yapmanız gerekir
Gloin

uardal

peki hocam kesme içindeyken 2x6 lcd veri göndermek doğru bir uygulamammı, yoksa kesmeden çıktıktan sonramı lcd ye veri göndememiz daha sağlıklı olur?

gloin

kesme dışında yapmanız mantıklı olur
Gloin

kahraman10

Aynı muhabbet bende de var kesme içinde çıkıp çıkmamak sorun değil. önemli olan 2. kesme gelmeden çıkmış olmak buda işlemin başarılı olması için. diğer pozisyonda delayms vermek hard interrb0 kullanıldığında evet sapıttırıyor delay sırasında kesme gelince film kopuyor.delay vermemek döngüye sokmak lazım.

Ruzgarbey

merhaba üstadlar.kesmelerde ister hard olsun ister soft olsun kesmeden hemen çıkmak öncelik taşıdığını ve bunun bütün diller için aynı olduğunu düşünüyorum.kesme içinde bekleme yapmak,döngü kurmak bana mantıklı gelmiyor.kesmelerde çok az kod yazıp oluşacak olayları bir değişkene atayıp program içinden kontrol etmek daha güzel geliyor bana.
KES VAR BIT
KESME:
KES=1 'KESME OLUŞTU


MAIN:
IF KES=1 THEN
KES=0
DELAYMS 10
ENDIF

ben genelde kodlarımı bu şekilde yazıyorumve bugüne kadar hiç skıntı yaşamadım.kolay gelsin
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

kahraman10

Yani ilginçsiniz bu bir matematik, hızlı çıkmak iyidir yavaş gitmek güzeldir diye birşey varmıdır.?

Kesmeye girersin bayrak 1 olur 0 olur. kesmede kalırsan bayrak biti konum mu değiştirecek kendi kendine.? Komutlar çokmuş çok bekledim burda ben bayrağı değiştireyim demiyor herhalde işlemci.

Kesmenin ne kadar süre ara ile yapacağını bilemiyorsak evet hemen kesmeden çıkalım, çünkü ardışık kesmeyi kaçırabiliriz.ancak komutlarımızın süresi ardışık kesmeden önce bitecek ve o ardışığıda yakalayabileceksek kesmede kalmanın bir sıkıntısı olmaz.

Bu konuyu geçin önemli olan delay komutu anında kesme gelirse oluşan saçmalıklar bunu irdelemek daha mantıklı , konuda bunun üzerine açılmış değil mi?

uardal

kahraman hocam doğru söylüyorsun, ben zaten kesmeye gittiğimde diğer bütün kesmeleri kapatıyorum ve kesme gelip gelmemesinden ziyade o kesme rutini içinde nasıl bir çalışma mantığı işliyorda delayms komutu programı karıştırıyor?

kahraman10

kesmenin yapıldığı programda hem kesme içi hemde kesme dışı tüm gecikmeler sıkıntı çıkarıyor. Üstadlar vardır bunun sebebini bilen ben gerçekten neden böyle olduğunu bilmiyorum, lakin okuduğum kadarı ile bu context save ve restore yaparken kullanılan hafızanın yetersizliğinden oluyor diye düşünüyorum.

uardal

ben aşağıdaki gibi bir kesme uygulaması yapıyorum basit bir sayıcı devresi, print satırının altına delayms 10 komutunu koyduğumda kesme sonrası set butonlarım devreye girmiyor, ama bu satırı sildiğimde her nasılsa butonlar çalışmaya başlıyor. fakat delayms 10 satırı varken ve devre ilk çalıştığında buton kontrollerinde bir sorun yok ne zaman kesmeye girip çıkıyorum o zaman bütün butonlar devre dışı kalıyor, debug dan stack kullanımına baktığımda  sadece 3 stack satırının kullanıldığını gösteriyor.

kesme:
Context SAVE
GIE = 0          ' Disable global interrupts
While GIE = 1    ' Make sure they are off
GIE = 0          ' Continue to clear GIE
Wend             ' Exit when GIE is clear
PEIE=0
INTE=0
INTF=0
sayici =sayici + 1
PORTB.2=0
Print At 2,1,"COUNTER   =",DEC4 sayici," "

DelayMS 10

GIE=1
PEIE=1
INTE=1

Context Restore

Maxim

arkadaşlar sanırım en temel kuralı atlıyorsunuz .

hardware kesme rutini içerisinde ne delayms nede print satırı olmaması gerekiyor .
dışarıda olabilir onun sorun çıkarmaması lazım.

Ruzgarbey

Alıntı yapılan: kahraman10 - 10 Ocak 2011, 12:17:03
kesmenin yapıldığı programda hem kesme içi hemde kesme dışı tüm gecikmeler sıkıntı çıkarıyor. Üstadlar vardır bunun sebebini bilen ben gerçekten neden böyle olduğunu bilmiyorum, lakin okuduğum kadarı ile bu context save ve restore yaparken kullanılan hafızanın yetersizliğinden oluyor diye düşünüyorum.
Alıntı yapılan: kahraman10 - 10 Ocak 2011, 12:17:03
Yani ilginçsiniz bu bir matematik, hızlı çıkmak iyidir yavaş gitmek güzeldir diye birşey varmıdır.?

Kesmeye girersin bayrak 1 olur 0 olur. kesmede kalırsan bayrak biti konum mu değiştirecek kendi kendine.? Komutlar çokmuş çok bekledim burda ben bayrağı değiştireyim demiyor herhalde işlemci.

Kesmenin ne kadar süre ara ile yapacağını bilemiyorsak evet hemen kesmeden çıkalım, çünkü ardışık kesmeyi kaçırabiliriz.ancak komutlarımızın süresi ardışık kesmeden önce bitecek ve o ardışığıda yakalayabileceksek kesmede kalmanın bir sıkıntısı olmaz.

Bu konuyu geçin önemli olan delay komutu anında kesme gelirse oluşan saçmalıklar bunu irdelemek daha mantıklı , konuda bunun üzerine açılmış değil mi?
tekrar merhaba.
konu delay komutu çalıştırılırken gelen kesmede picin düzgün çalışmaması ile ilgili değildir.konuyu başından bu yana dikkatle okursanız bunu anlayabilirsiniz.konu kesme komutları içinde delay kullanımı ile ilgilidir.
mantığınıza hayran olmamak elde değil.evet kesmeye girildiğinde flag 1 olur kesme işi bittiğinde flag 0 oluyor.konuyu şu şekilde özetleyelim ;
diyelimki hem usart kesmesini hemde timer kesmesini aynı anda kullanacağız.sizin dediğiniz gibi kesme içinde istediğimiz kadar kalabiliyorsak komutların şu şekildeolamsı lazım
KESME:
if rcif=1 then
hserin [veri]
if veri=10 then şunu yap
if veri=11 then şunu yap
...........
bunun gibi 50 adet kontrolümüz olsun
endif
sayac=sayac+1
if sayac = 10 then şunu yap vs
........

bu şekilde kodlarımız devam ediyor.kesmeye girerken bir daha kesme gelmesini engelliyoruz.kesme içerisindeyken bir daha kesme gelmiyor,peki usarttan bilgi geldi bu bilgiyi alıyoruz diyelim.biz kontrollerimizi yaparken timer kesmesini kaçırırız.buda programımızda timer ile ilgili yazmış olduğumuz kodların geç çalışmasına vede programımızın hassalıktan çıkmasına sebeb olur.bu şekilde kullnamk istiyorsanız kullanmakta özgürsünüz ancak buradaki arkadaşlarımıza bu şekilde kullanmayı tavsiye edici yorumlardan kaçınınız.

Contex Save komutu protona özel bir komut olduğunu düşünüyorum.kesmeye girildiğinde bu komut icra edilmesinde asm deki gibi kesmelere girerken belli registerlerin değerlerinin saklanması amacıyla yapıldığını düşünüorum.ve bu şekilde bir komutun hafıza problemi yaşama ihtimali 0 dır.çünkü siz bu komutu yazdığınızda derleyiciniz derleme sırasında bu komutu değişkenlere atayacaktır.  sta = status  sw=w sf=f vss mantığında.kesmeye girdiğinizde status ve diğer registerler bir değişkene atanıp kesmeden çıkarken tekrar bu değişkenlerden okunarak registerlere yazılır.daha öncede belirttiğim gibi burada hafıza yetersizliği söz konusu değildir.

programlarınız bekleme komutlarında kesme gelmesi halinde düzgün çalışmıyorsa TIMER kesmesini kullanrak bekleme yapınız.mesala timer i 1 ms de bir kesme oluşacak şekilde kurup bir sayac oluşturursunuz.
KESME:
sayac=sayac+1


MAIN:
bsure=100
gosub Gecikme

Gecikme:
Sayac=0
While Sayac <> bsure :wend
return

100 ms nil bir gecikme yaptık.bu gecikmenin icrası sırasında bir kesme gelse bile programda bir sıkıntı yaratmaz.
saygılarımla.kolay gelsin.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

eseneren

Selamlar,
Aşağıdaki kod yazıp calıstırmadım ama ne gıbı bır sıkıntı var?
kesmeye gırıyorum butun kesmelerı ıptal edıyorum delay cagırıyorum o sırada kesme gelırse( nerden gelecek  ?).
Cıkarken de aktıf edıyorum.Bunu dısarda da yapabılırım ama ıcerde yapmamama sebep olan nedır ?

Saygılar

ORG 0X004         ; KESME BASLANGICI
      GOTO INTTERRUPT


INTTERRUPT
BCF INTCON,GIE         ; GENEL INT PASIF
CALL DELAY                             ; HER BİRİ 500MS
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
BSF INTCON,GIE                           ; GENEL INT PASIF
RETFIE
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

Tagli

Görünürde bir sebep yok. Ama sağlıklı değil. Kesmenin mantığı işini çabuk bitirmesidir. Bu şekilde kod yazabilirsin, ancak sen kesme kodu içindeyken gelen diğer kesmelere zamanında cevap veremezsin. Kesmeler genelde acilen cevap verilmesi gereken durumlardır ve beklemeye pek tahammülleri yoktur. Ama senin uygulamanda kesmelerin acelesi yoksa sorun çıkmaz, bu senin bileceğin iş.

Ayrıca, kesmeye girerken GIE'yi 0 yapman gereksiz, kesme olduğunda kendisi otomatik olarak 0 olur zaten. Ayrıca çıkışta da GIE'yi 1 yapmak için RETFIE yazman yeterli, o komutun işi o zaten. Yani yoksa RETURN kullansan da olurdu ama ikisinin arasında şansına kesme gelirse sorun çıkabilirdi.
Gökçe Tağlıoğlu

eseneren

2Tagli,
Zaten kesme de bu komutu yurutuyorsa sıkıntı cıkartmaz ıstedıgımızı yapabılırız bır kısıtlama yok.
Acele etmemizin sebebi nedir?
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk