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.

22 Şubat 2011 Salı

2. Kesmeler (devam 2)

Devre 5
Öncelikle devremizi inceleyelim. Devre yapı itibariyle diğer devrelerden farklı değil. PortB.0 bacağına bir buton bağlanmış PortC ucuna ise dört adet led bağlı. (Led’lerin çalışma voltajı +5V’a alınmış ve bu nedenle de direnç bağlanmamıştır.)

Burada RB0 harici kesmesinin nasıl kullanılacağını inceleyeceğiz. Port isimlerine dikkat edilirse RB0/INT ifadesini göreceksiniz. Buradaki INT kısaltması interrupt kelimesinin kısaltmasıdır yani bu ucun kesme giriş noktası olduğunu göstermektedir. Butonun bağlanışına dikkat ederseniz, Buton basılı değilken bu uç Logic 0’da kalmaktadır. Butona basıldığında ise Logic olarak 1 durumuna gitmektedir. Bu önemli bir durumdur. Çünkü bu girişin hangi Logic durumda kesmeye gideceği ayarlamamız gerekmektedir. Dışarıdan gelen bilgi Logic 1 olduğunda kesme oluştur yada Logic 0 olduğunda kesme oluştur. Hangi durum devremiz için uygunsa birisinin seçilmesi gerekir. Eğer bu ayar yapılmadı ise standart olarak bu Logic 1’e gidince kesme oluştura ayarlıdır. Bunun ayarlamasını daha sonraki örnekte inceleyeceğiz. Şimdiki örneğimizde kesme Logic 1’deyken oluşacaktır.
 Prg 16:

           Device 16F877
XTAL 4

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

 ON_HARDWARE_INTERRUPT GoTo Kesme
 INTCON = %10010000 
 GoTo AnaProgram

Kesme:
    Toggle PORTC.1
    INTCON.1 = 0
Context Restore

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


Klasik cihaz ve kristal tanımlamalarının ardından Portların tanımlamaları yapılmıştır. PortB’nin 0 nolu ucu giriş diğer uçları çıkış, PortC’nin bütün uçları çıkış olarak tanımlanmıştır.

“ON_HARDWARE_INTERRUPT GoTo Kesme” satırında donanımsal kesme oluştuğunda ana programdan ayrılıp gidilmesi gereken etiket adresi belirtilmiştir.

 INTCON = %10010000 satırında  ise evrensel kesme ile birlikte PortB.0 kesmesi aktif hale getirilmiştir. Hemen arkasından GoTo Ana Program diyerek asıl çalışacak olan program etiketine gidilmiştir. Çünkü eğer bu işlem yapılmaz ise kesme rutini programın başında tanımlandığı için kesme oluşmasa da kesme rutini çalışacaktır. Bu istenmeyen bir durumdur bu yüzden programın çalışması sırasında kesme rutininin üzerinden atlanması gerekmektedir.

Ana program içinde yapılan işlem programdan da görebileceğiniz gibi 500 Ms aralıklar ile PortC.0’a bağlı olan led’in yakılıp söndürülmesidir. Bu işlem mikrodenetleyici tarafından bir döngü içinde sürekli tekrar edilirken eğer butona basılırsa bir kesme oluşacaktır. Programın neresinde olursanız olun kesme oluştuğunda direk olarak kesme isimli alt programa yönlenirsiniz. Bu alt programda PortC.1’rine bağlı Led durum değiştirecektir. Alt programdan geri dönerken önce ilgili bayrağı INTCON.1 = 0 komutunu kullanarak sıfırlamamız gerekmektedir. Context Restore komutu ile de ana programda kaldığımız yere geri dönmekteyiz. Eğer bayrağı sıfırlamadan ana programa geri dönersek bayrak hala Logic 1 olduğu için yeniden kesme oluşmamış olsa bile kesme alt programına tekrar geri dönüş yaparız.

Bu programı eğer kesme kullanmaz isek aşağıdaki şekilde de yazabiliriz.

Prg 17:

            Device 16F877
XTAL 4

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

AnaProgram:
    If PORTB.0=1 Then Toggle PORTC.1
    PORTC.0=1
    DelayMS 500
    PORTC.0=0
    DelayMS 500
GoTo AnaProgram


