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

Genel Bakış

Önsöz ve Amaç

Merhabalar! PIC18 Assembly programlama konusunda biraz Türkçe kaynak kıtlığı olduğunu farkettim. Kaynaklar çok az veya olanlar oldukça basit seviyede. Biraz daha ilerlemek isterseniz artık Türkçe kaynak konusunda yolun sonuna vardığınızı farkedersiniz. Türkçe kaynaklara küçük de olsa katkı sağlamak amacıyla kurgusal bir motor kontrol senaryosu içeren bu yazıyı hazırladım.

Bu uygulamanın amacı mükemmel bir motor kontrol devresi ve yazılımı yapmak değil, tamamen PIC18 Assembly dili ile programlama pratiği yapmaktır. Dolayısıyla bu haliyle profesyonel amaçlara hizmet etmez fakat yine de bir başlangıç noktası olarak kullanılabilir.

Amacımız; birkaç giriş ve birkaç çıkışı kontrol eden bir mikrodenetleyiciyi istediğimiz bir senaryoya göre koşullandırıp çalışmasını sağlamak. Amacımız çok basit olsa da bunu gerçekleştirmek o kadar basit olmayacaktır. Çünkü çalışacağımız mikrodenetleyici olan PIC18F2550 gelişmiş ve biraz daha karmaşık bir yapıya sahip bir yongadır. Buna Assembly programlamanın da zorluğunu eklersek... Neyse biz zorluğa değil çözüme odaklanalım.

Büyük bir sorun çözmesi zor bir sorundur. Büyük bir sorunu olabildiğince küçük parçalara ayırıp öyle ele almak işimizi kolaylaştırır. Nitekim biz de burada böyle yapacağız. Bu yüzden yazımız biraz uzun ama, herbir çözüm aşaması katedişimizde buna değeceğini göreceksiniz.

Bu yazıyı uygulamalı bir şekilde bitirdiğinizde şunları yapabiliyor olacaksınız:

  • 555 Entegresini kararsız kipte istenen frekansta yapılandırma.
  • CD4026 entegresi ile bir sayısal sayaç devresi kurma ve kontrol etme. Hatta kaskat bağlantı yaparak sayı hanelerini artırma.
  • PIC18 mikrodenetleyici modellerini PIC18 Assembly ile programlama.
    • Osilatör yapılandırması.
    • Portların giriş ve çıkış yapılandırmaları.
    • Harici kesmelerin kurulumu ve kullanımı.
    • Yazılımsal gecikmeler yazma.
    • Timer0 yazmacını istenen zaman gecikmesi için yapılandırma.
    • Timer0 kesmesi kullanarak zamanlama.
    • CD4026 gösterge sürücü entegresini kontrol etme.

Devrenin Çalışması

Not

Vidyoyu kaydettikten bu yana yazılım içinde birkaç iyileştirme yaptım. Bu yüzden devre denendiğinde videodaki çalışma şeklinden biraz daha farklı olabilir.

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.

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:

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.

Eğer 1. motor 10sn dolduktan sonra hata verirse ve 2. motor çalışıyorsa 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.

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.

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.

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.

Donanım

Devre Şeması

Mikrodenetleyici Bağlantıları

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 (AARx) gelen iki 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.

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 katot kullanı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.

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

Sıra Pin Yön Açıklama
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 giriş 1. Motorun aşırı akım rölesi kontak bilgisi girişi ve 1. harici kesme ucudur.
6 RB2 giriş 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.

1Hz Saat üreteci şeması
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.

Anımsatma

Donanım ayrıntıları ve hesaplamalarıyla ilgilenmiyorsanız Yazılım bölümüne atlayabilirsiniz.

555 Sinyal Üreteci

