ihtiyac halinde kesmeyi acma-kapama

Başlatan Mucit23, 24 Temmuz 2011, 19:38:18

Mucit23

Merhaba arkadaslar
Protonda graofik lcd ile calisirken kesme ile ilgili bir sorun cikiyor. Programin biryerinde bir tablo olusturmusum. Tabloyu olustururken bir cok line komutu kullaniyorum tabloyu bu line komutlari ile yaptim. Programin bazi yerinde tmr0 kesmesi ni kullanmam gerekiyor . Kesmeler kapali iken kendi olusturdugum tablo sorunsuz calisiyor. Kesmeyi actigim zaman tablo yine cikiyor ama bir sure sonra goruntu bozulmaya basliyor
Sanirim line komutlari islenirken kesme geldigi zaman komutlar duzgun calismiyor.
Programda sadece bazi bolumlerde kesme kullanmam gerekiyor. Bu yuzden sadece lazim oldugunda kesmeleri acip ihtiyac olmadigindada kesmeleri kapatmak istiyorum. Simdi program islerken kesmeyi kapatiyorum.  Fakat kesmeleri tekrar aktif ettigimde kesme tekrar calismiyor. Kullandigim islemci 18F4620 20 mhz de calistiiriyorum. Amacim sadece gerektiginde kesmeyi aktif etmek.  Acaba neden kesme tekrardan calismiyor. Neyapmam gerekiyor.
(Cep telefonu ile yazdigim icin turkce
karakterler nedense cikmiyor. Bu seferlik
mazur gorun)

tyildizak

#1
intcon.7 bitini temizlerseniz(0) tüm kesmeler iptal olur. Tekrar aktif hale getirmek için de set edersiniz.

-Hasan-

Peki öncelikli interrupt olayını kullanıyormusunuz? RCON registerinin 7. bitini 1 yapınca öncelikli kesme açılmış oluyor, 0 yapılırsa 16f lerdeki gibi oluyor.

Eğer RCON,7=0 ise, yani öncelikli interrupt olayı kapalı ise:

INTCON ' un 7. biti ile tüm kesmeleri açıp kapatabilirsiniz.

Eğer RCON,7=1 ise, yani öncelikli interrupt özelliği açık ise:

INTCON ' un 7. biti yüksek öncelikli kesmeleri açıp kapatır.
INTCON ' un 6. biti düşük öncelikli kesmeleri açıp kapatır.

tyildizak

Rcon.7 ne durumda olursa olsun intcon.7 temizlendiğinde tüm kesmeler iptal olur.

-Hasan-

Alıntı YapRcon.7 ne durumda olursa olsun intcon.7 temizlendiğinde tüm kesmeler iptal olur.



PIC18F4620 Datasheet Sayfa 111

tyildizak

#5
Alıntı yapılan: Hasan Oguz - 24 Temmuz 2011, 20:53:49
Alıntı YapRcon.7 ne durumda olursa olsun intcon.7 temizlendiğinde tüm kesmeler iptal olur.



PIC18F4620 Datasheet Sayfa 111

@hasan oğuz, aynı datasheetten bende de var :)




bit 7 GIE/GIEH: Global Interrupt Enable bit

when IPEN= 0                                      // Ipen 0 iken
1 = Enables all unmasked interrupts
0 = Disables all interrupts                  // tüm kesmeleri engeller


When IPEN = 1:                                 //  Ipen 1 iken
1 = Enables all high-priority interrupts
0 = Disables all interrupts                     // tüm kesmeleri engeller


Siz ne tür kesmeler set etmiş olursanız olun, gie/gieh bitini temizlediğinizde, bunların hiçbiri gerçekleşemez!

Bunu görsel olarak takip etmek için lojik şemaya da bakabilirsiniz.

Orada göreceğiniz gibi her iki kesme vektörünü gösteren and kapılarından her ikisinde de gie/gieh biti girişe bağlıdır ve 0 olursa her iki tür kesme de gerçekleşemez.








-Hasan-

Eğer RCON,7=0 ise, yani öncelikli interrupt olayı kapalı ise:

INTCON ' un 7. biti ile tüm kesmeleri açıp kapatabilirsiniz.

Eğer RCON,7=1 ise, yani öncelikli interrupt özelliği açık ise:

INTCON ' un 7. biti 1 olursa yüksek öncelikli kesmeler açık, 0 olursa tüm kesmeler kapalı.
INTCON ' un 6. biti düşük öncelikli kesmeleri açıp kapatır.

tyildizak arkadaşım gerçekten çok teşekkürler, kaçırdığım o ufak ayrıntıyı bana göstermiş oldunuz, o zaman yukarıdaki gibi düzenleyebiliriz.

tyildizak

