D

rb0 interrupt problemi

Başlatan dogus, 03 Temmuz 2012, 12:25:19

dogus

Merhaba, 16f877a kullandığım devremde rb0a bağlı pull up yapılmış bir buton var, ve d portunun bitlerini kontrol elde etmek için kullanılan 8 ledli bir kontrol devresi var, her rb0 kesmesinde portd değerini 1 arttırmasını istiyorum, şöyle bir kod yazdım



ON INTERRUPT GOTO ARTTIR

@ DEVICE PIC16F877A, XT_OSC
@ DEVICE PIC16F877A, PWRT_OFF
@ DEVICE PIC16F877A, WDT_OFF
@ DEVICE PIC16F877A, BOD_OFF
@ DEVICE PIC16F877A, LVP_OFF
@ DEVICE PIC16F877A, CPD_OFF
@ DEVICE PIC16F877A, PROTECT_OFF

TRISB=$FF
TRISD=0
PORTD=0


INTCON=%10010000
OPTION_REG=0    'tuş pull up olduğu için düşen kenarda kesme oluşsun dedim, timer kullanılmadığından hepsi 0

DONGU:
GOTO DONGU
DISABLE INTERRUPT

ARTTIR:
PORTD=PORTD+1
INTCON.1=0
RESUME
ENABLE INTERRUPT

END


dongu sekmesinin içine pause koyunca pek düzgün olmasada biraz çalışıyor, arada bir tuşu algılamıyor, pause kullanmayın dediğinizi gördüm ve sildim, bu sefer arada çalışıyor arada çalışmıyor kafasına göre ve çalıştığı zamanda genellikle 2şer 3er arttırıyor portd değerini, yardımlarınızı bekliyorum.

dogus

şunu da söyleyeyim, arada bir yükselen kenarda da kesme oluşturuyor, arada bir ama

ete

yapman gereken tek şey RB0 da bağlı butona basıldıktan sonra butonun bırakıldığınıda kontrol etmek. Zira tuş titremesi dediğimiz olay ceryan ediyor ve sen tuşa basarken anlık olarak basılıp bırakılma (kontak titremesi) olayı meydana geliyor ve her defasında bir kesme oluşup senin portD değerin birden fazla artıyor.
Bu nedenle kesme kısmında kesmeden çıkmadan önce
WHILE PORTB.0=0:WEND şeklinde bir komut satırı ekle. Muhtemelen sorunların düzelecektir.

Ete

dogus

intcon.1=0 satırından sonra dediğiniz komutu ekledim, olmuyor, genellikle tuşa bastığımı algılamıyor hiçbir tepki vermiyor, verdiği zamanda sürekli aynı periyotlarda basmam gerekiyor, ve 2şer 3er artmaya devam ediyor arada bir, dikkat ediyorum özellikle, tuşa basıyorum 1 artıyor, çektiğimde yeniden artıyor, ama bu herzaman olmuyor, arada bir yükselen kenarda mı kesiyor bilmiyorum çözemedim

ete

Şimdi simulasyonda denedim sorunsuz çalışıyor. Gerçek devrende sorun oluyor ise buton kontaklarına 100nf bağla.
Ayrıca while ...wend komutunu hemen PortD=PORTD+1 satırından sonrasına koy.

Programında disable ...enable komutlarnın yanına interrupt yazman gerekmiyor. Disable  ve Enable yazman yeterli.

Programın başına Define OSC 4 satırını ekle.
Ayrıca  DONGU satırından evvel 250 ms lik açılış gecikmesi ekle.

Başkada yapılacak bir şey gözükmüyor. Çalışması gerekir.

Ete

dogus

100nf'yi nasıl bağlayacağım, + ucunu hatta - ucunu şaseye mi, yoksa hatta seri mi bağlayacağım?

ete

Buton'un bir ucu zaten GND (Şase) de değilmi? Butonun iki kontağına 100nf bağlayacaksın hepsi bu.
100nf kondansatörün  iki bacağı var. Bir bacağını butonun bir ucuna diğer bacağını dipğer ucuna bağlayacaksın.

Ete

Burak

Sevgili Ete ,

Ben şahsen bu problem ile ilgili çok araştırma yaptım , çünkü instant olmasada bir insanın bir tuşa basma çekme sıklığının maksimumunu düşünerek araştırmalarda bulundum , zira butonun şase ve pin'e giden aralığına 470nf ve 4.7 uf değerleri arasına kadar tüm değerleri deneyerek optimum kapasitans değerini belirttiğim aralık olarak elde ettim , Optimum 1uf gerçekten çok işlevsel ve yaklaşık 0 hata payı ile çalışarak titremeyi ortadan kaldırmıştır ...
Umarım bu thread yolu geçenlere faydası olur ...

İyi çalışmalar ...
Ω Gens Una Sumus Ω

ete

Bu sorunun illaki kondansatörle çözülmesi diye bir kanun yok. Yazılımlada sorunu çözmek zor değil.
Örnek verecek olursak;
IF TUS=0 THEN
   SAYI=SAYI+1
   WHILE TUS=0:WEND
   PAUSE 100
ENDIF
Bu kodlarla hiç kondansatör kullanmasanızda sorun çıkmaz. Tabiiki bozuk bir butonunuz yok ise.
Bağladığınız kondansatör kodda yer alan Pause 100 komutunun işlevini üstlenir.
Ete

Burak

Alıntı yapılan: ete - 24 Ocak 2013, 15:45:31
Bu sorunun illaki kondansatörle çözülmesi diye bir kanun yok. Yazılımlada sorunu çözmek zor değil.
Örnek verecek olursak;
IF TUS=0 THEN
   SAYI=SAYI+1
   WHILE TUS=0:WEND
   PAUSE 100
ENDIF
Bu kodlarla hiç kondansatör kullanmasanızda sorun çıkmaz. Tabiiki bozuk bir butonunuz yok ise.
Bağladığınız kondansatör kodda yer alan Pause 100 komutunun işlevini üstlenir.
Ete

Maalesef kodlar bu sorun için bir çözüme ulaştırmadı beni ... Birçok kod kombinasyonu denedim fakat istediğimi elde edemedim ... Kullandığım microcontrollore 16F628A idi ... Belki başka tür , daha yeni nesil bir Microcontrollore ile daha iyi sonuç alınabilir ... Sadece bir fikir .
Ω Gens Una Sumus Ω

ete

İşlemci ile alakası yok. Ya butonun tireşimli kontak (düşük kalite) yada devrende parazit var.
Başka açıklaması yok bunun.
Her neyse madem 1uf ile çözüm buldun. Onu kullanmaya devam et. Boşuna mesaj kirliliği yaratmayalım.
Ete

Powered by EzPortal