Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

for döngüsü problemi

Başlatan bulut_01, 04 Şubat 2016, 21:44:25

sadogan

While döngüsü içinde, for bitince tekrarlanıyor tekrar başa dönüyor.
forun dışına çıkınca for tekrar çalıştırmamanız lazım.
for un dışına çıkınça while(1); bunu koyup bir deneyin olayı göreceksiniz.

dursuncemal

bu kod eger while(1) in icindeysse vitruvius < arkadasin tespiti dogru whlile kulanmalisin.
:=

bulut_01

Alıntı yapılan: sadogan - 04 Şubat 2016, 23:04:13
While döngüsü içinde, for bitince tekrarlanıyor tekrar başa dönüyor.
forun dışına çıkınca for tekrar çalıştırmamanız lazım.
for un dışına çıkınça while(1); bunu koyup bir deneyin olayı göreceksiniz.

while(1) kodda belirtebilirmisiniz nere eklememiz lazım
YENİLMEZ..

dursuncemal

kodun sonuna koyarsaniz orda kalacaktir.
:=

bulut_01

vitruvius hocam kod çalıstı yanlız for  kısmı 1 kez okunuyor while dısında oldugu için duty normal azalması nasıl oluyor onu anlamadım.
#include <16F628A.h>
#FUSES NOWDT                     //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOBROWNOUT              //No brownout reset
#fuses NOMCLR
#use delay(int=4000000)

int16 x=0;
int16 t=0;

void main()
{
setup_comparator(NC_NC_NC_NC);
set_tris_a(0b00000011);
set_tris_b(0b00000000);
output_a(0x00);
output_b(0x00);

for(t=1000;t>500;t--)
{
   for(x=0;x<=10;x++)
   {
       output_high(PIN_b0);
       output_high(PIN_b3);
       delay_us(t);
       output_low(PIN_b0);
       output_low(PIN_b3);
       delay_us(1000-t);

   }
}

while(1)
{
output_high(PIN_b0);
output_high(PIN_b3);
delay_us(t);
output_low(PIN_b0);
output_low(PIN_b3);
delay_us(1000-t);
}
}
YENİLMEZ..

dursuncemal

for dongusu yerine degiskenleri global tanimlayip while kulanirsaniz programiniz tikanmadan devam eder.
:=

bulut_01

Alıntı yapılan: dursuncemal - 04 Şubat 2016, 23:12:40
kodun sonuna koyarsaniz orda kalacaktir.

while kodun sonuna koyunca hiç çalısmıyor.
YENİLMEZ..

vitruvius

Benim verdiğim kodda duty değeri bir daha değişmiyor. ON değerini 100 us, OFF değerini 900us olarak ayarlıyor. Yani dediğiniz gibi 1000'den geri saydırıp 100'e sabitliyor. O şekilde de kalıyor. İstediğiniz bu değil mi?

bulut_01

evet dogru çalısıyor o zaman for döngüsünü void main() içinde kullanmak gerekiyor böyle durumlarda while(1); ekleyince olur demiş sadogan hocamız ama bu sefer kod hiç çalışmadı.
YENİLMEZ..

dursuncemal

#24
aslinda iyice karisti burada asil amaci tam anlatirmisiniz bu dongu surekli mi olacak yoksa bir kereligine mi. programin hepsi bu mu daha baska fonksiyonlar olacak mi? amac sadece pwm mi yoksa soft start gibi birsey mi?
:=

vitruvius

sadogan while(1); koyunca çalışır demedi. Olayı görürsünüz dedi. Demek istediğini uzunca açarsak for döngüsünün sonun while(1); koyarak programın orada takılı kalmasını sağlarsınız. Böylece for t'nin ve x'in for döngüsünden çıkış değerini görebilirsiniz.

Kodu nerede yazacağınız isteğinize göre değişir. While(1) içine koyarsanız önlem almadığınız takdirde sürekli çalışacaktır.

bulut_01

soft start tersi aslında tam güç çalısıp ilk anda sonra yavaslayıp ayarlı duty oranında çalışılması buton vasıtası ile her bastıgımda 1000 geri sayacak 100 kadar orda sabit kalacak belli bir süre sonra cıkıslar low olacak yapmak ıstedıgım yapı buydu.
YENİLMEZ..

dursuncemal

peki neden main in icinde de interupta diil.? yada gercek pwm ile diil.
:=

bulut_01

Alıntı yapılan: dursuncemal - 04 Şubat 2016, 23:33:31
peki neden main in icinde de interupta diil.? yada gercek pwm ile diil.
vitruvius hocamıza sormamız lazım kodu o yazdı calışan halini
YENİLMEZ..

dursuncemal

simdi arkadasimizin yadimci olmaya calistigi dongunun sabit kalmamasi ile alakali  idi.herkes donguyu kilitlemeye calistigi icin esas olmasi gerekeni senden baska bilen yok.o yuzden gereksiz yere carsi karisiyor.tiöer kesmesi yada gercek pwm kulanirsan daha rahat edersin kanimca sikinti olursa cozulur ha ille de mainde yazacam diyorsan ya bir bit tanimlamasin for dongusune girmeden yada ilk for yerine while kullan degiskenleri global yap yine ana dongu icinde butonla yada zamanla bir deger atasin yoksa bu sekilde program surekli bastan baslar.
:=