Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

hardware interrup hatası

Başlatan POWER, 10 Şubat 2008, 00:44:10

POWER

Arkadaşlar aşağıda basit bir hardware int. için örnek kodlar var.tmr0 ile buzer belirli aralıklarla çalışmasına rağmen bir türlü led çalışmıyor.Sanki  ana proğram bölümü hiç çalışmıyor.Hatam nerde acaba?

Device 16F877A

Dim BUTON As PORTB.7 
Dim BUZER As PORTD.7 
Dim LED As PORTD.0 
dim SAYAC AS WORD
dim SN AS WORD

OPTION_REG=%00000101  
INTCON    =%10100000  
TRISB=%10000000 
PORTB=0 

On_Interrupt GoTo KESME
BASLA:
IF PORTB.7=0 THEN
TOGGLE LED
ENDIF
GoTo BASLA

KESME: 
INTCON.7=0       
sayac=SAYAC+1   
IF SAYAC=60 THEN 
SAYAC=0
SN=SN+1
IF SN<200 THEN 
HIGH BUZER
ENDIF
IF SN>200 THEN
LOW BUZER
endif
IF SN=500 THEN SN=0
ENDIF
INTCON.7=1  
INTCON.1=0  
Context Restore
End
TB6BKG

piedos

Dostum kodunu incelemedim ama bariz bir donanım hatası gördüm.

40. pin ile buton arasındaki bir yere 10K direnç bağla, direncin diğer ucunu da +5V a bağla, bu sorunu çözecektir.
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

POWER

Cevap için teşekkürler ama dikkat ettiysen portb pinlerinin pull-up özelliği var.Sorun devam ediyor arkadaşlar
TB6BKG

ete

Bana kalırsa hatan sanki Toggle komutunu kesme rutini içinde vermen gerekiyor. Çünki PortB.7=0 olunca program kesme ksımına gidiyor ve kesinlikle Toggle komutunu görmüyor. Halbuki sen o buton içinkesme oluşturmuşsun neden ona ait komutu program içinde veriyorsunki. Onu kesme kısmında kullan sorunun çözülür.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

POWER

ete hocam,
ben burda tmr0 kesmesini kullanarak  buzerden  belirli aralıklarla ses alırken diğer taraftanda başka yapılması gereken işleride yaptırmak istiyorum.Fakat proğram çalışmaya başladığında kesme kısmına gidiyor ve ordan çıkmıyor.Dediğiniz gibi toggle kesmenin altında çalıştırdığım zaman problemsiz çalışıyor.Ayrıca portb.7=0 olduğu zaman kesmeye gitmiyor.En azından ben öyle düşünüyorum. Benim öğrenmek istediğim,proğram kesme kısmına gidiyor ve ordan çıkmıyor. bu normal mi yoksa  başka hatalarımmı var.
TB6BKG

Logan

Bildiğim kadarıyla Basic ile yapılan kesmeler, ASM ve ya C'de olduğu gibi hardware olmuyor. Bunun için kesme rutinin başına ve sonuna şimdi hatırlayamadım fakat W ve STATUS registeri ile ilgili ufak bir program ekleniyor. Sanırım bu registerlerin içeriğini korumak amaçlı yapılıyor. Ayrıca kesme programının sonunda RESUME satırına rastlamadım şöyle olması gerekmiyor mu?

myint: led = 1
Resume
Enable
İmza.

POWER

Bu proğram proton ile yazılmıştır.Mesaj bu başlık altında olduğu için ayrıca bilirtmemiştim ama gördümki yanlış değerlendiriliyor.Proton ile yazılmış ve hardware kesmesi kullanılmıştır.Fakat söylediğim sorun ortaya çıkmıştır ve sorun devam etmektedir.
TB6BKG

Veli B.

Gozume carpan hatalar;
- Kesme rutini hatali.  ISR icinde saniye artimi yapilmali, geri kalan karsilastirma vs islemler ana program icinde yapilmali.
- TMR0 INTF INTCON.2 dir. Siz ise PORTB.0 INTF ni resetliyorsunuz. Bu sekilde STACK overflow olusur. Progamin calismasi bile iyi.
- Konfigirasyon ayarlarini yazilim ile yaparsaniz daha saglikli olur.
- Toggle kullaminiz yanlis. Bu sekilde butona basili tuttugunuz surece blink yapacaktir ki siz gecikmede koymamissiniz.
- Buzzer icin karsilastirma rutininiz dogru değil, tek karsilastirma ile bitirebilirdiniz. ELSE kullanimina bakin.