555 Entegresi burada kararsız (astable) kipinde çalışmaktadır. 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 ([1x103] + 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

Sayaç devresi 2x7-parçalı (7-segment) LED göstergeleri ve bu göstergeleri süren 2 x CD4026 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ı

7 Parçalı Ortak Katod Gösterge

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:

7 parçalı ortak katod gösterge iç yapısı

Bu yapıya 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.

Yazılım

Yazılımda kullanılan neredeyse tüm yazmaçları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 yapılandırılıp kullanılması açıklanmaktadır.

Timer0'ın Yapılandırılması

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 blok diagramı (8-bit kipinde)

Timer0 ile ilgili düzenlemeler T0CON yazmacı üzerinden yapılır. 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 Yazmacının Yapılandırılması

T0CON (Timer0 Control Register): Timer0 Denetim Yazmacı

TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0
Bit 7 Bit 6 Bit 5 Bit 4 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ğerleri şö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 yazmacının 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 0'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

Aşağı yuvarlarsak; yazılım içinde SAY10 sayaç yazmacı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ç yazmacına yüklememiz gereken desimal değer 115.

İşte Timer0 donanımını ve asıl süreleri sayacak olan değişkenleri hazırladık. Sonraki aşamada kesmeleri hazırlayacağız.

Kesmelerin Yapılandırılması

PIC18 serisi kesmeleri 2 kademe önceliklendirebilecek şekilde tasarlanmıştır. Yani kesmeler Yüksek Öncelikli ve Düşük Öncelikli olarak yetkilendirilebilir. PIC12 ve PIC16 serilerindeki yalnızca bir tane INT kesmesinin aksine; INT0, INT1 ve INT2 olmak üzere toplam üç tane INT kesmesiyle donatılmıştır.

Ş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şvurabilirsiniz. Bu uygulama her ne kadar profesyonel amaçlara hizmet etmese de, senaryoyu olabildiğince gerçeğe yakın tutmaya çalıştığımdan önemli olayları saptamak ve zaman takibi yapmak için kesmelerden yararlanacağız. Bu yüzden motorlarla ilgili hata sinyallerini INT1 ve INT2 harici kesmelerini kullanarak saptayacağız. Motor hatalarını kritik olarak değerlendirdiğimiz için ilgili kesmeleri yüksek öncelikli olarak yapılandıracağız.

Bununla birlikte 10 ve 30 saniyelik zamanların takibini yapmak için Timer0 kesmesinden yararlanacağız. Bu uygulamada zamanlamayı çok kritik olarak değerlendirmediğimiz için ise Timer kesmesi düşük öncelikli olacak.

Bu kesme yapılandırmaları sonrasında INT1 ve INT2 yüksek öncelikli kesmeleri için kesme vektörü 0x8, Timer0 düşük öncelikli kesmesi için kesme vektörü 0x18 olacaktır.

PIC18 mikrodenetleyicilerinin sağladığı öncelikli kesme özelliğinden yararlanmak için RCON yazmacını yapılandırmalıyız. Bu yazmaçtaki IPEN bitini 1 yapmamız gerekir.

RCON Yazmacının Yapılandırılması

RCON (Reset Control Register): Sifirlama Denetim Yazmacı

IPEN SBOREN - RI TO PD POR BOR
Bit 7 Bit 6 Bit 5 Bit 4 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 Yazmacının Yapılandırılması

INTCON (Interrupt Control Register): Kesme Denetim Yazmacı

GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
  • Bit 7 GIE/GIEH: Global Interrupt Enable High priority / Yüksek öncelikli Kesmeleri 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: Global Interrupt Enable Low priority / Düşük öncelikli 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ı

Hatalı kesme oluşmasını önlemek için kesme bayraklarını sıfırlamak doğru bir tercih olur. Ardından INTCON yazmacından, yüksek ve düşük öncelikli kesmeleri GIEH ve GIEL bitlerini kurarak (lojik 1 yaparak) etkinleştirelim. Sonra TMR0IE bitini de kurarak Timer0 kesmesini etkinleştirelim.

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 Yazmacının Yapılandırılması

INTCON2 (Interrupt Control Regi̇ster 2): Kesme Denetim Yazmacı 2

RBPU INTEDG0 INTEDG1 INTEDG2 - TMR0IP - RB0IP
Bit 7 Bit 6 Bit 5 Bit 4 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 6 INTEDG0: External Interrupt 0 Edge Select Bit / Harici Kesme 0 Kenar Seçim Biti

    • 1 = Yükselen kenarda kesme
    • 0 = Düşen kenarda kesme
  • 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
  • Bit 2 TMR0IP: Timer0 Overflow Interrupt Priority / Timer0 Taşma Kesmesi Önceliği

    • 1 = Yüksek öncelik
    • 0 = Düşük öncelik
  • Bit 0 RBIP: RB Port Change Interrupt Priority / RB Port Değişim Kesmesi Önceliği

    • 1 = Yüksek öncelik
    • 0 = Düşük öncelik

Burada dahili PortB pull-up dirençlerini kullanmadığımız için etkisizleştiriyoruz. INTEDG1 ve INTEDG2 bitlerini 0 yaparak INT1 ve INT2 kenarlarını düşen kenar yapıyoruz. Son olarak TMR0IP bitini Timer0 kesme önceliğini Düşük Öncelik yaptık.

INTCON3 Yazmacının Yapılandırılması

INTCON3 (Interrupt Control Regi̇ster 3): Kesme Denetim Yazmacı 3

INT2IP INT1IP - INT2IE INT1IE - INT2IF INT1IF
Bit 7 Bit 6 Bit 5 Bit 4 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 ise INT1 ve INT2 kesmelerini yüksek öncelikli yapmak için INT1IP ve INT2IP bitlerini 1 yapıyoruz. Kesmeleri etkinleştirmeden önce INT1IF ve INT2IF kesme bayraklarını, olası istenmeyen kesmeleri önlemek için sıfırlıyoruz. Sonra sırasıyla INT1IE ve INT2IE bitlerini 1 yaparak bu iki kesmeyi etkinleştiriyoruz.

Assembly Kodu

  1; Copyright (c) 2017 Kozmotronik (İsmail Sahillioğlu)
  2; 
  3; Permission is hereby granted, free of charge, to any person obtaining a copy 
  4; of this software and associated documentation files (the "Software"), to deal 
  5; in the Software without restriction, including without limitation the rights 
  6; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
  7; copies of the Software, and to permit persons to whom the Software is 
  8; furnished to do so, subject to the following conditions:
  9; 
 10; The above copyright notice and this permission notice shall be included in 
 11; all copies or substantial portions of the Software.
 12;
 13; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
 14; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
 15; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
 16; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
 17; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
 18; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
 19; SOFTWARE.
 20
 21;*********1_BASLAT_1_DUR_TUSUYLA_2_MOTORUN_KOSULLU_DENETIMI**********
 22	
 23		LIST	    P=18F2550
 24		#include    "p18F2550.inc"
 25		
 26;********************DUZENLEME_BITLERI***********************
 27		
 28; CONFIG1L
 29  CONFIG  PLLDIV = 1            ; PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
 30  CONFIG  CPUDIV = OSC1_PLL2    ; System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
 31  CONFIG  USBDIV = 1            ; USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)
 32
 33; CONFIG1H
 34  CONFIG  FOSC = INTOSC_XT      ; Oscillator Selection bits (Internal oscillator, XT used by USB (INTXT))
 35  CONFIG  FCMEN = OFF           ; Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
 36  CONFIG  IESO = OFF            ; Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
 37
 38; CONFIG2L
 39  CONFIG  PWRT = ON             ; Power-up Timer Enable bit (PWRT enabled)
 40  CONFIG  BOR = ON              ; Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
 41  CONFIG  BORV = 3              ; Brown-out Reset Voltage bits (Minimum setting 2.05V)
 42  CONFIG  VREGEN = OFF          ; USB Voltage Regulator Enable bit (USB voltage regulator disabled)
 43
 44; CONFIG2H
 45  CONFIG  WDT = OFF             ; Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
 46  CONFIG  WDTPS = 32768         ; Watchdog Timer Postscale Select bits (1:32768)
 47
 48; CONFIG3H
 49  CONFIG  CCP2MX = ON           ; CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
 50  CONFIG  PBADEN = OFF          ; PORTB A/D Enable bit (PORTB<4:0> uclari sifirlama (reset) sonrasında dijital giris-cikis olacak sekilde duzenlendi)
 51  CONFIG  LPT1OSC = OFF         ; Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
 52  CONFIG  MCLRE = ON            ; MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
 53
 54; CONFIG4L
 55  CONFIG  STVREN = ON           ; Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
 56  CONFIG  LVP = OFF              ; Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
 57  CONFIG  XINST = OFF           ; Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
 58
 59; CONFIG5L
 60  CONFIG  CP0 = OFF             ; Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
 61  CONFIG  CP1 = OFF             ; Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
 62  CONFIG  CP2 = OFF             ; Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
 63  CONFIG  CP3 = OFF             ; Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)
 64
 65; CONFIG5H
 66  CONFIG  CPB = OFF             ; Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
 67  CONFIG  CPD = OFF             ; Data EEPROM Code Protection bit (Data EEPROM is not code-protected)
 68
 69; CONFIG6L
 70  CONFIG  WRT0 = OFF            ; Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
 71  CONFIG  WRT1 = OFF            ; Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
 72  CONFIG  WRT2 = OFF            ; Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
 73  CONFIG  WRT3 = OFF            ; Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)
 74
 75; CONFIG6H
 76  CONFIG  WRTC = OFF            ; Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
 77  CONFIG  WRTB = OFF            ; Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
 78  CONFIG  WRTD = OFF            ; Data EEPROM Write Protection bit (Data EEPROM is not write-protected)
 79
 80; CONFIG7L
 81  CONFIG  EBTR0 = OFF           ; Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
 82  CONFIG  EBTR1 = OFF           ; Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
 83  CONFIG  EBTR2 = OFF           ; Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
 84  CONFIG  EBTR3 = OFF           ; Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)
 85
 86; CONFIG7H
 87  CONFIG  EBTRB = OFF           ; Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)
 88		
 89
 90  
 91;**********-------TANIMLAMA_VE_ATAMALAR--------**************
 92     		
 93WREG_GC	    EQU	0X00	    ;Kesmelerde eger gerekirse WREG ve STATUS yazmaclarinin yedeklenmesi
 94STAT_GC	    EQU	0X01	    ;icin dosyalar.
 95SUREV_BYRK  EQU	0X02	    ;Surelerin doldugunu gosteren bayraklari tutan dosya.
 96ON	EQU 1		;10 saniye bayrak biti.
 97OTUZ	EQU 2		;30 saniye bayrak biti.
 98DON0	    EQU	0X03	    ;ARK gecikmesi icin tutma dosyasi.
 99DON1	    EQU	0X04	    ;ARK gecikmesi icin tutma dosyasi.
