Bilgi ve Uygulama

PIC18F2550 Assembly İle 2 Motorun Belirli Koşullara Göre Sürülmesi

Yazar: İsmail Sahillioğlu
Tarih: 24.02.2017
Türkçe
1. Devrenin Yapısı:


Kontrol devresi şekilde de görüldüğü gibi bir sıfırlama(RESET) girişi, 2 motorun denetimini yapan 1-başlat, 1-durdur buton girişi, Aşırı Akım Rölesinden gelen 2 sinyal bilgisi girişi, 2 hata düzeltildi onay butonu girişi, 2 adet Motor1 ve Motor2 çıkışı, 2 hata göstergesi çıkışı ve sayaç devresini süren 3 uçtan oluşmaktadır. 6-harici giriş, 4-harici çıkış ve 3-dahili çıkış olmak üzere toplam 13 adet giriş-çıkış ucu kullanılmıştır.

Sayaç devresi de 1Hz saat darbesi üreteci, 2x7-Parçalı LED gösterge, göstergeleri süren 2xCD4026 7-Parçalı gösterge sürücü entegresinden oluşmaktadır. Gerekirse entegrelerin LED sürücü uçlarına direnç bağlanabilir.

Not: Burada çoğu şeyi ayrıntılarıyla anlattığım için açıklama biraz uzun oldu. Böyle olması konuya tam hakim olmayanlar tarafından konunun rahatlıkla anlaşılabilmesi içindir.

EKLER:

2. Devrenin Çalışması:

Devreye enerji verildiğinde, Kontrol devresi kullanıcının BAŞLA butonuna basmasını bekler.

Kullanıcı başla butonuna bastığında;

  • 1. Motor devreye girer,
  • Ardından gösterge etkinleşir,
  • Timer0 etkinleşir ve 10 saniye için gösterge saymaya başlar.
  • 10 saniyenin dolması beklenir.
  • 10 saniye dolunca, 2. motor devreye girer
  • Sayaçlar sıfırlanır ve 30 saniye için kurulur.
  • Gösterge 30 saniye saymaya başlar.
  • Ancak 1. motor 10sn çalıştıktan ve 2. motor da 30sn çalıştıktan sonra devre DUR butonuyla durdurulabilir. Bu süreden önce DUR butonu işlevsizdir.
  • Süreler dolunca DUR butonuna basıldığında önce 2. motor durur. Dur butonuna ikinci kez basıldığında ise tüm devre durur ve kullanıcıdan gelecek başlatma komutunu bekler.
  • Herhangi bir esnada RE3/MCLR/VPP bacağına bağlı sıfırlama butonuna basıldığında devre ilk konumuna geri döner ve kullanıcıdan BAŞLAT komutunu vermesini bekler.

2.1. Hata Durumu:

Güç devresinde bir aşırı yüklenme ya da başka bir hata dolayısıyla AAR1(Aşırı Akım Rölesi) ve AAR2 girişlerinden bir hata bilgisi geldiğinde şu senaryolar gerçekleşecektir:

I. Eğer 1. motor 10sn dolmadan önce hata verirse:

  • Motor-1 durdurulur.
  • Göstergeler kapanır ve sıfırlanır.
  • Timer0 durdurulur ve sıfırlanır.
  • Motor-1 hata göstergesi yanıp sönmeye başlar.
  • Güç devresindeki hatanın giderilmesi beklenir.
  • Ardından hata düzeltme onay butonuna basılması beklenir.
  • Yukarıdaki işlemler tamamlandığında motor-1 yeniden 10sn çalıştırılmak üzere yazılım içinde kurulur ve ardından motor-1'e yeniden çıkış verilir.
  • Sonra göstergeler etkinleşir ve 10sn için sayar.


II. Eğer 1. motor 10sn dolduktan sonra hata verirse ve 2. motor çalışıyors ama 30sn dolmamışsa:

  • Motor-1 durdurulur.
  • Göstergeler kapanır.
  • Timer0 durdurulur.
  • Motor-1 hata göstergesi yanıp sönmeye başlar.
  • Hatanın giderilip hata düzeltme onay butonuna basması beklenir.
  • Motor-2 çalışıyor olduğu için motor-1'in yeniden 10sn çalışmasına gerek yoktur. Bu yüzden sayaçlar sıfırlanmaz.
  • Motor-1'e yeniden çıkış verilir.
  • Sayaç 30sn bitirmek için kaldığı yerden saymaya devam eder.