Yukarıdaki programın kesme kullanmadan farkı ne diye düşünürseniz; programa dikkatli baktığınızda farkın çok büyük olduğunu göreceksiniz. If önermesi ile butona basılmasının kontrolü yapıldıktan sonra yaklaşık olarak 1 sn boyunca butona basılma kontrolü tekrar yapılmamakta. Eğer bu sırada butona basılıp çekilirse program butona basıldığının farkına varmayacaktır. Normal çalışmasına devam edecektir.  Böylelikle basılan tuşlar kaçırılacak ve programınız yapması gereken işi yapamayacaktır.

31 Ocak 2011 Pazartesi

2. Kesmeler (devam 1)

INTCON YAZMACI
               
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-X
GIE
PEIE
T0IE
INTE
RBIE
T0IF
INTF
RBIF
Bit 7






Bit 0

Bit 7       GIE: Bütün Kesmeleri Devreye Al
                                1=Bütün kesmeler devrede
                               0=Kesmeler devre dışı
                Bit 6       PEIE: Haberleşme kesmesi
                               1=Haberleşme kesmesi devrede
                               0=Haberleşme kesmesi devre dışı
                Bit 5       T0IE: Timer0 kesmesi
                               1=Timer 0 kesmesi devrede
                               0=Timer 0 kesmesi devre dışı
                Bit 4       INTE: RB0 harici kesmesi
                               1=RB0 harici kesmesi devrede
                               0=RB0 harici kesmesi devre dışı
                Bit 3       RBIE: PortB’nin değişim kesmesi
                                1=Değişim kesmesi devrede
                               0=Değişim kesmesi devre dışı
                Bit 2       T0IF: Timer 0 bayrağı
                               1=Timer 0 kesmesi oluştu
                               0=Timer 0 kesmesi oluşmadı
                Bit 1       INTF: RB0 kesmesi bayrağı
                               1=RB0 kesmesi oluştu
                               0=RB0 kesmesi oluşmadı
                Bit 0       RBIF: PortB Değişim bayrağı
                               1=PortB değişim kesmesi oluştu
                               0=PortB değişim kesmesi oluşmadı

OPTION_REG YAZMACI

R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
R/W-1
RBPU
INTEDG
T0CS
T0SE
PSA
PS2
PS1
PS0
Bit 7






Bit 0

                Bit 7       RBPU: PortB Pull-up aktif biti
                               1=PortB Pull-ups aktif değil
                               0=PortB Pull-ups aktif
                Bit 6       INTEDG: Kesme kenarı seçimi
                               1=RB0 kesmesini kenar yükselirken oluştur
                               0=RB0 kesmesini kenar düşerken oluştur
                Bit 5       T0CS: Timer0 clock kaynağı seçim biti
                               1=RA4 ucundan harici Clock kaynağı
                               0=Dahili osilatörü kullan
                Bit 4       T0SE: Harici Timer0 kaynağının tetikleme kenar seçimi
                               1=RA4 ucu Yüksekten düşüğe giderken tetiklen
                               0=RA4 ucu Düşükten yükseğe çıkarken tetiklen
                Bit 3       PSA: Taksimatlandırma değerinin uygulanacağı zamanlayıcı
                               1= WDT’ye uygula
                               0=Timer0’a uygula
                Bit 2-0   Taksimatlandırma değeri


Bit
TMR0
WTD
000
1:2
1:1
001
1:4
1:2
010
1:8
1:4
011
1:16
1:8
100
1:32
1:16
101
1:64
1:32
110
1:128
1:64
111
1:256
1:128











PIE1 YAZMACI

R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
PSPIE
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
Bit 7






Bit 0

                Bit 7       PSPIE: Paralel Slave Port Okuma/Yazma kesmesi
                               1=PSP Okuma/Yazma kesmesi aktif
                               0= PSP Okuma/Yazma kesmesi aktif değil
                Bit 6       ADIE: A/D çevirici kesmesi
                               1=A/D kesmesi aktif
                               0=A/D kesmesi aktif değil
                Bit 5       RCIE: USART alıcı kesmesi
                               1=USART alıcı kesmesi aktif
                               0=USART alıcı kesmesi aktif değil
                Bit 4       TXIE: USART gönderici kesmesi
                               1=USART gönderici kesmesi aktif
                               0=USART gönderici kesmesi aktif değil
                Bit 3       SSPIE: Senkron Seri Port kesmesi
                               1=SSP kesmesi aktif
                               0=SSP kesmesi aktif değil
                Bit 2       CCP1IE:CCP1 kesmesi
                               1=CCP1 kesmesi aktif
                               0=CCP1 kesmesi aktif değil
                Bit 1       TRM2IE:Timer2 kesmesi
                               1=Timer2 kesmesi aktif
                               0=Timer2 kesmesi aktif değil
                Bit 0       TMR1IE:Timer1 kesmesi
                               1=Timer1 kesmesi aktif
                               0=Timer1 kesmesi aktif değil

