Kesme:
Context Save
INTF=0
'***************************************************
'* PORTB.4=1:PORTB.3=1:PORTB.2=1:PORTB.1=1 *
'* While PORTB.0=0 *
'* filtre=filtre+1 *
'* Wend *
'* if filtre>say then fff=1 *
'* filtre=0 *
'***************************************************
Context Restore
kesme nin içine işaretlediğim kodları yazınca kesme saçma sapan çalışıyor. bazen kesmeye gidiyor bazen gitmiyor
fakat kesmenin içine herhangibir kod yazmasam çok güzel çalışıyor
forumda daha öncede konuşulmuştu Hardware_Interrupt kullanımında kesme içerisinde asm kullanılmalıdır diye.bu kodları bir de asm kullanarak denemek istiyorum fakat asm konusunda hiç bilgim yok
rica etsem bir arkadaşım bu kodları asm ye çevirebilirmi?
Kesme ne ile oluşuyor?
Kesmeye girdiğinde tekrar kesme oluşmaması garantiniz altında mı?
kesme portb.0 kesmesi
kesme oluştuğunda yeni kesme oluşması zaten donanımsal olarak engellenmiş durumda
proteuseta deniyorsan bende aynı sorunla karşılaşmıştım saçmalıyor.
Hem kesme oluşacak hem de PB0 low olacak (kontak sıçraması olmadan!).
Bu iki ihtimal zorluk çıkarmıyor mu acaba?
Sadece bir değişken 1/0 yapılsa ana döngü içerisinde, bu değişkene
göre işlem yapılsa; kesme içinde beklemesek olmaz mı acaba?
Kodlama mantığınız çok hatalı.
İstediğiniz bölümler kesinlikle kesme dışında kullanılmalı.
Kesme işlemi; MCU ne ile meşgul olursa olsun, dış dünyayı ve iç kontrolleri(Timer vb) takip edebilsin diye vardır. Bu bilgileri işleme sokmak MCU nun işidir. Program içerisinde yaparsınız.
Bir başka konu;
PORTB.0 kesmesi yerine RBChange kesmesini kullanırsanız, while rutinine gerek kalmaz.
Aynı şekilde PORTB nin düşük 4 bitini (Low Nibble);
PortB=PortB | %00001111
şeklinde yaparsanız çok daha hızlı ve az kod kullanımı ile kotarırsınız.
Kesme içinde ASM yazmak diye bir şart kesinlikle yok.
Kesme oluştuğu anda cpu, birkaç komutta işini bitirip çıkmalı.
Kesme içinde cpu'yu While ile bekletirseniz "ortaya çok karışık" bir kodlama çıkmış olur.
Ayrıca butonun kontak sıçraması her kontak basışta defalarca kesmeye sebep oluyorsa, problem başlar.
Öncelikle donanımda kesme kaynaklarından temiz sinyal gelmesi sağlanmalı...
Hangi hızla, ne geleceği netleştirildikten sonra kesmeler kullanılabilir.
Hep bahsetmişimdir bir arkadaşım var ASM de yazan...
İnterrupt kullanmıyor, herşeyi sorgulayarak yapmaya çalışıyor ki,
belki cpu'nun %0.01 zamanını alması gereken bir rutin için %30 luk zaman ayırıyor.
O çok övündüğü optimizasyonun yerinde yeller esiyor.
Interruptları iyi anlamak lazım Mcu kodlamada...
Alıntı yapılan: private_korsan - 17 Nisan 2014, 13:54:21
kesme portb.0 kesmesi
kesme oluştuğunda yeni kesme oluşması zaten donanımsal olarak engellenmiş durumda
Bu donanımsal engellemeyi bir sakıncası yok ise açıklayabilirmisiniz?
Sizin kesme rutininizde kesmeleri yazılımsal olarak engellemediğiniz için program
INTF=0 satırından itibaren sürekli kesmeye gidiyor ve stack owerflow oluyor. ISIS de denerseniz ilk kesmeden itibaren alacağınız hata sonucu bu olacak.
Disable
kesme:
PORTB.4=1:PORTB.3=1:PORTB.2=1:PORTB.1=1
While PORTB.0=0
filtre=filtre+1
Wend
If filtre<say Then cikis
ttt=sure/4
If sn>ttt Then z=z+1
If z=c1 Then sayi=sayi+1:z=0:sn=0:EWrite 0,[sayi.LowByte]:EWrite 1,[sayi.HighByte]
cikis:
filtre=0
INTCON.1=0
Resume
Enable
bu şekilde yazımsal kesme de hiç bir sıkıntı çıkmıyor sorunsuz çalışıyor
denemelerimi devre üzerinde yapıyorum proteus kullanmıyorum
while döngüsünün içinde değişken ismimdende anlaşılacağı gibi filtreleme yapıyorum kontak sıçraması,parazit gibi durumlarda işlem yapmadan keseden çıkmak için
fakat Hardware_Interrupt olayını birtürlü başaramadım aynı kodlar orada çalışmıyor
işlemci nedir? 16F1827 gibi yeni nesil mi?
16F628A