Buton İle Kesme Yardım

Başlatan ersangundogdu, 22 Nisan 2016, 10:24:29

ersangundogdu

Arkadaşlar 12F675 te butona basıldığında led sürekli flaş yapacak, tekrar basıldığında led sürekli yanacak, tekrar basıldığında led sönecek şekilde kesme yaratamadım. Kısa bir kod örneği verebilir misiniz?

Bahri Bilir

Amaç LED i kontrol etmek mi? (basitce imput ile yapılabilir) ,Yoksa kesmeyi kullanabilmek mi?
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ersangundogdu

Aslında kesmeyi öğrenmek istiyorum.

ete

Biraz kafa çalıştırmaya ne dersin?
Bir ledin flash yapabilmesi için programdan bağımsız bir zamanlayıcı çalışması gerekir. Bunu bir kaç şekilde yamak mümkün en kolayı TMR0 veya TMR1 kesmesi kullanarak yapmak.

Ledin sürekli yanması için kesmenin kapatılması yeterli olur. O halde buton buradakilit görev görecek ve kesmeleri açıp kapatma işini toggle olarak yapacak.
Bütün kesme işlemlerini ayarlayıp Yalnızca Global Kesmeleri aktive eden INTCON.7 bitini 1 yapınca flash başlayacak , 0 yapınca duracak şekilde programını organize edebilirsin.

İşlem sırasınıda vereyim biraz uğraş bakalım içinden çıkamazsan tekrar yardım istersin.
TMR0 sayacını 50 ms de bir kesme oluşturacak şekilde ayarla. Bunun için Option_Registerinde bölme oranını 1/256 ayarlaman ve Tmr0 için 60 önyükleme değerini kullanman gerekiyor.
Daha sonra INTCON=%00100000 değerini ver ve ON INTERRUPT GOTO KESME şeklinde komutuda ver.
Her 50 ms de bir kesme olacağına göre flash hızını ayarlamak için 2 kesemde bir (100ms eder) yoksa 3 kesmede bir(150ms eder) flash yaptırablmen için kesmeleri de sayman gerekecek. O halde kesme oluşur oluşmaz SAY=SAY+1  ve
if SAY=SAYI (SAYI burada kaç kesme istediğine bağlı olarak sabit değer olmalı mesela 3 gibi) THEN
SAY=0 şeklinde say değerini yeniden sıfırlayacaksın.
Sonra Toggle LED diyerek Ledin konum değiştirmesini sağlayacaksın.
Sonra TMR0=60 verip RESUME ENABLE ile kesmeden çıkacaksın.

Ana program bölümünde ise,
IF TUS=0 yani tusa basıldığında
TOGGLE INTCON.7
WHILE TUS=0:WEND
IF INTCON.7=0 THEN LED=1 'kesmeyi kaldrımış isen ledin sabit yanmasını sağlamak için bu komutu veriyoruz.
PAuse 50  'aslında bir delay döngüsü koyulsa daha iyi olur ama 50 ms den zarar gelmez sanırım.
Goto basla
Şeklinde işi bitireceksin.
Neredeyse bütün programı verdim hemde mantığınıaçıkladım gerisini yaparsın umarım.

Ete



ersangundogdu

Hocam benim sıkıntım kesme olayı zaten. Kısa bir kod örneği veremez misiniz? Kesme olayını beceremiyorum.

Powered by EzPortal