İki kesme kullanırken farklı yerlere dallanma

Başlatan dyonizos, 24 Nisan 2012, 00:23:50

dyonizos

İki dış kaynak kesmesi olan pic te.
RB0 ile kesme oluştuğunda bir yere dallanma yapabiliyoruz malum.
Peki RB1 de oluşan bir kesmede farklı yere nasıl dallanma yapabiliriz. Mesela enerji kesilmesini algılamak için RB1 dış kaynak kesmesini kullanmak istersek.
Sonucta kesme için
On_Hardware_Interrupt GoTo KESME
diyoruz ama ikinci kesme için nasıl yazmamız gerek bunu ve mesela RB0 yükselen kenarda kesme oluşturuyor. RB1 in düşen kenarda oluşturması lazımki enerji kesilmesini algılayabilelim.
Hem iki kesme hem farklı yerlere dallanması gerekiyor hemde farklı koşullarda.

Aklıma gelen yol her tür kesmede aynı yere gitmesi ve kesme içinde IF-ELSE ile ayırmak ve işlem yaptırmak doğrumudur bu yöntem?
yani kesme içinde

IF PORTB.1=0 then 'eproma yaz

gibi birşeymi yapmamız lazım

Veli B.

Kesme rutini içerisinden dallanma yapmak çok doğru bir yöntem değil, hele ki built in tarzı, arkada kontrol edemediğimiz/etmediğimiz komutlar için. Stack yönetimini allak bullak etme ihtimali her daim mevcut. Bunun yerine kesme rutini içerisinde flag (durum bayrağı) olarak kullanabileceğimiz bir değişken ile oynamak ve ana omurga içinde bu değişkeni kontrol ederek ilgili dallanmaları yapmak çok daha mantıklı ve kullanışlıdır. Mümkün mertebe kesme rutini içerisinde işlem yapmamaya çalışın. Bu rutinin amacı sizi haberdar etmektir ve programın mükerrer kesmelerden dolayı çakılmaması için olması gereken GIE yi kapatmanızdır.(MCU ya göre bazı INT kaynaklarının flagları, GIE kapalı olsa da kalkar ama ISR ye dallanmaz)Bu yüzden, siz rutine girdiğinizde hızlıca işinizi görüp çıkmalısınız.
Bu arada PortBChange kesmesini çift taraflı kullanabilirsiniz. 0>1 ve 1>0 şeklinde.Dikkat edilmesi gereken  nokta PortB nin üst 4 bitini ya okuyarak yada yazarak baştan bilmektir.

dyonizos

#2
baska yere dallanma yapmadan su sekılde yapamazmıyız? 7805 den önce bir zener ve direncle RB1 pinine baglantı yapsak. 7805 den sonrada 10.000uf lık bir kondansator baglasak. enerjı kesıldıgınde RB1 0 a dusunce eeproma kayıt ettırsek?

kesme:
Context SAVE
If INT0IF = 1 Then Inc PULSELITRE

If INT1IF = 1 Then Write 8, [PULSELITRE]

INT0IF=0
INT1IF=0

Context Restore
Resume

Veli B.

Final sahnesi olacak diyorsanız, olur.
10mf çok fazla. 470uf yeterli. Cevresel kapatmaları yapın sadece. GLCD BL vb.

dyonizos

kesme tanımlamalarımda bır sorun var sanırım. Kayıt etmıyor enerjıyı kesınce.

    Symbol GIEH    = INTCON.7   'GIE/GIEH: High Priority Interrupt Enable bit
'INTERRUPT 0 DECLARES - Wheel Speed
    'Symbol INT0IP  = INTCON3.6  'External Interrupt Priority Bit
    'Symbol INTEDG0 = INTCON2.6  'External Interrupt Edge selection Rise
    Symbol INT0IE  = INTCON.4   'External Interrupt Enable Bit
    Symbol INT0IF  = INTCON.1   'External Interrupt Flag   
'INTERRUPT 1 DECLARES - HR
    'Symbol INT1IP  = INTCON3.6  'External Interrupt Priority Bit
    'Symbol INTEDG1 = INTCON2.5  'External Interrupt Edge selection Rise
    Symbol INT1IE  = INTCON3.3  'External Interupt Enable Bit    
    Symbol INT1IF  = INTCON3.0  'External Interrupt Flag 

        GIEH=0            
        INT0IE = 1
        INT1IE = 1                   
        GIEH=1


zaten bu tanımlamalarla nasıl RB1 pinini low da iken kesmeye götürücem anlamadım.