PBP Kesmelerdeki Mantık Hatası

Başlatan Ruzgarbey, 28 Eylül 2010, 12:21:57

Ruzgarbey

merhaba arkadaşlar.bildiğiniz gibi pbp kesmeyi aşağıdaki gibi kullanıyoruz.
Disable
Kesme:
HSERIN 10,CIK, [wait("MES"),VERI]
resume
enable

bu şekildeki kodlarda benim mantığıma sığmayan bir durum var.
Kesmeye başlamadan önce Disable diyerek Kesme Rutininden çıkana kadar başka kesme olmasını engelliyoruz.işte mantık burada sapıtıyor.
Koddada gördüğünüz gibi Hserin Komutunu 10 ms "MES" verisini beklemeye programlıyoruz.ve kod bu şekilde çalışıyor. peki kesmeye başlamadan önceki Disable komutumuza noldu bizim?hani bu komut kesmeden çıkana kadar başka kesme olmasını engelliyordu.başka kesme olmayacaksa biz neden Hserinde Wait komutuyla belli bir veriyi bekliyoruz :)
Asm dosyasınıda inceledim.kesme etiketinden sonra kesme kontrol etiketi çağrılmıyor.iyide bu Hserin Komutu bizim belirlediğimiz sürede belirlediğimiz datayı Datayı Nasıl alıyor?
Buyrun Prinç Pilavına  :)
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

ete

Senin düşündüğünün aksine beklediğin data 10ms içinde gelmez ise belirlediğin etikete atlıyor program.
Yoksa data geldiğinde alış süresi belkide 1ms den az bir süreyi kapsıyor.
Şayet süre kısıtlamasını koymaz isen sanırım 65535 ms data gelmesi bekleniyor. Bu ise zaman bağlı çalışan başka alt programların var ise onların sekteye uğramasına sebep olur. Bu nedenle bekleme süresi genelde koyulur faydalıdırda.
Ben bekleme sürelerini en fazla 5ms koyarım genelde 2-3 ms koyuyorum. Zaten USART'a bir bir bilgi geldiği zaman kesme oluşuyor. Gelen kesme beklediğin data ya ait ise 1-2 ms de işini halledip kaldığın yere dönmelisin. Yok yanlış bir kesme ise en fazla 3-5 ms bekleyip geri dönmelisin. 10 ms bekleme koymak zaten yanlış diyebileceğim bir uygulama. Tabiiki beklediğin data nın boyutunada bağlı ama hiç bir data zincirinin 10ms süre ile alınacağını sanmıyorum.

Sorunu anlamakda zor aslında neyi kast ettiğini tam olarak anlamamakla birlikte tahminime göre bir kesme oluştu ve data almaya başladık 10 ms süre ile her yeni data geldiğinde yeni kesme oluşacakmış gibi bir anlam yaratmışsın. Olay öyle değil maalesef.

USART kesmesinden bahsettiğimizi düşünerek , USRAT'a bir bilgi ulaştığında hemen kesme oluşur ve program kesme etiketine gelir. Bir nevi USART uyandırılmış olur.  Kesme oluştuğunda daha senin HSERIN komutun faaliyete geçmemiştir. Kesme kısmında program bu komutu görünce gelen dataları sırası ile almaya başlar. Burada temel düşünce şudur. Yollanan bilginin başına yerleştirilen uyandırma bilgisi kesme oluşmasına sebep olacaktır. Kesmeyi bunlar açacak ama ardından gelen işaretçiler "MES" ve asıl bilgi (VERI) ise HESERIN komutu ile alınacaktır. Dolayısıyla tek bilgi paketi bir kesmede alınmış olacaktır. Bu nedenden dolayıdırki 10ms lik bekleme süresi bana göre uzun en fazla 5 ms olmalıdır.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Ruzgarbey

hocam cevabınız için teşekkür ederim.
kodumdaki 10 ms bekleme süresi öylesine yazılmıştır.realde alacağım data 1ms kısa olduğu için genelde 1 ms kullanıyorum.benim anlamaya çalıştığım şudur.
Sorduğum soruya kendim cevap vereyim :)
USART a veri geldiğinde RCIF bayrağı 1 oluyor ve kesme olayı aktif oluyor.pic kesme etiketine dallanıp 1 ve bizim belirlediğimiz bir süre alınması istediğimiz datayı alabilmek için bekliyor.datayı aldıktan sonra bir değişkene veya değişkenlere sonraki dataları yerleştiriyor. işte benim anlamaya çalıştığım buydu.bu zaman zarfında RCIF bayrağımız hala 1 durumda kalıyor.ne zaman 0 a düşüyor tabiki stop bitinden sonra :)
ben 8N1 deki stop bitini unutup her bytede RCIF bayrağınız set olduğunu düşünüyordum.saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

ete

Bildiğim kadarı ile RCIF bayrağı ancak RCREG registerinin okunup bir başka değişkene aktarılması ile otomatik olarak sıfırlanıyor. Bu nedenle PBP da RCIF in sıfırlanması için, Hserin komutundan sonra yada komutun içinde belirtilen ATla etiketine,

TEMP=RCREG
şeklinde bir komut ilave edilerek bayrağın sıfırlanması sağlanmaktadır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Ruzgarbey

haklısınız hocam.RCIF bayrağının sıfırlanması için RCREG in okunması gerekiyor.mcu mimarisinde RCREG okunmaya çalışıldığında kendini siliyor.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK