Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

koşul hatası

Başlatan bulut_01, 27 Nisan 2014, 20:33:49

bulut_01

iyi aksamlar pic proje ailesi 3 tane koşulum var koşullar yerıne geldıgınde cıkıs aktif edip  100ms sonra low yapamıyorum   ? aradım nerde hata yaptıgımı bulamadım.

#int_timer0
void timer0_kesme()
{
set_timer0(200);

for (;klt2==0 && klt1==1 && kumanda==1;){
output_high(pin_a1); /// ayna açma.
delay_ms(100);
output_a(0x00);
}
}
YENİLMEZ..

baran123

birde söyle bir mantık deneyebilirsin
klt2==0 && klt1==1 && kumanda==1
if(klt2 == 0)
{
    if(klt == 1)
    {
         if(kumanda == 1)
         {
             delay_ms(100);
             output_a(0x00);
         }
    }
}


Salih

Şöyle olabilir.
while ((klt2==0) && (klt1==1) && (kumanda==1))
{
output_high(pin_a1); /// ayna açma.
delay_ms(100);
output_a(0x00);
}

bulut_01

#int_timer0
void timer0_kesme()
{
set_timer0(200);
while ((klt2==0) && (klt1==1) && (kumanda==1))
{
output_high(pin_a1); /// ayna açma.
delay_ms(100);
output_a(0x00);
}
}


böyle yazıyorum koşul sağlandıgında a1 high oluyor ama 100ms sonra low olmuyor koşul bozuldugunda neden low olmuyor anlamıyorum koşul bozuldugunda.
YENİLMEZ..

z

Int rutini icinde donguye giriyorsun delay gibi fonksiyonlar cagiriyorsun. Bunlar tehlikeli seyler degilmi?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bulut_01

bülent hocam nasıl bir fonksiyon yazabiliriz delay yerıne dediğimi anladınız bu işi yapacak baska nasıl bişeyler yazılabılır ?
YENİLMEZ..

Salih

INT içinde böyle işlem yapmak uygun değil,
Ama problemi çözmek amacıyla şöyle olması gerekir
while ((klt2==0) && (klt1==1) && (kumanda==1))
{
output_high(pin_a1); /// ayna açma.
delay_ms(100);
output_a(0x00);
Burayada delay koymak gerekir.
}

z

CCS bilmiyorum ama sen ne yapmak istedigini acikla ona gore timer rutinini yeniden yazalim.

set_timer0(200); komutu islerse bu kac mili yada mikrosaniye sonra int olusacturacak demek? (Bilmedigim icin soruyorum)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

aliveli

while komutuna saplandığın için koşulun bozulduğunu görmüyor program
if neden kullanmadın?
kristalin ne?
program ne?

z

Haydin yahu set_timer0(200); komutu islerse bu kac mili yada mikrosaniye sonra int olusturacak demek? (Bilmedigim icin soruyorum)

Cevap gelirse bu tip problemlerde state machine mantigi ile bu sorunun nasil ustesinden gelecegiz onu anlatacagim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

aliveli

Alıntı yapılan: z - 28 Nisan 2014, 01:01:40
Haydin yahu set_timer0(200); komutu islerse bu kac mili yada mikrosaniye sonra int olusturacak demek? (Bilmedigim icin soruyorum)

Cevap gelirse bu tip problemlerde state machine mantigi ile bu sorunun nasil ustesinden gelecegiz onu anlatacagim.
kullandığı kristale ve prescalere bağlı
ama mesela
4 mhz kristal prescaler 8 için kesme 448 us de bir gelir

z

Tamam o zaman yarin asagidaki probleme cozum olacak programlama mantigindan soz edecegim.

Elimizde sadece 1 tane timer var. Bu timer her 1 ms de bir int cakiyor.

Int rutininin icinde bazi pinlere bakip eger istedigimiz konumdalarsa bir ledi yakacagiz ve 100ms sonra sondurecegiz. Tabiki bu esnada islemci interrupt rutinine girmeden once ana programda yapmakta oldugu isleri de yapmaya devam edecek.

Ama bu konuyu burda değil de https://www.picproje.org/index.php/topic,52871.msg400667/topicseen.html#msg400667 de ele alacagim.

Eminim ki programciliga yeni baslayan arkadaslarin cok ama cok isine yarayacak.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bulut_01

Bülent hocam eline saglık döktürmüşün yine burda şunu çıkarıyoruz kesme rutinlerinde delay fonksiyonu deil sayaç fonksiyonu kullanıp işimiz bittiginde sıfırlamak.mesele anlaşılmıştır burdan herkeze tsk ederim.
YENİLMEZ..