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ı
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;
-
- 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
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:
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. 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.
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.
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:
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 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ı mı?
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
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.
Bu uygulamanın kodları MIT lisansı altında paylaşılmaktadır.
İndirmeler
Yararlanılan Kaynaklar