III. Eğer 1. motor 10sn ve 30sn süreleri dolduktan sonra hata verirse:

  • Motor-1 durdurulur.
  • Göstergeler kapanır.
  • Timer0 durdurulur.
  • Motor-1 hata göstergesi yanıp sönmeye başlar.
  • Hatanın giderilip hata düzeltme onay butonuna basması beklenir.
  • Motor-2 çalışıyor olduğu için motor-1'in yeniden 10sn çalışmasına gerek yoktur. Bu yüzden sayaçlar sıfırlanmaz.
  • Motor-1'e yeniden çıkış verilir.
  • Sayaç sistemi etkinleştirilmez çünkü sayma işlemleri bitmiştir.


IV. Eğer 2. motor 30sn dolmadan hata verirse:

  • Motor-2 durdurulur.
  • Göstergeler kapanır ve sıfırlanır.
  • Timer0 durdurulur ve sıfırlanır.
  • Motor-2 hata göstergesi yanıp sönmeye başlar.
  • Hatanın giderilip hata düzeltme onay butonuna basması beklenir.
  • Sayaçlar sıfırlanır ve yeniden kurulur.
  • Motor-1 durdurulur ve yeniden 10sn çalışması için kurulur.
  • Motor-1 yeniden devreye alınır.
  • Timer0 yeniden kurulur ve etkinleştirilir.
  • Göstergeler etkinleştirilir ve 10sn için saymaya başlar.


V. Eğer 2. motor 30sn dolduktan sonra hata verirse:

  • Motor-2 durdurulur.
  • Göstergeler kapanır.
  • Timer0 durdurulur.
  • Motor-2 hata göstergesi yanıp sönmeye başlar.
  • Hatanın giderilip hata düzeltme onay butonuna basması beklenir.
  • Motor-2'ye yeniden çıkış verilir.
  • Sayaç sistemi etkinleştirilmez çünkü sayma işlemleri bitmiştir.

3. Donanım:

Bu örnek devrede Timer0 ve kesme donanımlarının PIC18 Assembly içinde nasıl düzenlenip programlanabileceği ve işletilebileceği açıklanmıştır. Ayrıca harici bir sayaç devresi ve 1Hz/s'lik bir saat kaynağı devresi kullanılmıştır. Bu sayede 7-Parçalı(burada ortak katotkullanılmıştır) göstergelerin CD4026 ile nasıl sürülebileceği ve 555 entegresi ile nasıl bir saat darbesi kaynağı oluşturulabileceği de görülecektir. Devre bredboard üzerinde kurulmuş ve denenmiştir.

Not: Vidyoyu kaydettikten bu yana yazılım içinde birkaç iyileştirme yaptım. Bu yüzden devre denendiğinde vidyodaki çalışma şeklinden biraz daha farklı olacaktır. Bu iyileştirmeler hata senaryolarının daha kararlı işletilmesi için yazılımın çeşitli bölgelerinde uygulanmıştır.

Aşağıda PIC18F2550 mikrodenetçisinin bacak düzeni ve ardından kontrol devresinin giriş-çıkış uçlarının işlevleri verilmiştir:

28-Pin PDIP, SOIC

