Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: ido2323 - 26 Ocak 2015, 22:01:01

Başlık: Döngü kurtarma
Gönderen: ido2323 - 26 Ocak 2015, 22:01:01
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?
Başlık: Ynt: Döngü kurtarma
Gönderen: elektronart - 27 Ocak 2015, 09:03:06
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.
Başlık: Ynt: Döngü kurtarma
Gönderen: MrDarK - 27 Ocak 2015, 10:30:55
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.
Başlık: Ynt: Döngü kurtarma
Gönderen: 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
Başlık: Ynt: Döngü kurtarma
Gönderen: Kabil ATICI - 27 Ocak 2015, 11:10:36
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.
Başlık: Ynt: Döngü kurtarma
Gönderen: Pyrodigy - 27 Ocak 2015, 11:20:52
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
Başlık: Ynt: Döngü kurtarma
Gönderen: ido2323 - 27 Ocak 2015, 13:52:36
Pyrodigy.
Başlık: Ynt: Döngü kurtarma
Gönderen: F493 - 27 Ocak 2015, 14:27:35
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.
Başlık: Ynt: Döngü kurtarma
Gönderen: ido2323 - 28 Ocak 2015, 19:44:51
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
Başlık: Ynt: Döngü kurtarma
Gönderen: Pyrodigy - 29 Ocak 2015, 00:12:10
Kesme için;
Port ve Giriş ayarlarının yapıldığı setup kısmını gönder bakalım.