PIC RTOS Zaman Sorunu

Başlatan flashsel, 03 Mayıs 2012, 14:45:46

flashsel


Selamlar arkadaşlar,

Pic üzerinde RTOS kullanımı amacıyla bir deneme uygulamasının nasıl çalıştığını görmek için aşağıdaki ufak programı yazdım.
Hem gerçek devre üzerinde hemde proteus üzerinde;


10 saniyede bir led açılıp kapanması gerekirken 1.5 saniyede bir oluyor. Böyle bir sıkıntı ile kaşılaşıp çözüm bulan var mı?


Kullandığım PICC 4.128 sürümü




#include<16f877A.h>

#fuses HS,NOWDT,NOPROTECT
#use delay(clock=4M)
#use rtos(timer=1, minor_cycle=1s)

#task(rate=10s, max=10ms)
void task_eprom_control()
{
    output_toggle(pin_d7);
}

void main()
{
    rtos_run();
}



Saygılar




Salih

#fuses HS,NOWDT,NOPROTECT


Niye HS sizin kristal 4 Mhz.
XT olmalı.

flashsel

Alıntı yapılan: salih - 03 Mayıs 2012, 16:17:26
#fuses HS,NOWDT,NOPROTECT


Niye HS sizin kristal 4 Mhz.
XT olmalı.

Normalde XT olarak test ettim. Birkaç farklı entegre ve kristal ile test ettiğim için buraya yazarken o kısmı değiştirmeyi unutmuşum.  :)

Salih

Deneyi gerçek devrede mi yaptın? yoksa ISIS demi.

Salih

#4
#include<16f877A.h>

#fuses XT,NOWDT,NOPROTECT,nobrownout
#use delay(clock=4M)
#use rtos(timer=1, minor_cycle=250ms)

#task(rate=10s, max=10ms)
void task_eprom_control()
{
    output_toggle(pin_d7);
}

void main()
{
    rtos_run();
}

Gerçek devre üzerinde denedim, böyle çalışıyor.

flashsel

Alıntı yapılan: salih - 03 Mayıs 2012, 17:25:17
Deneyi gerçek devrede mi yaptın? yoksa ISIS demi.
Devreyi hem gerçek devrede hemde İsis'te denedim. Test ettiğim entegreler: 16f877A,18f4520,18f45k22 hepsindede aynı sonucu aldım. 10s task'ta 1.4sn 100s task'ta 14sn gecikme elde ediyorum. 

Salih

En son verdiğim kodlar istediğiniz gibi çalışıyor.

remzi

RTOS konusunda anlamadığım noktalar var.
#use rtos(timer=1, minor_cycle=250ms)

Bu komut satırında timer=1; ile rtos'un timer1 ile çalışacağınımı gösteriyor?
minor_cycle=250ms neyi ifade ediyor?

#task(rate=10s, max=10ms)

Birde burada yazılanlar neyi ifade ediyor?
Ayrıca 2.  ve 3. taskları kullanmak istesek nasıl kullanıcaz?
İyi çalışmalar...

flashsel

Alıntı yapılan: salih - 04 Mayıs 2012, 08:43:18
En son verdiğim kodlar istediğiniz gibi çalışıyor.
Teşekkürler.

Test ettim çalışıyor. Ayrıca yaşadığım problemin kaynağınıda tespit etmiş oldum sayenizde. :)

4MHz'lik bir PIC'te minor_cycle en fazla 400ms olabiliyor. Üstündeki frekanslardada hata vermiyor ama RTOS düzgün çalışmıyor.

4MHz'den aşağıdaki frekanslarda minor_cycle süresi artıyor üstündeki frekanslarda ise  minor_cycle azlıyor.

flashsel

#9
Alıntı yapılan: remzi - 04 Mayıs 2012, 09:31:49
RTOS konusunda anlamadığım noktalar var.
#use rtos(timer=1, minor_cycle=250ms)

Bu komut satırında timer=1; ile rtos'un timer1 ile çalışacağınımı gösteriyor?
minor_cycle=250ms neyi ifade ediyor?

#task(rate=10s, max=10ms)

Birde burada yazılanlar neyi ifade ediyor?
Ayrıca 2.  ve 3. taskları kullanmak istesek nasıl kullanıcaz?
İyi çalışmalar...

timer=1 rtos'un timer1 ile çalışacağını gösteriyor.

minor_cycle=250ms işlemlerin yapılacağı maksimum süreyi gösteriyor. Burada hiçbir task 250 milisaniyeden uzun olamaz demektedir.

rate=10s : 10 saniye gecikme ile işlemin yapılmasını sağlıyor. Yani altındaki işlemin 10 saniyede bir tekrarlanmasını söylüyor.

max=10ms : buradada işlem en fazla 10 milisaniye sürebilir demektedir.

Salih

Alıntı Yap
Bu komut satırında timer=1; ile rtos'un timer1 ile çalışacağınımı gösteriyor?
Evet Timer1 Kullanılacağını belirtiyor.
Alıntı Yap
minor_cycle=250ms neyi ifade ediyor?

Programda Task'ların tekrar çalışacağı en küçük zaman aralığını belirtiyor

Alıntı Yap
#task(rate=10s, max=10ms)
Birde burada yazılanlar neyi ifade ediyor?
Rate Task'ın tekrarlayacağı süre. Max ifadesi ile  Task'ın içinde harcanak max süreyi  belirtiyoruz.
Alıntı Yap
Ayrıca 2.  ve 3. taskları kullanmak istesek nasıl kullanıcaz?

#task(rate=100ms,max=100us)
void The_first_rtos_task ( )
{
  Output_toggle(led1);
}

#task(rate=500ms,max=100us)
void The_second_rtos_task ( )
{
 Output_toggle(led2);
}

#task(rate=1000ms,max=100us)
void The_third_rtos_task ( )
{
 Output_toggle(Led3);
}


Bu şekilde Task'lar yazabiliriz

remzi

Bu RTOS işi bu kadar kolaymıydı ben boşuma gözümü korkutmuşum... ;D

Erol YILMAZ

RTOS un CCS hali diyelim biz buna :)

mierdogan

PIC programlamada RTOS kullanımını önerirmisiniz?

Eğer önermeniz pozitif yöndeyse nereden nasıl başlamalı gibi konularda biraz genel bilgi verebilirmisiniz?

Saygılar