1) RA1 (giriş): Motor-1 için hata düzeltildi onay butonu girişi.
2) RA2 (giriş): Motor-2 için hata düzeltildi onay butonu girişi.
3) RA3 (çıkış): 4026 Entegresinin Gösterge Etkinleştirme/Display Enable In(DEI) ucunu denetler.
4) RA5 (çıkış): 4026 Entegresinin Saat Engelleme / Clock Inhibit(INH) ucunu denetler.
5) RB1 (harici kesme girişi): 1. Motorun aşırı akım rölesi kontak bilgisi girişi ve 1. harici kesme ucudur.
6) RB2 (harici kesme girişi): 2. Motorun aşırı akım rölesi kontak bilgisi girişi ve 2. harici kesme ucudur.
7) RB3 (giriş): BAŞLA butonu giriş ucudur.
8) RB4 (giriş): DUR butonu giriş ucudur.
9) RC0 (çıkış): 4026 Entegresinin Sıfırlama / Reset(MR) ucunu denetler.
10) RC1 (çıkış): Motor-1 için hata göstergesi çıkışı.
11) RC2 (çıkış): Motor-2 için hata göstergesi çıkışı.
12) RC6 (çıkış): 1. Motoru süren uçtur.
13) RC7 (çıkış): 2. Motoru süren uçtur.


  • Osilatör kaynağı olarak mikrodenetleyicinin dahili 8Mhz'lik osilatör kaynağı kullanılmıştır. Bu kaynak yazılım içinde 1MHz hızda çalışacak şekilde ayarlanmıştır. Bu sayede osilatör giriş ve çıkış pinleri özgür bırakılmış olup, dijital giriş-çıkış olarak kullanılabilecektir.

  • Sürevci(zamanlayıcı) olarak 18F2550 denetleyicisinin dahili Timer0 donanımı kullanılmıştır. Yazılım bölümünde Timer0'ın hesaplamaları verilecektir.

  • Sayaç devresinin saat kaynağı olarak; saniyede yaklaşık 1Hz'lik darbe üreten bir 555 devresi kullanılmıştır. Ancak istenildiği takdirde saat üreteci olarak yeterli donanıma sahipse, kullanılan mikrodenetleyiciden de yararlanılabilir.
    Benim vidyoda kullandığım 555 entegreli devrede saat darbeleri tam olarak her 1sn'de bir üretilmez ancak burada çok hassas zamanlı bir proje yapmadığımız için bu durum göz ardı

    edilebilir. Uygulamada kullandığım 555 saat üreteci devresi ve eleman değerleri aşağıda görülmektedir.


    • Uygulamada 555 entegresinin çıkış bacağı olan 3. bacak ve R10 arasından bir kablo ile 1. haneyi süren 4026 entegresinin 1. bacağına (Clock) bağlayın. Böylece sayaç saat kaynağını sağlamış olursunuz.

Eğer 555 sinyal üreteç devresinin nasıl çalıştığıyla ve nasıl hesaplandığıyla kafa yormak istemiyorsanız AŞAĞIDAKİ BİLGİLERİ OKUMADAN GEÇİN.

555 Sinyal Üreteci Devresinin Çalışması ve Hesaplamaları:

    • 555 Entegresi burada astable/kararsız kipte çalışmaktadır.

    • Hızlıca: Devreye eneji verildiğinde C2 kondansatörü R8 ve R9 üzerinden dolmaya başlar. C2 uygulanan gerilime tamamen dolduğunda, R9 ve 7.bacak üzerinden 555 entegresi içinde bulunan bir boşaltma transistörü üzerinden şaseye batırılır ve bu yol üzerinden boşalmaya başlar. C2 artı kutbundaki gerilim uygulama geriliminin 1/3 düzeyine gelince 555, 3 numaralı bacağından yüksek çıkış verebilmek için 2 numaralı bacağından gerekli tetiklemeyi almış olur ve ardından 555 çıkışı lojik 1 ya da yüksek seviyededir. Sonra kondansatör R8 ve R9 dirençleri üzerinden yeniden dolmaya başlar. C2 uygulama geriliminin 2/3 düzeyine dolduktan sonra 555 tetikleme durumundan çıkar ve çıkışı lojik 0 ya da düşük seviyeye çeker. İşte kondansatörün dirençler üzerinden dolup, yine direnç ve entegre üzerinden boşalırken geçen zaman T süresini verir ve oluşturduğu testere dişi sinyal, 555 tarafından kare dalga sinyale dönüştürülür. Oluşan bu sinyal bizim gösterge devresi için kullanacağımız saat sinyalidir.

    • Yukarıdaki şekilde boşaltma(discharge) direnç(R9) değeri 14,7k(10k ve 4,7k iki direncin seri bağlanmasıyla oluşturuldu) kullanılmıştır. Dilenirse 14,7k direnç yerine 50k bir potansiyometre bağlanıp gereken değere ayarlanarak 1 saniyeye daha yakın bir süre elde edilebilir. Kondansatör dolarken 1k + 14,7k dirençleri üzerinden dolmakta, boşalırken de 14,7k direnci boyunca 555'in 7.(discharge) ucu aracılığıyla boşalmaktadır. Bu da %50'ye yakın bir görev çevrimi/duty cycle oranı vermektedir (tam oran = %51,13647).

    • Bu değerlerle 555 entegresinin veribetinde(datasheet) verdiği süre formülünü kullanarak hesaplayacak olursak:


