İç içe kesmeler

Başlatan senoleker, 05 Ocak 2015, 14:40:17

senoleker

Merhaba;
TMR0 ve TMR1 kesmelerini kullanarak bir kod yazdım:
sub interrupt
  if TMR0
    blabla
  end if

  if TMR1
   blabla
  end if
end sub


şeklinde.
Bu kod gayet iyi çalışıyor. TMR0 kısmı 10 Khz, TMR1 kısmı 100 Hz (sayıları salladım) çalışıyor.

Sorunum şu:
TMR1 rutininin çalışması örneğin 2 milisaniye sürüyor. Dolayısı ile TMR0 kısmı, bu süre içinde çalışmıyor.
TMR1 çalışmakta iken, TMR0 ın çalışmaya devam etmesini nasıl sağlarım?

Kodun ilgili kısmının tamamını paylaşıyorum:
program intTest

                 sub procedure Interrupt ()
                   if PIR1.TMR1IF=1 then
                    T1CON.TMR1ON = 0
                        portc.0=not portc.0
                        Delay_ms(2)
                    T1CON.TMR1ON = 1
                    PIR1.TMR1IF = 0
                   end if

                   if TMR0IF_bit=1 then
                   TMR0L  = 0
                   portc.1=not portc.1
                   TMR0IF_bit = 0
                   end if
                 end sub


main
  INTCON.PEIE = 1                        ' enable PEIE
  T1CON = 0                              ' no prescaler and Timer1 is Off
  PIE1.TMR1IE = 1                        ' interrupt enabled
  PIR1.TMR1IF = 0                        ' interrupt flag cleared
  T1CON.TMR1ON = 0                       ' start Timer1
  TMR0L = 0               ' Timer0 initial value
  T0CON = 0xC8            ' Set TMR0 to 8bit mode and prescaler to 256
  TMR0IP_bit=1 'TMR0 high priority
  TMR1IP_bit=0 'TMR1 low priority
  T1CON.TMR1ON = 1                       ' start Timer1
  TMR0IE_bit = 1          ' Enable Timer0 Interrupt
  GIE_bit = 1             ' Enable global Interrupt
while true
portc.2=not portc.2
wend
  end.


Sorunu net olarak ifade etmek için, portc.1 çıkışını temsili olarak gösteren bir görsel eklemek istiyorum:
Halbuki ben portc.1 çıkışında kesintisiz bir kare dalga görmek istiyorum.

ete

Bekledim bir fikri olan varsa cevap yazsın diye ama baktım pek fikri olan yok.
Zira sorunun cevabı aslında çözümsüz. Zira teorik olarak her 100us de bir kesme olurşturan bir sistem var ve yanında her 10000 us de bir kesme oluşturan ikinci bir sistem var. Büyük aralıklı kesme içine kısa aralıklı kesme girmektedir. Yani kesme içinde kesme olma ihtimali son derece yüksektir.
Bu durumda çözüm belkide büyük aralıklı kesme içinde kısa aralıklı kesme bayrağınında test edilmesi olabilir. Bu ne kadarlık bir kesintisizlik yaratır denemeden bilemem ama en azından hiç bakmamaktan iyidir.

Bu gibi durumlarsa amaç sabit bir frekans elde etmek ise bunun birisini (10Khz olanı) rahatlıkla HPWM sinyali olarak kesintisiz bir şekilde elde etmek mümkündür Diğerini kesmeye bağlayarak işini görebilirsin.  Başkada bir çare gözükmüyor.
Ancak ve ancak çok hızlı bir işlemci 100Mhz üzerinde ile çözüm biraz daha tatmin edici olabilirdi.

Ete

senoleker

Salt PWM ile çözülebilecek bir durum değil ne yazık ki. Bir robotun motorlarından birini sürüyoruz. Zaten dediğim gibi sayılar kolay anlaşılsın diye sallamasyon. Düşük frekanslı olan için farklı bir yol kullanarak çözeceğiz demek ki.
Doğrusunu isterseniz, kesmelerde "priority" lafını duyunca, düşük öncelikli kesmenin içinde iken yüksek öncelikli bir kesme gelirse düşük öncelikliyi bırakıp yüksek öncelikliye gider, işi bitince düşük öncelikliye geri döner diye düşünmüştüm. Sanırım beklentimi yüksek tuttum :)
Nu arada kullandığım chip: 18F46K22
O halde kesmelerdeki bu "öncelik" ne anlama geliyor ki?

ete

Priority den benimde anladığım aktif edilmiş iki kesmenin ikiside oluşmuş ise öncelik hangisinde ise onun kesmesi önce olur diye biliyorum ama hiç denemediğim bir özellik bu. Zaten yeni nesil işlemcilerde var yalnızca.

Ete

Powered by EzPortal