Döngü kurtarma

Başlatan ido2323, 26 Ocak 2015, 22:01:01

ido2323

Hayırlı günler,diyelim ki sürekli alt programları çağırarak sırası ile sensörlerden gelen verileri okuyoruz, bir noktada tıkanma oldu ve çağırılan alt programdan geri dönüş gerçekleşemedi, bunun için nasıl bir kurtarma yapabiliriz?

elektronart

proje içinde bir kaç milisaniyelik global bir unsigned int tick değişkeni yaratırsınız. Bir de süre geçmiş mi diye kontrol etmek için unsigned int chektime değişkeni yaratırsınız. Her fonksiyon için bir tane #define MAXDURATION_F1 5 gibi bir süre tanımlaması yaparsın. Eğer hepsi için max süre aynıysa 1 tane de yeterli olur. Alt fonksiyona geçerken fonksiyonu çağırmadan önce checktime = tick + MAXDURATION_F1 dersin. Döngü içinde takılması muhtemel noktalara if(tick == checktime) break; dersen, döngü içinde max belirtilen süre kadar kalırsın. Daha fazlasında otomatik olarak çıkar. tick değişkeni timer kesmesi içinde otomatik artan bir değişken.
Açık Elektronik

MrDarK

Alt programlardan geri dönüş olmama durumu oluşuyorsa stack pointerınız bozulmuş olabilir. Watchdog kurmanız bu tarz bir problemde cihazınıza reset attırarak kendini kurtaracaktır.
Picproje Eğitim Gönüllüleri ~ MrDarK

ido2323

#3
örnek verirsek daha iyi olacak diyelim ki portB,7. bitinin pull-up olmasını bekliyoruz pull up olunca asd alt programını çağırsın, ya hiçbir zaman pull-up olmazda hep alt programda kalırsa? Reset atmadan alt programdan çıkmak gerekliyse. Bunu nasıl engelleyebiliriz?

altprogram
edc
btfss PORTB,7 ; ya sonsuz döngüye girerse
goto edc
call asd
return

Kabil ATICI

böyle özel durumlar için
goto edc yapmak yerine, örneğin
goto denetle1 yapıyorsun
denetle1 alt programında bu durumu 1000,2000 veya bunu sen belirle,sayıyorsun, eğer şart hala gerçekleştirilmemiş

(sayma sayaçlarının yukarıda sıfırlandığı kabul edilkte)
denetle1
sayma işleri
sayma denetleme
şart tamamsa  return. ve sayaçları sıfırla.
goto edc

şeklinde oluşturuyorsun....
Bu şekilde çok fazla durum varsa programını şirir.
Ayrıca denetle1 kodunda return geri dönüşünde bir hata bayrağı ile olması gerekir.Yoksa senin programın geri dönüş değerlerini aynen işleme alır.
ambar7

Pyrodigy

Alıntı yapılan: ido2323 - 27 Ocak 2015, 11:00:22
örnek verirsek daha iyi olacak diyelim ki portB,7. bitinin pull-up olmasını bekliyoruz pull up olunca asd alt programını çağırsın, ya hiçbir zaman pull-up olmazda hep alt programda kalırsa? Reset atmadan alt programdan çıkmak gerekliyse. Bunu nasıl engelleyebiliriz?

altprogram
edc
btfss PORTB,7 ; ya sonsuz döngüye girerse
goto edc
call asd
return


Ana program içinde döngüye girip çıkamayacak korkusu yaşayacağına Neden Kesme alt prog. kullanmıyorsun ??
(Zaten portB ye bağlamışsın butonu Tüm PIC lerde PORTB kesmesi vardır.)
Pull up yapınca otomatik kesmeye girsin ne yapacaksa orada yapsın. Pull up olmadığı sürece kesmeye gitmez sende mutlu mesut programında ne yapacaksa devam edersin
Persistance is the name of the game in this business....

ido2323


F493

#7
Selam,

  Siz bu "altprogram"'ı ana donguden cagırıyorsunuz sanırım.

main

altprogram_1
altprogram_2
....
....

şeklinde.


Şu şekilde yapsanız.
altprogram
btfss PORTB,7 
return         ; Eğer PORTB,7 set değil ise yazılım ana programa doner ve diğer işlerine bakar. 
                   ; Akış tekrar buraya geldiğinde eğer koşul uygunsa call asd çalışır ve çıkar.
call asd
return


Esen kalın.

ido2323

#8
Hayırlı akşamlar,RB0 kesmesini deniyorum, fakat yapamıyorum

Sırası ile PBADEN kayıtçısını 0 yapıp RB4:0 pinlerinin dijital yap
ADCON0 ve ADCON1 ayarla (aynı zamanda RA0 dan RA4 e kadar analog okuma yapılıyor.)
movlw b'11000000'
movwf INTCON
movlw b'00000000'
movwf INTCON2
CLRF LATD
MOVLW 0X00
MOVWF TRISD

bunları yaptıktan sonra;

nemoku
bsf INTCON,4 ;RB0 kesmesi aktif
call input
btfss  INTCON,1 ;kesme gerçekleşti mi?
goto nemoku
bcf INTCON,4 ;RB0 kesmesi pasif
bsf PORTD,7
goto nemoku

Pyrodigy

Kesme için;
Port ve Giriş ayarlarının yapıldığı setup kısmını gönder bakalım.
Persistance is the name of the game in this business....