Mikro C'den anlayanlar?

ibora

Usta Üye
Katılım
14 Eyl 2008
Mesajlar
1,203
Puanları
156
Yaş
56
Arkadaşlar iyi akşamlar.
Aşağıdaki kodda ne hata yaptığımı bulamadım.
Program ramp alt rutinine atlayınca bu rutin içindeki for(b=0; b<1000; b++)
döngüsü çalışmıyor. Debugger da ve proteus'ta denedim, aynı. Nerede hata yapmışım, bulamadım. Kullandığım pic 12F675. Yardımlarınız için teşekkürler...

Kod:
unsigned int x, a, b, say;

void setup()
{
ANSEL = 0x00; // analog girişler kapatıldı.
TRISIO=0x00; // portlar çıkış olarak ayarlandı.
GPIO=0x00 ; //portlar sıfırlandı.
CMCON = 0x07; //comparatorlar kapatildi.
}

void blink_quick()
{GPIO.GP0 =1;
delay_ms(50);
GPIO.GP0 = 0;
delay_ms(50);
}

void blink_slow()
{GPIO.GP0 =1;
delay_ms(300);
GPIO.GP0 = 0;
delay_ms(300);
}

void ramp()
{
for(b=0; b<1000; b++)
{
GPIO.GP0 = 1;
if (b = 999) say ++;
if (say == b) GPIO.GP0 = 0;
}
}

void main()
{
setup();
for (;; )
{
for (a=0; a<2; a++)
blink_quick();
for (a=0; a<2; a++)
{blink_slow();}
say = 0;
ramp();
}
}
 
Benim hazırladığım projede, dediğin döngü içerisine giriyor....

circuiti.jpg


Kod:
unsigned int x, a, b, say;

void setup()
{
   ANSEL = 0x00; // analog girişler kapatıldı.
   TRISIO=0x00; // portlar çıkış olarak ayarlandı.
   GPIO=0x00 ; //portlar sıfırlandı.
   CMCON = 0x07; //comparatorlar kapatildi.
}

void blink_quick()
{
   GPIO.GP0 =1;
   delay_ms(50);
   GPIO.GP0 = 0;
   delay_ms(50);
}

void blink_slow()
{
   GPIO.GP0 =1;
   delay_ms(300);
   GPIO.GP0 = 0;
   delay_ms(300);
}

void ramp()
{
   for(b=0; b<1000; b++)
   {
      GPIO.GP0 = 1;
      GPIO.GP1 = 1; // Ben ekledim
      GPIO.GP2 = 1; // Ben ekledim
      if (b = 999) say ++;
      if (say == b) GPIO.GP0 = 0;
   }
}

void main()
{
   setup();
   while(1)
   {
      for (a=0; a<2; a++)
      {
         blink_quick();
      }
      for (a=0; a<2; a++)
      {
         blink_slow();
      }
      say = 0;
      ramp();
   }
}
 
Hocam teşekkür ederim. Sanırım ben yanlış yapmışım uygulamayı. Ama sanırım Mikro C'de bazı bug'lar var. Bu akşam bu programda bu ramp isimli rutinin adını "azalt" yaptım. Bir türlü derlemedi programı. "ramp" olarak değiştirince ancak derleyebildim. Diğer dikkatimi çeken bir konu da komutları yan yana yazınca proteus düzgün çalıştıramıyor. Örnek:

void blink_quick() {GPIO.GP0 =1; delay_ms(50); GPIO.GP0 = 0; delay_ms(50);}

şeklinde geçen bir programı çalıştırmak istediğimde düzgün çalışmadı. Nezaman komutları alt alta yazdım, o zaman düzeldi.
 
Evet, mikroC gerçekten çok salak bir IDE ve derleyici.
Ben çok kullandığımdan iyi biliyorum.
Aşırı derecede kafasına göre hata bulma işini yapıyor.
Sana HI-TECH ya da C18'i öneririm.
Onlar olmasa bile en azından CCS'yi öneririm.
Ayrıca her uygulamanda konfigürasyon bitlerini doğru ayarladığından emin ol...
 
