Buton interrupt

Başlatan onurinci, 14 Eylül 2015, 00:55:09

onurinci

Hocam saygılar,
bir butonumuz var bu 12F675 ile kurulu ve pil ile çalışıyor,işlev yerine getirildikten sonra uyuyor.

20 ms Low 10 ms High 20 ms Low gibi bir dizi pulse üretiyor.

İsiste simule ettim scoptaki izlenimlerim aslına uygun gibi,

sorunum ise butona bastım Pulse'leri yolladı ve bitti ,butondan elimi kaldırdığımda aynı diziyi bir kez daha yolluyor,bu da istenmeyen bir durum oluşuyor,neden böyle bir yol izlediniz derseniz,bu bir alıcıda kullanılıyor,internal osilatörü alıcı enterferans olarak duyuyor,interrup ile yapınca dizi bitice osilatörde susuyor.bizede bu gerekli.bu iki defa yollamada yardımınızı rica ediyorum.

simulasyon ve yazılım ektedir.

@ Device PIC12F675,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT
DEFINE OSC 4
DEFINE OSCCAL_1K 1


TRISIO= 010000 : GPIO= 0 
CMCON= 7 :  ANSEL= 0 : VRCON= 0
INTCON= 8        'Enables port change interrupt ie GPIE
IOCB= 16          'sets GPIO.4 for Interrupt on change [IOC=16]
OPTION_REG.7= 0 : WPU= 010000

wakeup VAR GPIO.4 'input, interrupt on change.
LED    VAR GPIO.0 : LED= 1  'LED output   0
X      VAR BYTE



Start:

INTCON.0= 0
      PAUSE 100
@ SLEEP
      PAUSE 100

    LED= 0 : PAUSE 20
    LED= 1 : PAUSE 10
    LED= 0 : PAUSE 20
    LED= 1
   

      GOTO Start
End

onurinci


ete

Değişiklik kesmesi port pinlerinde bir değişiklik olduğu zaman gerçekleşen bir kesme türüdür.
Butona basılmadan okunan port bilgisi bir bilgidir. Butona basılmış olması ise bir değişikliktir.
Butona basılmış iken port bilgisi alınır ve buton bırakılırsa buda bir değişikliktir. Dolayısıyla sistem her iki konumda da kesme oluşturmaktadır.
Yapılması gereken kesmenin yalnızca butona basıldığı anda aktif olmasını sağlamak bırakılma anında kesme kapatılmalıdır.

Programda registerlere binary bilgi vermeye çalışmışsın ama başlarına binary işareti olan "%" koymamışsın. Bu durumda o sayı desimal kabul edilir. Aşağıda düzeltilmiş programı veriyorum. İstediğin gibi çalışıyor.

Dikkat edersen butona basılınca kesme oluşacak şekilde ayarlanıyor sistem. Kesme oluşunca ilk iş değişiklik kesmesini kapatmak oluyor. Ardından butonun bırakılıp bırakılmadığı da kontrol edilerek bırakılmış ise program işine devam ediyor değilse orada bekliyor. Çözüm budur.

Ete

;@ Device PIC12F675,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF
DEFINE OSC 4
DEFINE OSCCAL_1K 1


TRISIO=%00010000 : GPIO= 0 
CMCON= 7 :  ANSEL= 0 : VRCON= 0
INTCON=%00001000        'Enables port change interrupt ie GPIE
IOCB=%00010000        'sets GPIO.4 for Interrupt on change [IOC=16]
OPTION_REG.7= 0 : WPU=%00010000

wakeup VAR GPIO.4 'input, interrupt on change.
LED    VAR GPIO.0 : LED= 1  'LED output   0
X      VAR BYTE

PAUSE 200


Start:
      INTCON=%00001000
      X=GPIO
      PAUSE 100
@ SLEEP
      INTCON=0     
      PAUSE 50
      LED= 0 : PAUSE 20
      LED= 1 : PAUSE 10
      LED= 0 : PAUSE 20
      LED= 1
      WHILE GPIO.4=0:WEND
      PAUSE 50   
      GOTO Start
End

onurinci

Hocam sağolun,sayenizde hatalarımızı düzeltme şansı buluyoruz,esenkalın.

Hattuşa

slm arkadaşlar;
şimdi 12f675 ile bir melodi çalar var, melodiler sound komutu ile yapılmış ve oldukça uzun, sorunum şu;
butona bastıkça melodi çalıyor anca bıraksamda melodiyi çalmaya devam ediyor. ben çalmasını bırakmasını istiyorum. bu maksatla INT girişine butonu bağladım.
int kesmesinde option.reg.6 dan toggle ile int kesmesinin yönünü değiştiriyorum ancak hala çalmaya devam ediyor. yani sound dataları bitene kadar işlem devam ediyor.  acaba bunu aşma şansı yokmu? break komutunu daha önce kullanmadığım için işlevini tam bilmiyorum. bu komutla olmuyor mu?


KeSMe:
        Context Save
InTF =0
if option_reg.6 =0 then
toggle option_reg.6
GoSub melodi_1 
endif
if option_reg.6 =1 then toggle option_reg.6 :goto main
Context Restore

ete