T = 0,693 x (R8 + 2 x R9) x C2
T = 0,693 x ([1x10
3] + 2 x [14,7x103]) x (47x10-6)
T = 0,693 x (1000 + [2 x 14700]) x 0,000047
T = 0,693 x 30400 x 0,000047
T = 0,9901584 saniye (1 saniyeden 9,8416 milisaniye eksik :) )

Yukarıdaki sonuca göre frekansı bulmak istersek şu formülle hesaplayabiliriz:

f = 1 / t
f = 1/0,9901584 = 1,009939419793843Hz

  • Sayaç devresi 2x7-parçalı (7-segment) LED göstergeleri ve bu göstergeleri süren 2xCD4026 birimlerinden oluşur. 10 ve 30 saniyelik süreler mikrodenetleyicinin dahili sürevcisinde üretilir ve bu süreler boyunca gösterge devresi 4026 entegresinin denetim esnekliğinin olması sayesinde; mikrodenetleyicinin RA3, RA5 ve RC0 uçları tarafından denetlenir.

    • RA3 (çıkış): 4026 Entegresinin Gösterge Etkinleştirme Girişi/Display Enable In(DEI) ucunu denetler.

    • RA5 (çıkış): 4026 Entegresinin Saat darbesi Engelleme / Clock Inhibit(INH) ucunu denetler.

    • RC0 (çıkış): 4026 Entegresinin Sıfırlama / Reset(MR) ucunu denetler.

CD4026 entegresinin bacak yapısı aşağıda gösteriliyor.


  • Donanım bölümünde son olarak 7-parçalı ortak katot LED göstergenin şeklini ve iç yapısını paylaşacağım:


Yukarıdaki şekilde göstergenin bacak bağlantısı ve iç yapısının mantığı görülüyor.

Buna göre 4026 entegresinin "a,b,c,d,e,f,g" uçları göstergenin karşılık gelen "a,b,c,d,e,f,g" uçlarına dirençler aracılığıyla ya da doğrudan bağlanabilir.

Eğer daha güvenli olması açısından direnç bağlamaya karar verilirse 7 adet 220 ohm değerinde direnç bağlanabilir.

4. Yazılım:

Yazılımda kullanılan neredeyse tüm yazmaçların/dosyaların, etiket ve komutların Türkçe açıklamaları yapılmıştır. Burada kesmelerin ve Timer0 sürevcisinin hazırlanması, Timer0 hesabı, yazılım bayrakları ve yazılım sayaçlarının açıklamaları yapılacak.

  • Timer0 önce 10 saniye sonra da 30 saniyelik süreleri üretmesi için kullanılmıştır. PIC18F2550'de Timer0'ın önölçekçisi(prescaler) PIC16 serisinde olduğu gibi WatchDog Timer ile paylaştırılmamıştır. Önölçekçi yalnızca Timer0'a aittir. Ayrıca Timer0 ya 8-bit ya da 16-bit kipinde çalışma özelliğine sahiptir. Aşağıda Timer0'ın 8-bit kipinde blok diyagramı görülüyor.



Timer0 ile ilgili düzenlemeler T0CON yazmacı üzerinden yapılır. Aşağıda T0CON yazmacı görülüyor. T0CON yazmacı ile Timer0 blok diyagramına biraz konsantre olursanız Timer0 donanımının T0CON denetim yazmacı üzerinden yüklediğiniz değere göre nasıl denetlediğinin mantığını az çok kavrayabilirsiniz.


T0CON: TIMER0 CONTROL REGISTER/TIMER0 DENETİM YAZMACI

TMR0ON

T08BIT

T0CS

T0SE

PSA

T0PS2

T0PS1

T0PS0

Bit 7

Bit 6

Bit 5

Bit4

Bit 3

Bit 2

Bit 1

Bit 0


Bit 7
TMR0ON: Timer0 On/Off Control Bit/Timer0 Aç/Kapa Denetim Biti
1 = Timer0'ı etkinleştirir
0 = Timer0'ı durdurur


Bit 6
T08BIT: Timer0 8-Bit/16-Bit Control Bit/Timer0 8-bit/16-bit Denetim Biti
1 = Timer0 8-bit kipinde çalışır
0 = Timer0 16-bit kipinde çalışır


Bit 5
T0CS: Timer0 Clock Source Select Bit/Timer0 Saat Kaynağı Seçim Biti
1 = Saat kaynağı T0CKI bacağından alınır
0 = Saat kaynağı dahili komut çevrimi sinyalinden gelir (1/Fosc)