PIE2 YAZMACI

R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0








Bit 7






Bit 0

                Bit 7       Kullanılmıyor
                Bit 6       Ayrılmış Alan
                Bit 5       Kullanılmıyor
                Bit 4       EEIE: Eprom yazma kesmesi
                               1=Eprom yazma kesmesi kesmesi aktif
                               0= Eprom yazma kesmesi kesmesi aktif değil
                Bit 3       BCLIE: Hat çarpışması kesmesi
                               1=BCLIE kesmesi aktif
                               0=BCLIE kesmesi aktif değil
                Bit 2       Kullanılmıyor
                Bit 1       Kullanılmıyor
                Bit 0       CCP2IE:CCP2 kesmesi
                               1=CCP2 kesmesi aktif
                               0=CCP2 kesmesi aktif değil



PIR1 YAZMACI
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0








Bit 7






Bit 0

                Bit 7        PSPIF: Paralel Slave Port Okuma/Yazma bayrağı
                               1=Okuma/Yazma kesmesi oluştu
                               0=Kesme oluşmadı
                Bit 6        ADIF: A/D çevirici kesme bayrağı
                               1=AD çevrimi tamamlandı
                               0=AD çevirimi henüz tamamlanmadı
                Bit 5        RCIF: USART alıcı kesmesi bayrağı
                               1=Alıcı tamponu dolu (veri geldi)
                               0=Alıcı tamponu boş
                Bit 4        TXIF: USART gönderici kesmesi bayrağı
                               1=Gönderici tamponu boş (Veri gönderildi)
                               0=Gönderici tamponu dolu
                Bit 3        SSPIF: Senkron Seri Port kesme bayrağı
                               1=SSP kesmesi oluştu
§   SPI: Gönderme/Alma işlemi gerçekleşti
§   I2C Slave: Gönderme/Alma işlemi gerçekleşti
§   I2C Master:
·          Gönderme/Alma işlemi gerçekleşti
·          START bilgisi oluştu
·          STOP bilgisi oluştu
·          RESTART bilgisi oluştu
·          Acknowledge bilgisi oluştu
·          START/STOP bilgisi oluştu ( Multi-Master sistemde)
                                               0=SSP kesmesi oluşmadı
                Bit 2        CCP1IF: CCP1 kesme bayrağı
                               Capture Modu için
                                               1=Tmr1 kesmesi oluştu
                                               0=Tmr1 kesmesi oluşmadı
                                               Compare Modu için
                                               1=Tmr1 kesmesi oluştu
                                               0=Tmr1 kesmesi oluşmadı
                                               Pwm Modu için
                                               Kullanılmaz
                Bit 1        TMR2IF:Timer2 kesmesi bayrağı
                               1=Timer2 kesmesi oluştu
                               0=Timer2 kesmesi oluşmadı
                Bit 0        TMR1IF:Timer1 kesmesi bayrağı
                               1=Timer1 kesmesi oluştu
                               0=Timer1 kesmesi oluşmadı

PIR2 YAZMACI

R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0








Bit 7






Bit 0

                Bit 7       Kullanılmıyor
                Bit 6       Ayrılmış Alan
                Bit 5       Kullanılmıyor
                Bit 4       EEIE: Eprom yazma kesmesi bayrağı
                               1=Eprom yazma kesmesi kesmesi oluştu
                               0= Eprom yazma kesmesi kesmesi oluşmadı
                Bit 3       BCLIE: Hat çarpışması kesmesi
                               1=BCLIE kesmesi oluştu
                               0=BCLIE kesmesi aktif oluşmadı
                Bit 2       Kullanılmıyor
                Bit 1       Kullanılmıyor
                Bit 0       CCP2IE:CCP2 kesmesi
                               1=CCP2 kesmesi oluştu
                               0=CCP2 kesmesi aktif oluşmadı