Bazı şeyler belli değil. INT kesmesini yaratacak buton ile Ses çıkışı aynı pinmidir? Sanki öyle gbi konuşmuşsun.
Değil ise kesme içindeki program pek akıllıca değil.
Her şeysen önce program kesmeye gidince her halukarda TOGGLE OPTION_REG.6 yapıyor. Dikkat edersen hem toggle biti sıfır ise toggle yap hemde toggle biti 1 ise toggle yap demişsin. Bu durumda iki tane if satırına ne gerek var. Direk Toggle OPTION_REG.6 yaz olsun bitsin.
Zaten kesme içinde istediğin yere gitme lüksün yok. Goto main demişsin ana programda bir yer ise o şekilde dönülmemesi gerekir. Kodlar Proton ama orada da bir usul olması gerekir bence. Zaten o şekilde dönmek bence yanlış.
Ayrıca ,Kesme içinde GOSUB kullanmışsın. Bu kesinlikle olmaması gereken bir işlem.
Kesme özel bir yerdir. İşlemci oraya gelince elindeki bütün ana verileri kayıt eder ve kendini boşa çıkartır. Ama bir şeyi çok iyi birlir. Geldiği adres. Sonuçta geldiği adrese dönmek zorundadır. Dönmez ise stack problemi çıkabilir.
Bu işte kesme kullanmak da fazla fayda sağlayacak gibi gözükmüyor. Şayet kesme oluştuktan sonra istediğin bir adrese yada etikete sorunsuz dönebilirsen sorun yok ama dönemiyorsan başka bir mantık düşünmekte yarar var.
Mesela şöyle bir şey;

while portb.0=1
sound ....
sound ....
sound ...
Wend

Şayet PORTB.0 tuşuna basılırsa program otomatikman sound komutlarını bırakıp WEND etiketinden sonraki satıra gelecektir.
Buradan da istediğin yere yönlendirebilirsin programı.

Ete


Hattuşa

#6
hocam sound komutu şu şekilde kullanılmış

melodi_1:
High LED
Sound GPIO.4,[A1,29,C2,14,h1,14,A1,29,C2,_
14,h1,14,A1,14,A1,29,C2,14,h1,14,A1,29,_
C2,14,h1,14,A1,14,D2,29,C2,29,h1,14,A1,_
14,h1,29,A1,14,G1,114,G1,29,h1,14,A1,14,_
G1,29,h1,14,A1,14,G1,14,G1,29,h1,14,A1,_
14,G1,29,h1,14,A1,14,G1,14,E2,29,C2,29,_
A1,29,F1,14,G1,14,F1,14,E1,43,F1,8,G1,8,_
A1,8,h1,8,C2,8,D2,8,E2,43]
DelayMS 1000
Return



hocam interrupt içinde goto komutu boğulurken yaptığım son çırpınışlar.  ;D    sound pini ile buton pini farklıdır
şimdi hocam INT kesmesi ile butonun konumunu yakaladığımda melodi_1 alt rutinini çalıştırıyorum. butondan elimi çektiğimde bu alt rutinin neresinde olursa olsun çıkmak istiyorum. yani melodiyi sonlandırmak istiyorum. bu mümkün mü?


Alıntı YapKesme özel bir yerdir. İşlemci oraya gelince elindeki bütün ana verileri kayıt eder ve kendini boşa çıkartır. Ama bir şeyi çok iyi birlir. Geldiği adres. Sonuçta geldiği adrese dönmek zorundadır. Dönmez ise stack problemi çıkabilir.

hocam bu sorularım genel amaçlı proje önemli değil. yukarıda bahsettiğiniz gibi değilde, istesek kesme içinden geldiği adrese değilde farklı bir yerden kodu çalıştıramayız mı?

ete

While -wend ile denemek lazım.
Yazan kimse tek bir saund komutuna şarkı yerleştirmiş.
Sonda yer alan 1000 ms lik gecikmeleri kaldır ve dene derim.

Teorik olarak kesme içinden başka bir adrese dönüş yapılabiliyor. Proton bunu nasıl yapar bilemem ama PBP stack hatsı verir.
Belkide soft reset atmak ve programı baştan başlatmak bir çözüm olabilir.
Kesme oluştuğu zaman, soft reset komutu vermek laxım.

Ete

Hattuşa

Alıntı yapılan: ete - 10 Aralık 2015, 21:36:06
While -wend ile denemek lazım.
Yazan kimse tek bir saund komutuna şarkı yerleştirmiş.
Sonda yer alan 1000 ms lik gecikmeleri kaldır ve dene derim.

Teorik olarak kesme içinden başka bir adrese dönüş yapılabiliyor. Proton bunu nasıl yapar bilemem ama PBP stack hatsı verir.
Belkide soft reset atmak ve programı baştan başlatmak bir çözüm olabilir.
Kesme oluştuğu zaman, soft reset komutu vermek laxım.

Ete



Ete hocam vermiş olduğum bu kod aslında bir örnek teşkil ediyor. ben bahsettiğim şekilde yaptım. şöyle ki option_reg.6 ile kesme kenar bitini her kesmede toggle yapıyorum. ve kenara göre if komutlarını oluşturup if lerin içinde kesmeyi kapatıp istediğim yere gidiyorum. kod çok uzun olmadığı için sıkıntı yaratmıyor. ne kadar sağlıklı derseniz isisde çalışıyor şimdilik.

asıl öğrenmek istediğim konu ise;
interruptlu bir devrede kesme içerisinde geldiği noktadan farklı bir noktaya yönlendirme şansımız varmı? yukarıdaki gibi hile yaparak değilde, sağlıklı bir şekilde...
hocam protonun helpinde "break" komutu var, break komutunun nasıl kullanıldığını çözemedim. helpte örnek kod var ama anlamadım. malum dil özürlüyüm. sizin bu komutla çalışmanız oldu mu hiç?

Powered by EzPortal