Bit4
T0SE: Timer0 Source Edge Select Bit/Timer0 Saat Kaynağı Kenarı Seçim Biti
1 = T0CKI bacağına uygulanan her düşen kenarda artar
0 = T0CKI bacağına uygulanan her yükselen kenarda artar

Bit 3
PSA: Timer0 Prescaler Assignment Bit/Timer0 Önölçekçi Atama Biti
1 = Önölçekçi atanmaz, Timer0 saati önölçekçiden tamponlanarak verilir
0 = Önölçekçi atanır, Timer0 saati önölçekçinin çıkışından verilir

Bit 2-0
T0PS2:T0PS0: Timer0 Prescaler Select bits/Timer0 Önölçekçi Oranı Seçim Bitleri
111 = 1/256 Önölçekleme oranı
110 = 1/128 Önölçekleme oranı
101 = 1/64 Önölçekleme oranı
100 = 1/32 Önölçekleme oranı
011 = 1/16 Önölçekleme oranı
010 = 1/8 Önölçekleme oranı
001 = 1/4 Önölçekleme oranı
000 = 1/2 Önölçekleme oranı

Yazılımda Timer0 aşağıdaki şekilde programlanmıştır:

      • Timer0 8-bit kipinde,

      • Timer0 saat kaynağı dahili osilatörden,

      • Timer0 saat kaynağı düşen kenar,

      • Timer0 önölçekçi atanmış

      • Önölçekleme oranı = 1/256 olacak şekilde programlanmıştır.

Bu düzene göre Timer0 taşma ve yazılım sayaçlarının değerlerini şöyle hesaplanır;

Dahili komut çevirimi frekansı(Fkomut):

Fosc = 1MHz = 1000000Hz

Fkomut = Fosc/4 = 1000000/4 = 250000Hz = 250KHz

Dahili komut çevrimi süresi(Tkomut):

Tkomut = 1/Fkomut = 1/250000 = 0,000004 saniye = 4 mikrosaniye

Timer0 sayma aralığı süresi (T0sas):

T0sas = Tkomut x önölçekçleme oranı
T0sas = 4us x 256 = 1024us

Yani Timer0 her 1024us'de bir TMR0L yazmaç değerini bir artırır.

Timer0 kesme gecikmesi (T0kesme):

T0kesme = T0sas x (256 – Timer0 öndeğer) (burada öndeğer kullanılmıyor = 0)
T0kesme = 1024us x 256 = 262144us = 262,144ms

Yani her 262,144 milisaniyede bir TMR0L yazmacı 256'dan 000'a yuvarlanacak. 256'dan 0'a her yuvarlanışında bir taşma oluşacak ve bu taşma bir Timer0 kesmesi üretecek.

10 saniyelik süre üretmesi için yazılım sayacına yüklenecek desimal değerin hesabı:

10 saniye = 10000 milisaniye

Sayaç10 = 10000ms / 262,144ms

Sayaç10 = 38,14697265625

Küsüratı atarsak; yazılım içinde SAY10 sayaç dosyasına yüklememiz gereken desimal değer = 38


30 saniyelik süre üretmesi için yazılım sayacına yüklenecek desimal değerin hesabı:

30 saniye = 30000 milisaniye

Sayaç30 = 30000ms / 262,144ms

Sayaç30 = 114,44091796875

Biz bunu 115'e yuvarlayalım 30s'den bir kaç ms fazla saysın sorun değil; öyleyse yazılım içinde SAY30 sayaç dosyasına yüklememiz gereken desimal değer = 115

  • Timer0'ı hazırladıktan sonra kesmeleri hazırlayacağız. PIC18 serisi kesmeleri önceliklendirebilecek şekilde üretilmiştir. Yani kesmeler Yüksek Öncelikli ve Düşük Öncelikli olarak yetkilendirilebilir. Ayrıca bu seri 3 adet harici kesme kaynaklarına sahiptir. Burada 2 harici kesme (INT1/AAR1 ve INT2/AAR2) PortB bacakları üzerinden kurulmuş, 1 tane de dahili kesme (Timer0) kullanılmıştır. Burada kesmeler şöyle düzenlenmiştir:

    • Timer0 kesmesi Düşük Öncelik/Low Priority, kesme vektörü: 0x0018,

    • Harici kesmelerin ikisi de Yüksek Öncelik/High Priority, kesme vektörü: 0x0008

