proton Hardware_Interrupt

Başlatan private_korsan, 17 Nisan 2014, 12:48:45

private_korsan

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?

ferit06

Kesme  ne ile oluşuyor?

Kesmeye girdiğinde tekrar kesme oluşmaması garantiniz altında mı?

private_korsan

kesme portb.0 kesmesi
kesme oluştuğunda yeni kesme oluşması zaten donanımsal olarak engellenmiş durumda

F.T

proteuseta deniyorsan bende aynı sorunla karşılaşmıştım saçmalıyor.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

mehmet

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?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Veli B.

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.

Erol YILMAZ

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...

ferit06

#7
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.

private_korsan

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

ferit06

işlemci nedir? 16F1827 gibi yeni nesil mi?

private_korsan