avatar_ete

PIC Basic Ders-06 (Kesme (INTERRUPT) Kullanımı)

Başlatan ete, 28 Ağustos 2011, 16:13:09

karabayram

Tamam hocam hata devrede şimdi buldum. Ben sadece rb7 ye 10k lık pull down direnci atıyordum.
RB4-rb5-rb6 yada atınca düzeldi.

enginkanat

programda
         OPTION_REG=%10000000    yada    OPTION_REG.7=1
komutu varmı?

normal şartlarda ETE hocamızın verdiği devre çalışıyordu, ayrıca PULL-UP dirençlerine gerek yok,  sadece butonun bağlı olduğu pin hariç

karabayram

Programda sikinti yok isis ortamindada calisiyor.
Sıkıntı RB-4 le RB-7 butonlarla toprak hattina 10K lik direnc koymamisim.
Evet option-reg dediginiz gibi. İlginize cok tesekkur ederim

ete

O dirençleri kullanmayın. Yerine butonların diğer uçlarını toprağa bağlayın sistem dahili dirençler ile yine çalışır. Zira bu kontrol sistemi PORTB.4-7 arasındaki konum değişikliği ile tetiklenmektedir. Ya LOW dan HIGH olamaya yada HIGH dan LOW olamay doğru sistem tetiklenir.

Ete

karabayram


samadraaa

merhabalar diyelim ki ben 1 dakkika 35sn sonunda bir ledi aktif edip 500ms sonunda söndürücem bunun için yapmam gereken döngü ve ya kesme tarzında ne kullanabilirim

ete

 T1CON=%00110001
TMR1H=$0B:TMR1L=$DC:PIR1.0=0
kodları ile TMR1 sayacını 500ms lik peryot için kurarsınız.
WHILE PIR1.0=0 :wend  komut satırı ile 500 ms nin dolmasını beklersiniz.
PIR1.0,  TMR1 sayacının kesme bayrağıdır. bu bayrak 1 olunce kesme oluştu anlamına gelir.
Her kesme oluştuğunda başka bir sayacı sayarsan ki 35 sn için 70 kesme sayman gerekecek. Böylece 35 sn ye geçmiş olur.
Ledi yakarsın ardından sayacı tekrar çalıştırıp bir kesme sonunda 500ms geçtiği için söndürürsün. Hepsi bu kadar.

Ete

muyat

12f675 ile hazırlanmış Elimizde başla -goto başla satırları arasında dolaşan çok uzun  bir program var diyelim.Ben bu programın neresınde olursak olalım RB0 kesmesının yapıldıgı giriş olan (GPIO.2)ye  bağlı bir butonu sürekli sorgulayıp ona işlem yaptırmam gerekli diyelim.

Peki bu durumda programdaki her satırın sonuna IF GPI0.2=0 then gosub x yazmakla kesme kullanmak arasında bir fark yok o zaman değilmi?X dedigim yer programda kesmenin oldugu bölüm oluyor bu arada?

ete

O buton için kesme kullanırsan sürekli takip etmen gerekmez. Zira butona basılır basılmaz program KESME etiketine atlar. Orada da ne yapacaksan yaparsın. Diyelimki yapacağın şeyi kesme kısmında yapamıyorsun. O zaman bir şaretçi (FLAG) biti kullanırsın. Mesela BASTIM=1 yaparsın kesme içinde.
BASLA ile GOTO BASLA arasında ise IF BASTIM=1 then ile başlayan bir komut dizisi ile butona basılınca ne yapılması gerekiyor ise onu yaptırırsın.
Burada BASTIM=0 yapmayıda unutmazsın.
Ete

Hadrian

Merhabalar,

Bir çalışma yürütüyorum. Şu an hala simülasyon aşamasında. Tabii, bitişe yakın duvara tosladım da diyebilirim. Projem şu şekilde;

Bir fabrika için tasarladım. Şöyle ki; projemde 1 led, 1 display, PIC16F628A, 3 button var. Buttonların bir tanesi arttırma, diğeri başlatma ve bir diğeri de azaltma tuşu. Projenin çalışma prensibi ise; display 1-9 sayacı olup, kullanıcı display'den bir rakam seçip başlat tuşuna basacak. Başlat tuşuna basınca display'de yazan rakam saat cinsine çevrilip, led çevrilen süre boyunca yanacak ve süre sonunda sönecek. Buraya kadar yaptım ve gayet iyi çalışıyor. Ama şöyle bir sorunum var; eğer kullanıcı çalışma anında saati değiştirmek isterse bunu arttırma veya azaltma tuşları ile yapabilir doğal olarak. Ama led işlem görürken, buttonlar işlem görmüyor. Ki bu da PIC'in aynı anda sadece bir işlem yürütmesinden dolayı. Gözlemlediğim kadarıyla bu sorunu çözebilecek tek çıkar yol; Interrupt deyimidir. Lakin bunu nasıl uygulayacağımı bilmiyorum. Yıllar sonra bir kez daha işin içine girdim. Fakat daha önce de aktif olarak interrupt kullanmamıştım. Yaptığınız örnek'de işlemleri sınırlı tutmuşsunuz sanırım. PORTB.0 ve PORTB.4-7 için örnek vermişsiniz. Benim buttonlar ise PORTA uçlarına bağlı. Örneği kendi projeme göre uyarlasam da hatalar aldım. Acaba bana PORTA.1-2-3 pinlerine bağlı buttonların giriş işlevi sırasında nasıl bir kesme işlemi uygulayabileceğimi gösterir misiniz?

Burak