Hocam çok teşekkür ederim verdiğiniz bilgiler için. Sanırım ben problemi yukarıda yanlış anlattım. Ramp rutinine giriyor ama burada 1000 kez döngü yapması gerekirken 1 kez işleyip çıkıyordu. Programdaki hatamı da buldum bir arkadaş sayesinde:


void ramp()
{
for(b=0; b<1000; b++)
{
GPIO.GP0 = 1;
if (b = 999) say ++;
if (say == b) GPIO.GP0 = 0;
}

*******************

if(b==999) olacaktı. Ben if(b=999) yazmışım.

Tekrar teşekkürler ilginiz için.
 
Ne demek, her zaman elimden geldiği kadar yardımcı olmaya çalışırım.
Döngü içerisine girmiyor deyince ben de oraya yöneldim. :)
Normalde o tür mantık hatalarını görmem lazımdı.
Artık nasıl gözümden kaçmışsa. :)
Sorununu çözdüğüne sevindim.
 
yukardaki programın çalışmasını anlatabilirmiisiniz acaba...
 
çalışma şekli nasıl ..yani programın yaptığı iş nedir.
bazı bölümlerini anladım.
for ve if li bölümleri anlayamadım.
 
çalışma şekli nasıl ..yani programın yaptığı iş nedir.
bazı bölümlerini anladım.
for ve if li bölümleri anlayamadım.

Arkadaş bu programı dimmer amaçlı yazmak istemiş.
Biraz kabaca anlattım, umarım senin için sorun olmaz.
for döngüsünü ben de ilk baktığımda yanlış anlamışım, bir dakika... :)


Kod:
unsigned int x, a, b, say; // Evrensel değişkenler tanıtılıyor...

// Mikrodenetleyici için başlangıç ayarlarının yapıldığı bölme
void setup()
{
   ANSEL = 0x00; // analog girişler kapatıldı.
   TRISIO=0x00; // portlar çıkış olarak ayarlandı.
   GPIO=0x00 ; //portlar sıfırlandı.
   CMCON = 0x07; //comparatorlar kapatildi.
}

// PIC'in GP0 ucunun 50ms (hızlı) aralıklarla 1 ve 0 olduğu bölme
void blink_quick()
{
   GPIO.GP0 =1;
   delay_ms(50);
   GPIO.GP0 = 0;
   delay_ms(50);
}

// PIC'in GP0 ucunun 300ms (yavaş) aralıklarla 1 ve 0 olduğu bölme
void blink_slow()
{
   GPIO.GP0 =1;
   delay_ms(300);
   GPIO.GP0 = 0;
   delay_ms(300);
}

void ramp()
{
   for(b=0; b<1000; b++)
   {
      GPIO.GP0 = 1;
      GPIO.GP1 = 1; // Ben ekledim
      GPIO.GP2 = 1; // Ben ekledim
      if (b == 999)
            say ++;
      if (say == b)
            GPIO.GP0 = 0;
   }
}

void main()
{
   setup(); // Başlangıç ayarları yapılıyor...
   while(1) // Sonsuz döngüye giriliyor...
   {
      for (a=0; a<2; a++) // 2 kere çıkış hızlı bir şekilde 1 ve 0 oluyor...
      {
         blink_quick();
      }
      for (a=0; a<2; a++) // 2 kere çıkış yavaş bir şekilde 1 ve 0 oluyor...
      {
         blink_slow();
      }
      say = 0;
      ramp(); // GP0 ucu sürekli 1'e çekilip sonra da tekrar 0'a çekiliyor...
   }
}
 

Forum istatistikleri

Konular
129,864
Mesajlar
930,851
Kullanıcılar
452,726
Son üye
ugur Göktürk

Yeni konular

Çevrimiçi üyeler

Geri
Üst