Rica ederim, ek olarak, tüm kesmeleri gie biti ile engelleyip, sonradan biti set ederek kesmeleri tekrar aktif ettiğinizde de, arada geçen sürede herhangi bir kesme oluşup ilgili kesme bayrağını set etmiş olabilir.
Gie biti ile  tüm kesmeleri aktif hale getirmeden önce bunları da temizlemek  gerekecektir.

-Hasan-

Alıntı Yaptüm kesmeleri gie biti ile engelleyip, sonradan biti set ederek kesmeleri tekrar aktif ettiğinizde de, arada geçen sürede herhangi bir kesme oluşup ilgili kesme bayrağını set etmiş olabilir.
Gie biti ile  tüm kesmeleri aktif hale getirmeden önce bunları da temizlemek  gerekecektir.

tyildizak arkadaşım gerçekten önemli bir noktayı vurgulamışsın.

Mucit23 arkadaşımız anlattığına göre sadece TMR0 kesmesini kullanıyormuş, o zaman onun sadece TMR0 kesme bayrağını (TMR0IF) temizlemesi yeterli.

muhittin_kaplan

enable ve disable ı da bir araştırınız

Tagli

Kesme bitleriyle aynı sorunu ben de yaşamıştım. Aslında bu durum bana mantıksız geliyor ama yapacak birşey yok gibi, adamlar öyle tasarlamış.  Bu başlığı bir inceleyin.
Gökçe Tağlıoğlu

Mucit23

asrkadaşlar cevaplarınız için teşekkür ederim. Şimdi sorunu çözdüm. Dediğiniz gibi Kesmeyi tekrar aktif etmeden önce Kesme bayrağını Ve TMR0L sayacını temizlemek gerekiyormuş.

   Boş zamanlarımda program yazmak dışında yürütmekte olduğum projelerde kullandığım işlemcilerin datasheedini açıp incelerim. Kesmede birçok şeyi öğrendimde Bu öncelikli kesme işini anlayamadım. Pic hangi durumlarda neye göre kesmelere öncelik tanıyor.
Bunun yanı sıra öğrenmek istediğim bir konu daha var. Diyelim biz hem tmr0 kesmesi hemde RB0 kesmesini aynı anda kullanmak istiyorum. Veya birden fazla kesmeyi aynı anda kullanmak istiyorum. Bunun için her kesme çeşidi için ayrı ayrı kesme alt programları olmuyor herhalde. Tek bir alt program yapıp sadece kesme bayrakları ile kesmenin nereden geldiğinemi bakmak gerekiyor?

-Hasan-

Alıntı YapKesmede birçok şeyi öğrendimde Bu öncelikli kesme işini anlayamadım. Pic hangi durumlarda neye göre kesmelere öncelik tanıyor.

Öncelik tanınacak kesmeleri sen ayarlayacaksın. INTCON2, INTCON3, IPR1, IPR2 registerlerinden bu ayarlanabiliyor.

Alıntı Yapbirden fazla kesmeyi aynı anda kullanmak istiyorum. Bunun için her kesme çeşidi için ayrı ayrı kesme alt programları olmuyor herhalde. Tek bir alt program yapıp sadece kesme bayrakları ile kesmenin nereden geldiğinemi bakmak gerekiyor?

Evet her kesme çeşidi için ayrı ayrı alt programlar olmuyor, düşük öncelikli interrupt geldiğinde 0x18, yüksek öncelikli interrupt geldiğinde 0x08 adresine gider PIC, bu sabittir. Aynen dediğiniz gibi olacak; kesme bayrakları ile hangi kesmenin geldiğine bakacaksınız. Daha ayrıntılı bilgi için datasheeti incelemenizi öneririm, orada ayrıntılı bir şekilde anlatılmış.

Mucit23

Çok teşekkür ederim Aynen tahmin ettiğim gibiymiş. 18F4620 çok hoşuma gitti. Datasheedini incelerken kendimi kaybediyorum. Herkese teşekkür ederim

-Hasan-

#14
Alıntı yapılan: Mucit23 - 25 Temmuz 2011, 16:12:34
Çok teşekkür ederim Aynen tahmin ettiğim gibiymiş. 18F4620 çok hoşuma gitti. Datasheedini incelerken kendimi kaybediyorum. Herkese teşekkür ederim

Arkadaşım dediğine katılıyorum; 18F4620 gerçekten de PIC18 ailesinin en iyi mikrodenetleyicilerinden biri, en göze çarpan özelliği de belleklerin geniş kapasiteli olması:

FLASH PROGRAM MEMORY : 64 KB
RAM : 3968 B                                 (doldur doldurabilirsen) 8)
EEPROM : 1024 B

Ben de yukarıda saydıklarımın yanında diğer birçok özellikleriyle 18F4620 ' yi tercih ediyorum.
En sevdiğim PIC18 modeli. :)