Şimdi kesmeleri düzenlerken kullandığımız kesme denetim yazmaçlarını inceleyelim. Burada yalnızca programda kullanacağımız yazmaçların ve denetim bitlerinin açıklamasını vereceğim. Bu yazmaçlarla ilgili daha ayrıntılı bilgiler için ürünün veribetine başvurun.


RCON: RESET CONTROL REGISTER/SIFIRLAMA DENETİM YAZMACI

IPEN

SBOREN

--

RI

TO

PD

POR

BOR

Bit 7

Bit 6

Bit 5

Bit4

Bit 3

Bit 2

Bit 1

Bit 0

Bit 7 IPEN: Interrupt Priority Enable Bit/Kesme Öncelik Etkinleştirme Biti

1 = Kesmelerde öcelik düzeylerini etkinleştir
0 = Kesmelerde öncelik düzeylerini etkisizleştir.

Bu yazmaçtan sadece kesme öceliği özelliğini etkinleştireceğiz. Bunun için yapmamız gereken IPEN bitini 1 yapmaktır.

INTCON: INTERRUPT CONTROL REGISTER/KESME DENETİM YAZMACI

GIE/GIEH

PEIE/GIEL

TMT0IE

INT0IE

RBIE

TMR0IF

INT0IF

RBIF

Bit 7

Bit 6

Bit 5

Bit4

Bit 3

Bit 2

Bit 1

Bit 0

Bit 7 GIE/GIEH: Global Interrupt Enable Bit/Küresel Kesme Etkinleştirme Biti

IPEN = 0 iken(Kesme önceliği etkisizken):
1 = Maskelenmemiş tüm kesmeleri etkinleştirir
0 = Tüm kesmeleri etkisizleştirir

IPEN = 1 iken (Kesme önceliği etkinken):

1 = Tüm yüksek öncelikli kesmeleri etkinleştirir
0 = Tüm yüksek öncelikli kesmeleri etkisizleştirir

Bit 6 PEIE/GIEL: Peripheral Interrupt Enable Bit/Çevresel Kesmeleri Etkinleştirme Biti

IPEN = 0 iken(Kesme önceliği etkisizken):
1 = Maskelenmemiş tüm çevresel kesmeleri etkinleştirir
0 = Tüm çevresel kesmeleri etkisizleştirir

          IPEN = 1 iken (Kesme önceliği etkinken):
          1 = Tüm düşük öncelikli kesmeleri etkinleştirir
          0 = Tüm süşük öncelikli kesmeleri etkisizleştirir

Bit 5 TMR0IE: TMR0 Overflow Interrupt Enable Bit/TMR0 Taşma Kesmesi Etkinleştirme Biti

1 = Timer0 taşma kesmesi etkin
0 = Timer0 taşma kesmesi etkisiz

Bit 2 TMR0IF: Timer0 Overflow Interrupt Flag Bit/Timer0 Taşma Kesmesi Bayrak Biti

1 = Timer0 taşma kesmesi oluştu (bu bayrak yazılımda temizlenmeli)
0 = Timer0 taşma kesmesi oluşmadı

INTCON yazmcaından yüksek ve düşük öncelikli kesmeleri GIEH: Global Interrupt Enable High/Yüksek Öncelikli Kesmeleri Etkinleştirme Biti ve GIEL: Global Interrupt Enable Low/Düşük Öncelikli Kesmeleri Etkinleştirme Bitini kurarak(lojik 1 yaparak) etkinleştirdik. Ardından hatalı kesme oluşmasını önlemek için kesme bayraklarını temizledik. Sonra Timer0 kesmesini de etkinleştirdik.

Kesme yetki önceliği ve Timer0 düzenlemelerinin yapılması için yazmaçların nasıl programlanması gerektiğini gördük. Şimdi yüksek öncelikli kesme yetkisi olan INT1 ve INT2 harici kesmelerinin nasıl kurulacağını görelim. Bununla ilgili kullandığımız yazmaçlar ve açıklamaları şöyle:

INTCON2: INTERRUPT CONTROL REGİSTER 2/KESME DENETİM YAZMACI 2

RBPU

INTEDG0

INTEDG1

INTEDG2

--

TMR0IP

--

RBIP

Bit 7

Bit 6

Bit 5

