23 Kasım 2011 Çarşamba

2. Kesmeler (Devam 4)



Device 16F877
XTAL 4

 TRISB = %11110000
 PORTB = 0
 TRISC = 0
 PORTC = 0

 ON_HARDWARE_INTERRUPT GoTo Kesme
 INTCON = %10001000 
 GoTo AnaProgram

Kesme:
    If INTCON.0=1 Then  ;PortB değişim kesmesi oluştumu
        PORTC.4=PORTB.4
        PORTC.5=PORTB.5
        PORTC.6=PORTB.6
        PORTC.7=PORTB.7
        INTCON.0=0
    EndIf
Context Restore

AnaProgram:
    PORTC.3=1
    DelayMS 500
    PORTC.3=0
    DelayMS 500
GoTo AnaProgram



Yukarıdaki örnekte PortB’nin değişimi kesmesi kullanılmıştır. Kesme oluştuğunda kesmenin hangi nedenden dolayı oluştuğu direk olarak ilgili Led’e aktarılmıştır.


Şöyle ki program ilk çalıştığında kesme oluşmaz. Ama herhangi bir butona basıldığında ilgili uç değer değiştirir. Bu değer değişiminin anlamı şudur. İlgili pin Logic 0’da duruyorken Logic 1’e giderse değer değişimi oldu demektir ve kesme oluşur. Butonu basılı tuttuğunuzda kesme oluşmaz çünkü uç hala Logic 1’de duruyordur. Ama butonu bıraktığınızda Logic 1’de duran uç Logic 0’a gider ve yeniden bir kesme oluşur. Kesme 1’e giderken oluşursa ilgili led yanar 0’a giderken oluşursa ilgili Led söner.

23 Mart 2011 Çarşamba

2. Kesmeler (Devam 3)

Program 18’de aynı anda iki farklı kesme aynı anda kullanılmıştır. Option_Reg.5 ile Timer0’ın çalışması için gerekli olan osilatörü seçmektedir. Bu yazmaç 0 değerini aldığında mikrodenetleyici’ye bağlı olan osilatör seçilir eğer harici bir osilatör kullanmak istiyorsanız RA4 ucuna harici bir osilatör takarak ve bu yazmacı 1 yaparak bu harici osilatörüde kullanabilirsiniz.  Ayrıca osilatörü olduğu gibi kullanabileceğiniz gibi bölerek te kullanabilirsiniz. Eğer Option_Reg.3 0 değerini alırsa Taksimatlandırma oranı Timer0’a uygulanır. Option_Reg registerinin 0,1,2 nolu bitleri Taksimatlandırma oranını seçmemiz için kullanılır. Oran 1/256 için bu bitler 1 yapılır. (zamanlayıcılar ile ilgili daha detaylı anlatımları zamanlayıcılar isimli bölümde bulabilirsiniz.)



Prg: 18

           Device 16F877
XTAL 4

 TRISB = %00000001
 PORTB = 0
 TRISC = 0
 PORTC = 0

 OPTION_REG.5=0; Timer0 için dahili osilatörü kullan
 OPTION_REG.3=0; Taksimatlandırma oranını Timer0'a uygula
 OPTION_REG.2=1; 1/256 bölme değerini kullan
 OPTION_REG.1=1;
 OPTION_REG.0=1;
 TMR0=0

 Dim Sayac As Word
 Sayac=0

 ON_HARDWARE_INTERRUPT GoTo Kesme
 INTCON = %10110000 
 GoTo AnaProgram

Kesme:
    If INTCON.1=1 Then; RB0 kesmesi oluştu mu?
        Toggle PORTC.1
        INTCON.1 = 0
    EndIf
    If INTCON.2=1 Then; Timer0 kesmesi oluştu mu?
        Toggle PORTC.2
        INTCON.2=0
        Sayac=Sayac +1
        If Sayac>=10 Then
            Toggle PORTC.3
            Sayac=0
        EndIf       
    EndIf
Context Restore

AnaProgram:
    PORTC.0=1
    DelayMS 500
    PORTC.0=0
    DelayMS 500
GoTo AnaProgram


INTCON yazmacında da Bütün kesmeler, RB0 kesmesi, Timer0 kesmesi aktif hale getirilmiştir.

Ana program daha önceki örnek programda da olduğu gibi 500 Ms aralıklarla PortC.0’a bağlı Led yanıp sönecektir.

Eğer PortB.0’a bağlı butona basıldığında kesme devreye girecek ve Kesme isimli alt programa gidilecektir. Burada If önermesi ile INTCON yazmacındaki bayraklar test edilmektedir. Çünkü programda birden fazla kesme aktiftir. Kesmelerden hangisi oluşursa oluşsun her durumda da gidilen program parçası aynı yerdir. Dolayısı ile kesme alt programına gittiğimizde buraya neden geldiğimizi, hangi kesmenin oluştuğunu bilmemiz gerekmektedir.

Oluşan kesmenin ne olduğuna bağlı olarak yapmamız gereken iş farklı olacağı için If önermesi ile yapılacak işlemler birbirinden ayrılmıştır. Eğer RB.0 kesmesi oluşursa PortC.1’e bağlı Led konum değiştirecektir. Yok biz Timer0 kesmesinden dolayı bu alt programa geldi isek bu sefer PortC.1’e bağlı Led konum değiştirecektir.

Ayrıca Timer0 kesmesi oluştuğunda Sayac isimli değişkenin değeri bir arttırılmaktadır. Sayac değişkeninin değeri ne zaman 10’a eşit ve büyük olursa bu seferde PortC.3 e bağlı led konum değiştirmektedir.

Böylece 10 kez Timer0 oluştuğunda PortC.3 konum değiştirecektir.

Context Restore komutu gidilen Kesme alt programından ana programa geri dönüşü sağlayacaktır. Program sistem kapatılıncaya kadar bu şekilde çalışmasına devam edecektir.