100SAY10	    EQU	0X05	    ;10 saniye icin yazilim sayaci dosyasi.
101SAY30	    EQU	0X06	    ;30 saniye icin yazilim sayaci dosyasi.
102AAR_SR_SIFIRLA	EQU 0X07    ;Motorlarin gereken calisma surelerini doldurmadan hata vermeleri durumunda 
103AAR1_SR	EQU 1		    ;kurulcak bayraklari tutacak dosya.
104AAR2_SR	EQU 2
105	    
106;Her bir Portun giris cikis islevine ozel, program icinde kullanmak ve  
107;giris-cikislari daha kolay anımsayabilmek icin bir ad veriliyor.
108	
109#DEFINE	    M1HONAY PORTA,1	;Motor-1 Hata (Duzeltildi) butonu girisi.
110#DEFINE	    M2HONAY PORTA,2	;Motor-2 Hata (Duzeltildi) butonu girisi.
111#DEFINE	    DEI	    PORTA,3	;Sayac gosterge etkinlestirme (Display Enable In) denetim cikisi.
112#DEFINE	    INH	    PORTA,5	;Sayac saat darbelerini engelleme (Clock Inhibit) denetim cikisi.
113#DEFINE	    AAR1KES PORTB,1	;Yuksek oncelikli Asiri Akim Rolesi-1 harici kesme giris ucu.
114#DEFINE	    AAR2KES PORTB,2	;Yuksek oncelikli Asiri Akim Rolesi-2 harici kesme giris ucu.
115#DEFINE	    B	    PORTB,3	;Baslatma butonu giris ucu.
116#DEFINE	    DUR	    PORTB,4	;Durdurma butonu giris ucu.
117#DEFINE	    RST	    PORTC,0	;Sayac sifirlama (reset) denetim cikisi.
118#DEFINE	    M1HATA  PORTC,1	;Motor-1 Hata gosterge cikisi (LED).
119#DEFINE	    M2HATA  PORTC,2	;Motor-2 Hata gosterge cikisi (LED).
120#DEFINE	    M1	    PORTC,6	;Motor-1 surme cikis ucu.
121#DEFINE	    M2	    PORTC,7	;Motor-2 surme cikis ucu.
122	    
123	    
124	    
125;------------------------------------------------------------
126
127	    ORG    0x0000	;Baslangic adresine yonel
128	    BRA    GIRIS
129	    
130	    ORG    0x0008	;Yuksek oncelikli Hata kesme program adresine yonel
131	    BRA    DENET 
132	    
133	    ORG    0x0018	;Dusuk oncelikli Timer0 kesme program adresine yonel
134	    BRA    SUREV
135	    
136;-------------------------------------------------------------
137
138;*********************ANA_PROGRAM*****************************
139	    
140GIRIS
141	    CLRF	PORTC	    ;Tum PORTlari temizle/sifirla
142	    CLRF	PORTB	    ;	
143	    CLRF	PORTA	    ;
144	    CLRF	SUREV_BYRK  ;Sure durum bayraklarini tutan dosyayi temizle.
145	    CLRF	AAR_SR_SIFIRLA	;Motorlarda hata oldugunda sure sifirlama bayraklarini tutan dosyayi temizle. 
146	    CLRF	INTCON	    ;Baslangicta veya herhangi bir RESET durumunda
147	    CLRF	INTCON2	    ;istenmeyen kesmelerin olusmamasi icin
148	    CLRF	INTCON3	    ;INTCONx ve T0CON yazmaclarini temizle.
149	    CLRF	T0CON	    ;Timer0 Denetim yazmacini ve ayarlarini temizle.
150	    CLRF	UCON		;RC4 ve RC5 bacaklarini I/O olarak sorunsuz
151	    BSF		UCFG, UTRDIS	;kullanabilmek icin gerekli islem (istege bagli).
152	    CLRF	PIE1	    ;RESET sonrası hatali kesmelere gitmemesi icin
153	    CLRF	PIE2	    ;yapilması gerekli işlem.
154	    MOVLW	0X0E
155	    MOVWF	ADCON1	    ;Analog girisler etkisiz; PORTA-B dijital giris-cikis.
156	    MOVLW	0X80
157	    MOVWF       RCON	    ;Kesme onceligi etkin IPEN=1 (Interrupt Priority Enable).
158	    MOVLW	0X4F	    ;Sistem Saati Kaynagi: Dahili 8MHz Osilator (SCS<1:0> = 11)	
159	    MOVWF	OSCCON	    ;Dahili osilator hizi=1MHz (IRCF<2:0> = 100)
160	    ;Ben fazla osilator hizi gerekmedigi icin 1MHz olarak belirledim. Bu hiz duzenegin tutarli 
161	    ;islemesi icin oldukca yeterlidir. Buna gore CPU saati Fosc/4 oldugundan; 250KHz olacaktir.
162	    ;Yani bir komutu isleme (execute) suresi T=1/F, T=1/250000, T = 4us (mikrosaniye) olur.
163	    ;Ayrintili osilator ayarlari icin urunun veribetinin (datasheet) 52. sayfasina bakiniz.
164	    MOVLW	0X00
165	    MOVWF	TRISC	    ;C portu tumden cikis.
166	    MOVLW	0XFF
167	    MOVWF	TRISB	    ;B portu tumden giris.
168	    MOVLW	0XD7	
169	    MOVWF	TRISA	    ;PORTA 5 ve 3 = cikis, 2 ve 1 = giris
170	    BCF		DEI	    ;Gostergeyi etkisizlestir.
171	    BCF		INH	    ;Saat darbelerini askiya al.
172	    BSF		RST	    ;Sayaci RESET/Sifirlama durumunda tut.
173;	    
174	    MOVLW	0XE0	    ;Kuresel Kesmeler (GIEL), Cevresel Kesmeler (PEIE)
175	    MOVWF	INTCON	    ;ve Timer0 Kesmesi (TMR0IE) etkin
176;	    
177	    MOVLW	0XC0	    ;PortB Pull-up direncleri etkisiz, AAR kesmeleri (INTEDG1, INTEDG2) 
178	    MOVWF	INTCON2	    ;dusen kenar tetikemeli, Timer0 kesme onceligi (TMR0IP): dusuk.
179;	    
180	    MOVLW	0XC8	    ;AAR kesmeleri onceligi (INT2IP, INT1IP): yuksek. AAR1 kesmesi (INT1IE)etkin.
181	    MOVWF	INTCON3	    
182;	    
183	    MOVLW	0X57	    ;PIC18F2550'de Timer0 ya 8-bit ya da 16-bitlik sayici/zamanlayici olarak kullanılabilir.
184	    MOVWF	T0CON	    ;Burada 8-bitlik kipte (modda) kullanilmistir (T08BIT=1). Timer0 saat kaynagi (T0SE): Dahili saat kaynagi
185				    ;Ayrica bu aygitta Onolcekci (Prescaler) yalnizca Timer0 icin kullanilmaktadir.
186				    ;Onolcekci (prescaler) oranı: 1/256 (T0PS<2:0> = 111)
187				    
188	    MOVLW	.38	    
189	    MOVWF	SAY10	    ;10 saniye icin yazilim sayaci dosyasi; desimal 38 ile onyukle.
190	    MOVLW	.115
191	    MOVWF	SAY30	    ;30 saniye icin yazilim sayaci dosyasi; desimal 115 ile onyukle.
192	    
193;		ANA PROGRAM BASLANGICI
194	    
195BASLAT		;0X00
196	    BTFSS   B		;Baslat butonu basılı ?
197	    GOTO    BASLAT	;Hayir, oyleyse bailana dek denetlemeyi surdur (BASLAT'a git)
198	    CALL    ARK		;Evet, oyleyse buton arkini onlemek icin yaklasik 50ms bekle
199	    BSF	    M1		;Motor-1'i calistir.
200	    NOP			;Islem yok
201	    BSF	    DEI		;Sayac gostergesini etkinlestir.
202	    NOP			;Islem yok.
203	    BCF	    RST		;Sayaci (CD4026x2) etkinlestir.
204	    NOP			;Islem yok.
205	    BSF	    T0CON, TMR0ON	;Timer0'i etkinlestir.
206	    
207BASLAT2
208	    BTFSS   SUREV_BYRK, ON	    ;10 saniyenin dolmasini bekle
209	    GOTO    BASLAT2		    ;10 saniye dolana kadar dongude kal.
210	    BCF	    DEI			    ;Gostergeyi kapat.
211	    NOP
212	    BSF	    RST			    ;Sayicilari sifirla
213	    CLRF    AAR_SR_SIFIRLA	    ;AAR kesmesinin AAR sure sifirlama bayraklarını temizle
214	    BSF	    INTCON3, INT2IE	    ;M2 calismadan once AAR2 (koruma/hata) kesmesini etkinlestir
215	    BSF	    M2			    ;M2 yi calistir.
216	    CALL    ARK			    ;50ms gecik.
217	    BSF	    DEI			    ;Gostergeyi yeniden ac.	
218	    NOP
219	    BCF	    RST			    ;Sayicilari sifirlama durumundan cikar.
220	    
221M2_BEKLE
222	    BTFSS   SUREV_BYRK, OTUZ	    ;30 saniyenin dolmasini bekle
223	    GOTO    M2_BEKLE		    ;30 saniye dolana dek dongude kal.
224	    BCF	    DEI			    ;Gstergeleri kapat
225	    CALL    ARK			    ;Gecikme
226	    BSF	    RST			    ;Sayma islemleri bitti, Sayicilari sifirla
227	    NOP
228DURM2	    BTFSC   DUR			;Durdurma butonu basili mi?
229	    GOTO    DURM2		;Hayir, oyleyse basilana kadar durumu koru ve dongude kal.
230	    CALL    ARK			;Evet, buton arkini onlemek ici gecikme alt progamini cagir.
231	    BCF	    INTCON3, INT2IE	;AAR2 kesmesini etkisizlestir.
232	    BTFSC   INTCON3, INT2IE	;AAR2 kesmesinin etkisiz oldugundan emin ol
233	    BRA	    $-2			;Hala etkisiz degilse etkisizlestirmek icin 2 adim geriye git.
234	    BCF	    M2		    ;Etkisizlestirildiyse once Motor2'yi durdur.
235	    CALL    ARK	    
236	    CALL    ARK		    
237	    CALL    ARK		    ;Yaklasik 150ms bekle
238DURTUM	    
239	    BTFSC   DUR		;Durdurma butonu yeniden basili mi?
240	    GOTO    DURTUM	;Hayir, oyleyse basilana kadar dongude kal.
241	    CALL    ARK		;Evet, ark gecikmesi.
242	    RESET	    ;Tum duzenegi sifirla (resetle).
243	    
244;		YAKLASIK 50ms'LIK GECIKME ALT PROGRAMI
245	    
246ARK	
247	MOVLW	.65
248	MOVWF	DON0
249ARK1	MOVLW	.255
250	MOVWF	DON1
251ARK2	DECFSZ	DON1, 1
252	GOTO	ARK2
253	DECFSZ	DON0, 1
254	GOTO	ARK1
255      	RETURN
256	
257;**********************ASIRI_AKIM/YUK/HATA_KESME_SERVIS_RUTINI****************************
258	
259DENET		;Kesme kayanagini belirle
260	    CLRF    INTCON		;Kesmeleri etkisizlestir
261	    BCF	    T0CON, TMR0ON	;Timer0 i kapat
262	    BCF	    DEI			;Gostergeyi kapat
263	    NOP				
264	    BSF	    INH			;Sayicinin saat darbelerini engelle.
265	    BTFSC   INTCON3, INT1IF	;AAR1 kesmesi mi?
266	    GOTO    AAR1		;Evet, AAR1 kesme servisine git
267	    BTFSC   INTCON3, INT2IF	;Hayir, AAR2 kesmesi mi?
268	    GOTO    AAR2		;Evet, AAR2 kesme servisine git
269	    BRA	    AAR_SON		;Hayir, ikisinden hiç biri dgilse kesmeyi sonlama servisine git
270	
271;	    ASIRI AKIM/YUK/HATA-1 KESME ALT PROGRAMI
272	    
273AAR1
274	    BCF	    M1			;M1 i durdur
275AAR1_1
276	    BTG	    M1HATA		;M1 icin hata gostergesinden sinyal ver
277	    CALL    ARK		    ;Gecikme
278	    BTFSS   M1HONAY		;Hata duzeltme onaylandi mi?
279	    GOTO    AAR1_1		;Hayir, hata sinyali vermeyi surdur (AAR1_1'e geri don)
280	    BTFSS   AAR1KES		;Evet, hata duzeltildi mi?
281	    GOTO    AAR1_1		;Hayir, hata sinyali vermeyi surdur (AAR1_1'e geri don)
282	    BTFSS   SUREV_BYRK, ON	    ;Evet, 1. Motor 10s calisti mi?
283	    CALL    AAR1_SR_SIFIRLA	    ;Hayir, oyleyse yeniden 10 sn saymak icin alt programi cagir.
284	    BTFSS   AAR_SR_SIFIRLA, AAR1_SR	    ;Evet, 1. Motor 10s calismadan durdu mu?
285	    CALL    M2BEKLE_KUR		    ;Hayir, o zaman yeniden 30sn calismasi icin alt prgrmi cagir.
286	    BTFSS   AAR_SR_SIFIRLA, AAR1_SR	;Evetse, 1. motor yeniden kurudu mu?
287	    BSF	    M1			    ;Evetse, bu komutu atla cunku zaten 1. motor BASLAT2_KUR alt programında devreye alınacak.
288					    ;Hayirsa, bu komutu isle ve 1. Motoru calistir.
289	    BCF	    M1HATA		    ;M1 Hata gostergesini kapat 
290	    BRA	    AAR_SON		    ;Kesme sonlama servisine git
291	    
292	    ;	    ASIRI AKIM/YUK/HATA-2 KESME ALT PROGRAMI
293AAR2
294	    BCF	    M2	    ;Motor-2 yi durdur.
295AAR2_1
296	    BTG	    M2HATA	;M2 icin hata sinyali ver
297	    CALL    ARK	    ;Gecikme
298	    BTFSS   M2HONAY	;Hata duzeltme onaylandi mi?
299	    GOTO    AAR2_1	;Hayirsa, hata sinyali dongusunde kal.
300	    BTFSS   AAR2KES	;Evetse, Hata duzeltildi mi?
301	    GOTO    AAR2_1	;Hayirsa, hata sinyali dongusunde kal.
302	    BTFSS   SUREV_BYRK, OTUZ	    ;Evetse, 2. motor 30s calisti mi?
303	    CALL    AAR2_SR_SIFIRLA	    ;Hayirsa, 2. motoru yeniden 30s calistirma alt prg cagir.
304	    BTFSS   AAR_SR_SIFIRLA, AAR2_SR	;Evetse, 2. motor yeniden calistirilmis mi?
305	    BSF	    M2			    ;Hayirsa 2. motoru calistir. Evetse burayı atla.
306	    BCF	    M2HATA		;Evetse, Hata sinyali vermeyi durdur.
307	    
308;	    ASIRI AKIM/YUK/HATA KESME SERVIS RUTINI SONLAMA ALT PROGRAMI
309	    
310AAR_SON		;Kesme surec ve islemlerinin sonlandirildigi kesme alt program yigini
311	    BCF	    RST		;Sayaclari sifirlama durumundan cikar.
312	    BCF	    INTCON3, INT1IF	;AAR1 kesme bayragini temizle. 
313	    BCF	    INTCON3, INT2IF	;AAR2 kesme bayragini temizle.
314;Kesme bayraklarini temizleme isi cok onemli. Eger kesmeden cikmadan temizlenmezse hatali kesmeler
315;olusabilir. O yuzden bu bayraklarin temizlendiginden emin olduktan sonra kesmeden cikacagiz.
316	    BTFSC   INTCON3, INT1IF	;AAR1 kesme bayraginin temizlendiginden emin ol.
317	    BRA	    AAR_SON	    ;Temizlenmemisse temizleme islemini yeniden yapmak icin AAR_SON a geri git.
318	    BTFSC   INTCON3, INT2IF	;AAR2 kesme bayraginin temizlendiginden emin ol.
319	    BRA	    AAR_SON	    ;Temizlenmemisse temizleme islemini yeniden yapmak icin AAR_SON a geri git.
320	    MOVLW   0XE0	   ;Bayraklarin temizlendiginden emin olduktan sonra buradan devam et.
321	    MOVWF   INTCON	;INTCON kesme denetim yazmacina yeniden normal degerleri yukle.
322	    BTFSC   AAR_SR_SIFIRLA, AAR1_SR	;10s dolmadan 1. motorda hata oldu mu?
323	    BRA	    BASLAT2_KUR			;Evetse 1. motoru yeniden kurmak icin BASLAT2_KUR alt  prg dallan.
324	    BTFSC   AAR_SR_SIFIRLA, AAR2_SR	;Hayirsa, 2. motorda 30s dolmadan hata oldu mu?
325	    BRA	    BASLAT2_KUR			;Hata olduysa (evetse), 1. ve 2. motoru yeniden kurmak icin BASLAT2_KUR alt  prg dallan.
326	    BTFSS   SUREV_BYRK, OTUZ	    ;Hayirsa, 30 saniye bayragi = 1 mi?
327	    BSF	    T0CON, TMR0ON	    ;30s bayragi = 1 Degilse, Timer0 i yeniden saymasi icin etkinlestir.
328	    BTFSS   SUREV_BYRK, OTUZ	    ;30s bayragi = 1 ise Timer0 i etkinlestirmeyi atla ve bu bayragi yeniden denetle.
329	    BSF	    DEI		;Bayrak 1 ise, sayma islemi bitti, o yuzden Sayac gostergesini etkinlestirmeyi atla. 
330				;Bayrak 0 ise sayma islemi suruyor, bu yuzden gostergeyi etkinlestir.
331	    BCF	    INH		;Sayac saat darbesini askiya almayi durdur.
332	    RETFIE	 ;Kesmeden cik.
333	    
334AAR1_SR_SIFIRLA		;1. Motor gereken sure (10saniye) doluncaya dek calismadiysa buradaki komutlar islenir.
335	    BTFSS   AAR_SR_SIFIRLA, AAR2_SR	;2. Motor erken durdu bayragi kurulmussa, bir alttaki komutu atla.
336	    BSF	    AAR_SR_SIFIRLA, AAR1_SR	;1. Motor 10s calisamadan durdu, erken durma bayragini kur.
337	    BTFSC   M2		    ;2. Motor calisiyor mu?
338	    CALL    M2BEKLE_KUR	    ;Evetse 1. motor sureden bagimsiz yeniden calistirilabilir cunku 2. motor zaten devrede.
339				    ;Bu yuzden her seyi normale donderip 2. motorun en az 30s calismasını beklemek icin M2BEKLE_KUR alt prg cagir.
340	    BSF	    RST		;2. Motor calismiyorsa, sayicilari yeniden sayma icin sifirla,
341	    CLRF    TMR0L	;1. Motoru yeniden 10s calistirmak icin Timer0 i sifirla.
342	    MOVLW   .38		;Yeniden 10s saymak icin,
343	    MOVWF   SAY10	;SAY10 dosyasina ondegerini yeniden yukle.
344	    RETURN	    ;Cagirildigin yere geri don.
345
346AAR2_SR_SIFIRLA		;2. Motor gereken sure (30saniye) doluncaya dek calismadiysa buradaki komutlar islenir.
347	    BSF	    AAR_SR_SIFIRLA, AAR2_SR	;2. Motor 30s calismadan durdu, erken durma bayragini kur.	
348	    CLRF    SUREV_BYRK			;10s ve 30s bayraklarini temizle (cunku sayma yeniden baslayacak)
349	    BCF	    M1			;1. Motoru durdur, cunku 2. Motorun yeniden calisabilmesi icin 1. Motor yeniden 10s calismali.
350	    CALL    AAR1_SR_SIFIRLA	;Simdi 1. motoru yeniden kurmak icin AAR_SR_SIFIRLA alt prg cagir.
351	    MOVLW   .115	;Yeniden 30 s saymak icin,
352	    MOVWF   SAY30	;SAY30 dosyasina ondegerini yeniden yukle.
353	    RETURN	    ;Cagirildigin yere geri don.
354	    
355BASLAT2_KUR		;Motorlarin herhangi birinde basladiktan sonra ve sureleri dolmadan once hata olursa buradaki komutlar islenir.
356	    BSF	    M1		;1. Motoru yeniden caistir.
357	    BCF	    INH		;Sayicilarin saat darbesini engellemeyi kaldir.
358	    BSF	    DEI		;Sayici gostergelerini etkinlestir.
359	    BSF	    T0CON, TMR0ON	;Timer0 i yeniden etkinleştir.
360	    BCF	    RST		;Sayicilari sifirlama durumundan cikar
361	    BRA	    BASLAT2	;BASLAT2 etiketine dallan.
362	    
363M2BEKLE_KUR		;Eger 1.motor 10s calistiktan sonra hata vermis ve 2. motor calismaya baslamissa buradaki komutlar islenir.
364	    BCF	    INTCON3, INT1IF	;AAR1 kesme bayragini temizle
365	    BCF	    INTCON3, INT2IF	;AAR2 kesme bayragini temizle
366	    BTFSC   INTCON3, INT1IF	;
367	    BRA	    M2BEKLE_KUR
368	    BTFSC   INTCON3, INT2IF	;
369	    BRA	    M2BEKLE_KUR		;Bayraklarin temizlendiginden emin olana kadar dongude kal.
370	    MOVLW   0XE0
371	    MOVWF   INTCON		;INTCON kesme denetim yazmacini yeniden normal degerleriyle yukle.
372	    BTFSS   SUREV_BYRK, OTUZ	;2. Motor 30s calisti mi?
373	    CALL    SAYAC_KUR		;Evetse, burayı atla, hayırsa sayaci yeniden kurmak icin alt prgm cagir.
374	    BRA	    M2_BEKLE	    ;M2_BEKLE etiketine dallan.
375SAYAC_KUR
376	    BSF	    T0CON, TMR0ON	;Timer0 i yeniden etkinlestir.
377	    BSF	    DEI		    ;Gostergeleri yeniden etkinlestir.	
378	    BCF	    INH		    ;Saat darbesini engellemeyi kaldir.
379	    BCF	    M1HATA	    ;1. Motor hata gostergesini temizle.
380	    BSF	    M1		    ;1. Motoru calistir.
381	    RETURN
382	    
383
384;***********************ZAMANLAMA_KESME_SERVIS_RUTINI***************************
385	    
386SUREV			;Kac saniye sayilacaginin belirlendigi bolum.
387	    BCF	    INTCON, TMR0IE	;Timer0 kesmesini etkisizlestir.
388	    BTFSC   M2		    ;2. Motor calismiyorsa,
389	    GOTO    SUREV2	    ;Bu komutu atla.
390	    DECFSZ  SAY10,F	    ;10s icin yazilim sayacını 1 eksilt ve dosyaya sakla.
391	    GOTO    BITTI	    ;SAY10 = 0 ise bu komutu atla. Degilse kesmeden cikmak icin BITTI etiketine git.
392	    BSF	    SUREV_BYRK, ON	;SAY10 = 0 ise 10s doldu, 10s bayragini kur.
393	    
394SUREV2			;30s sayim isleminin yapildigi bolum.
395	    DECFSZ  SAY30,F	    ;30s icin yazilim sayacını 1 eksilt ve dosyaya sakla.
396	    GOTO    BITTI	    ;SAY30 = 0 ise bu komutu atla. Degilse kesmeden cikmak icin BITTI etiketine git.
397	    BSF	    SUREV_BYRK, OTUZ	;SAY30 = 0 ise 30s doldu, 30s bayragini kur.
398	    
399BITTI			;Timer0 kesmesinden cikis yapilan bolum. 
400	    BCF	    INTCON, TMR0IF	;Timer0 kesme bayragini temizle.
401	    BSF	    INTCON, TMR0IE	;Timer0 kesmesini yeniden kur
402	    RETFIE 		    ;Timer0 kesmesinden cik.
403
404BITIR
405	    GOTO BITIR		    ;Program sonu
406	    END
Not

Devre tasarımı ve yazılımı iyi bir pratik ve uygulama olması açısından bizzat bana aittir. Yanlızca anlatımda kullanılan resimler google aramaları ve ürünlerin veribetlerinden (datasheet) elde edilmiştir.

Lisans

Bu uygulamanın kodları MIT lisansı altında paylaşılmaktadır.

İndirmeler

Yararlanılan Kaynaklar

comments powered by Disqus