Bit4

Bit 3

Bit 2

Bit 1

Bit 0

Bit 7 RBPU: PORTB Pull-Up Enable Bit/PORTB (dahili) Pull-up (dirençlerini) Etkinleştirme Biti
        1 = Tüm PORTB Pull-up'ları etkisizleştirilir
        0 = PORTB pull-up'ları bireysel port mandal(latch) değerlerine göre etkinleştirilir


Bit 5
INTEDG1: External Interrupt 1 Edge Select Bit/Harici Kesme 1 Kenar Seçim Biti
        1 = Yükselen kenarda kesme
        0 = Düşen kenarda kesme


Bit 4
INTEDG2: External Interrupt 2 Edge Select Bit/Harici Kesme 2 Kenar Seçim Biti
        1 = Yükselen kenarda kesme
        0 = Düşen kenarda kesme

Bit4
TMR0IP: Timer0 Saat Kaynağı Kenarı Seçim Biti
       1 = T0CKI bacağına uygulanan her düşen kenarda artar
       0 = T0CKI bacağına uygulanan her yükselen kenarda artar

Burada PortB pull-up larını etkisizlesştirdik, Kesme-1 ve Kesme-2 kenarlarını düşen kenar yaptık, Timer0 kesme önceliğini Düşük Öncelik yaptık.

INTCON3: INTERRUPT CONTROL REGİSTER 3/KESME DENETİM YAZMACI 3

INT2IP

INT1IP

--

INT2IE

INT1IE

--

INT2IF

INT1IF

Bit 7

Bit 6

Bit 5

Bit4

Bit 3

Bit 2

Bit 1

Bit 0

Bit 7 INT2IP: INT2 External Interrupt Priority Bit/INT2 Harici Kesme Önceliği Biti
        1 = Yüksek Öncelik
        0 = Düşük Öncelik

Bit 6 INT1IP: INT1 External Interrupt Priority Bit/INT1 Harici Kesme Önceliği Biti
        1 = Yüksek Öncelik
        0 = Düşük Öncelik

Bit 4 INT2IE: INT2 External Interrupt Enable Bit/ INT2 Harici Kesme Etkinleştirme Biti
        1 = INT2 harici kesmesi etkin
        0 = INT2 harici kesmesi etkisiz

Bit 3
INT1IE: INT1 External Interrupt Enable Bit/ INT1 Harici Kesme Etkinleştirme Biti
        1 = INT1 harici kesmesi etkin
        0 = INT1 harici kesmesi etkisiz

Bit 1
INT2IF: INT2 External Interrupt Flag Bit/INT2 Harici Kesme Bayrak Biti
        1 = INT2 harici kesmesi oluştu (yazılımda temizlenmeli)
        0 = INT2 harici kesmesi oluşmadı

Bit 0
INT1IF: INT1External Interrupt Flag Bit/INT1 Harici Kesme Bayrak Biti
        1 = INT2 harici kesmesi oluştu (yazılımda temizlenmeli)
        0 = INT2 harici kesmesi oluşmadı

Burada Kesme-1 ve Kesme-2 Yüksek Öncelikli kesmeler olarak yetkilendirilmiştir. İlk önce Kesme bayrakları temizlenmiştir. Sonra Kesme-1 etkinleştirilmiş, Motor-2 çalışmaya başlamadan hemen önce de Kesme-2 etkinleştirilmiştir.

Yararlanılan Kaynaklar: PIC18F2550 Veribeti

Not: Devre tasarımı ve yazılımı iyi bir pratik ve uygulama olması açısından bizzat kendi örnek proje tasarımımdır. Yanlızca anlatımda kullanılan resimler google aramaları ve ürünlerin veribetlerinden(datasheet) elde edilmiştir. Proje kaynak gösterme koşulu ile paylaşılabilir. Ayrıca farklı proje örnekleri ve sistemler geliştirmek için yazılım tabanı sorunsuzca düzenlenip değiştirilebilir. Arayanların yararına olması dileğiyle...


Yorumlarınız

Hiç yorum yapılmamış, ilk yorumu siz yapabilirsiniz.

Bir yorum ekleyin

İsim:
E-posta:
Yorumunuz:
Güvenlik Kodu:
 
Tüm alanları doldurmak zorunludur. Yorumunuz kontrol edilince yayınlanacaktır. E-posta adresi yayınlanmaz.
Konular