Uart Kesmesi ile Birlikte Timer Kesmesi Çakışması

Başlatan Muhittin22, 13 Aralık 2013, 23:17:43

Muhittin22

On_Hardware_Interrupt
Timer kemesini 10ms gibi ayarladım. Haberleşme yokken normal. Ancak haberleşme başladığı zaman iş karışıyor.
Haberleşme kesmesi esnasında timer kesmesi geliyor. Bunu nasıl çözeceğimi sormak istedim. Kolay gelsin.

Tagli

Gelsin. Normalde bunun bir soruna sebebiyet vermemesi lazım. Sıkıntı nedir?
Gökçe Tağlıoğlu

Muhittin22

Henüz Uart kesmesinden çıkmadan timer kesmesinin gelmesi uart işlemini yarıda bırakıyor. Ve haberleşme kopuyor.

Veli B.

Alıntı yapılan: Muhittin22 - 13 Aralık 2013, 23:17:43
On_Hardware_Interrupt
Timer kemesini 10ms gibi ayarladım. Haberleşme yokken normal. Ancak haberleşme başladığı zaman iş karışıyor.
Haberleşme kesmesi esnasında timer kesmesi geliyor. Bunu nasıl çözeceğimi sormak istedim. Kolay gelsin.
Göremediğim kadarı ile; On_Hardware_Interrupt ta sorun var.

Tagli

Bu elbette kesmelerin içinde ne yaptırdığına da bağlı ama normalde bu iki kesmenin de içinde fazla işlem yükü olmaz, veya olmamalı.

16 serisi PIC'lerde, özellikle kurcalanmadığı sürece kesmeler birbirini kesmez. 18'lerde bu durum olabilir. Ama bu durumda bile kesmelerin birbirini kesmesi sorun olmamalı. Ancak eğer timer kesmesi içinde çok uzun süren bir işlem yapıyorsan, ve timer kesmesi yüksek öncelikliyken iletişim kesmesi düşük öncelikli ise (sadece 18'lerde olabilir) böyle bir durum ortaya çıkabilir.

Kodu görmeden daha fazla yorum yapmak mümkün değil.
Gökçe Tağlıoğlu

Bayramsumbul

Assembly'de;Kesme bağrağına temizlemeden ve "RETFIE" komutu verilmeden kesmede iken kesmeye girmez şeklinde biliyorum.Kodunuzu paylaşır iseniz,bence daha sağlıklı bir yorum yapılabilir.
Bir Elektronik Meraklısının Serüveni...

Muhittin22

#6
İlgilenmenize teşekkür ederim.Selamlar.
Halihazırda kullandığım oluşmuş bir kod yok. Kullandığım uart kesmesi(Buffered_Hrsin) kodu proton'un kendi kütüphanesi. Diğeride basit taimer kesmesi. Kesme bayraklarının sıfırlanması sırasını farklı şekillerde denedim. Netice olmadı. Sn. Tagli arkadaşımın anlattıklarından aklımda bir iki test daha yapmam gerektiği fikri oluştu. Protonun uart kütüphanesinde de  hakim olamadığım noktalar var. Biraz daha inceleyeceğim. Kolay gelsin.

Muhittin22

#7
Selamlar.
Problemimi, aşağıdaki kodu kullanarak çözdük.
-Uart ve Timer kesme işlemleri için birer alt rutin oluşturduk.
-Her hangi birinden dolayı bir kesme oluşmuşsa, Kesme rutini içerisindeyken diğerinin kesme oluşturmasını engelledik.
-Öncelikli oluşan kesme işlemi tamamlandıktan sonra, diğer kesmenin bayrağına bakarak o kesmeninde gelip gelmediğini
eğer gelmişse onu da işleme koyarak. Çözmüş olduk.

Pic'in çalışmasında, taimer kesmesi disable yapılsa dahi, kesme zamanı geldiğinde bayrağı 1 oluyor.
Bu özelliğinden faydalandık.
Sonucu Paylaşmak istedim.

Hocalarımız tabi daha iyisini bilirler.

Teşekkürler.


On_Hardware_Interrupt GoTo Kesme


Kesme:
   'Önce Taimer kesmesi oluşmuşsa
   If PIR1.0=1 Then         'Timer kesme oluştu bayrağı.

       PIR1.0 = 0               'Timer kesme oluştu bayrağı sıfırla.
       PIE1bits_RCIE = 0   'Uart kesmesini durdur.
       GoSub Timerrutin     'Timer işlemlerini yap.

       If PIR1bits_RCIF = 1 Then GoSub Uartrutin 'Eğer bu esnada Uart bilgi almışsa onuda işle.

       PIE1bits_RCIE = 1   'Uart kesmesini aç.
       Retfie Fast               'Kemeden çık

    EndIf
   'Önce Uart kesmesi oluşmuşsa
    If PIR1bits_RCIF = 1 Then  'Uart kesme oluştu bayrağı.

       PIE1.0 = 0                'Taimer kesmesini durdur.
       GoSub Uartrutin       'Uart işlemlerini yap.   

       If PIR1.0 = 1 Then GoSub Timerrutin 'Eğer bu esnada Timer kesmesi peryodu gerçekleşmişse onuda işle.

       PIE1.0 = 1                'Taimer kesmesini aç.
       Retfie Fast                'Kesmeden çık

       EndIf                     
Retfie Fast                        'Kesmeden çık
Return

Timerrutin:
'.............
Return

Uartrutin:
'.............
Return