#115
Gösteremeyiz çünkü bu PIC MCU'da bahsettiğin pinler için lojik seviye değişimi durumunda kesme işlevi mevcut değil .. Interrupt yani kesme , özünde donanımsal bir işlevdir , bir buffer'ın lojik seviye değişimi sonucunda programın saymacını reset ederek programın özel bir vektörle özel bir noktasına aniden mecburi olarak dallanmasını zorunlu kılar (İstemsiz) ..  Yani Interrupt'lar çevresel arabirimler dahilinde mümkündür , aksi mümkün değildir ..

Yazılımsal Interrupt nasıl olur ?

Örneğin , eğer PORTA.0=0 ise ALTPRG etiketine git şeklinde olur ki bu da bildiğimiz adıyla yazılımsal dallanmadır kesme değildir program counter değeri o anda gerekli etiketi aramakla meşgul olur yani kesme gibi davranmaz ... Kesme ise programın anlık olarak index saymacını (PC= Program Counter) sıfırlar yada özel bir saymac değerine ilişiklendirir  , kesme derleyici ile kodlanan yazılımlarda bir satırın işlenmesi bitmeden meydana gelmeyen birşey ayrıca... Mesela tüm delay içeren komutlar kesme var mı yokmu dinlemezler , öncelikle o satırın işlenmesini baz alırlar .. Benim sana önerim , RTC yada benzeri birşey kullan , eğer RTC kullanmak istemiyorsan saydırma işlemini TIMER kesmesi kullanarak yaptır ki , buton değişimlerini kontrol etme konusunda hızlı bir kod döngüsü yakala .. Zaten senin projen için sayma işlemi isteğe bağlı bir durumda yapılıp bittiği ve süreklilik arz etmediği için normal bir saat pulse'i gereksinimin yok .. Sitedeki TIMER kullanılarak yazılmış saat ve zamanlayıcı örneklerine bir göz at ..

Burak
Ω Gens Una Sumus Ω

ete

Burak istediğin bilgileri vermiş. Ben bir ilave yada  öneri ekleyeyim.
Timer0 veya Timer1 sayaclarını kurarak kesme yaratabilir bu kesme içinde de mevcut tuşlarını kontrol edebilirsin. Mesela her 50 ms de bir timer kesmesi oluşturup tuşlarına basılmışmı kontrol ettirsen işin görülür gibi geliyor.
Ete

Hadrian

Cevabınız için teşekkür ederim. Gayet mantıklı bir çözüm. Peki söyler misiniz? Bir timer olayı kurup, gereken portları if döngüsü ile kontrol ettirip, belirtilen durum karşısında istediğim olayı nasıl yaptırabilirim? Çünkü benim burada yapmak istediğim; buttona basınca o an ki gerçekleşen olayların durdurulmasıdır. Fakat dediğinizi nasıl uygulayacağım? Timer'da pinleri kontrol ettirip, gerçekleştiği zaman, buttonların o an ki işlemlerini nasıl kalıcı olarak durdurabilirim? Veya çözüm öneriniz var mı?

ete

Kesme mantığını iyi anlamak lazım. Kesme denilen şey programın yaptığı işi bırakıp senin belirlediğin ve adına KESME (yada KES yada her ne isim verirsen) dediğin bir alt programa atlaması demektir.
O halde öce Timer0 kesmesi nasıl aktive edilecek ona bakalım. Bu açıkladıklarım okuduğun o ders notlarında mevcut ama her nedense görmekmi istemiyorsunuz pek anlamıyorum ama yinede izah edeyim ben.
Oncelikle Timer0 kesmesini aktive edelim.
INTCON=%10100000
Burada bit 7 genel anlamda kesmeleri aktif ediyor. Bit-5 ise Timer0 kesmesini açıyor.
Şimdi her 50 ms de bir kesme yaratılması için TMR0 sayacına bir ön yükleme değeri vermek ve bölme oranını ayarlamak gerekecek. TMR0 saycına 60 önyükleme değeri vereceğiz ve onun 60 dan 255'e kadar saymasını sağlayacağız. 256-60=196 sayacak. Bu aslında 196us demektir. (4 mhz işlemci frekansına göre hesap yapıyoruz). bunu 256 defa yaptırırsak yada her 256 defada bir TMR0 sayacını saydırmış olsak 196x256=50.176 us yani yaklaşık 50 ms de bir kesme oluşturabiliriz demektir.
O halde TMR0=60 değerini verip bçlme oranınıda 1/256 alırsak işimiz tamam demek olacaktır.
OPTION_REG=%10000111 değerini vererek bölme oranınıda 1/256 olarak ayarlamış olacağız.
Şimdi kesme oluşturğu zaman programın hangi etikete gideceğini belirleyelim;
ON INTERRUPT GOTO KES satırıda bu işi yapacak.
Şimdi KES isimli alt programda ne yapacağımızı yazalım.
Disable
KES:
       IF TUSBIR=0  THEN' bir nolu tusa basılmış ise
            GIT SU İSİ YAP
       ENDIF
      IF TUSIKI=0 THEN
         ....
      ENDIF
      TMR0=60
      INTCON.2=0  'kesme bayrağını sıfırlıyoruz
      RESUME
      ENABLE

Hepsi bu kadar işte.
Bu dediklerimi programına adapte edersen istediğini yapmış olacaksın.
Bir şeyş hatırlatmam gerek. Tu kontrolünde programı kesme harici bir yere yönlendirme. Ne yapacak isen orada yaptır ve kesmeden çık. Yapamıyor isen bir tane bit değişkenini set edip çık ve ana program bölümünde o bit değişkeni set edilmiş ise programı nereye yönlendireceksen yönlendir.

 

Adem AYDIN

Programın hatalı olan kısmını bu şekilde düzelttim.
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

Powered by EzPortal