Assigning to non lvalue hatası

Başlatan eshgi, 09 Mayıs 2016, 11:47:04

eshgi

Arkadaslar Merhaba,
mikroC de program yazdım, daha dogrusu altasın kitabındaki programdan bana uygun olarak dönüştürdüm ama derledikten sonra assigning to non lvalue hatası veriyor anlamadım yardım eder misiniz?
ana program bu;
                                   // Unite8\Kol2.C
#include "Krky.C"                  // "Krky.C" kütüphane dosyası programa eklenir

 const  srv1_bas = 50,srv1_nrm =80,srv1_bit =200,//  Robot kol servolarının
        srv2_bas = 90,srv2_nrm =180,srv2_bit =245,//  başlangıç, normal ve
        srv4_bas = 50,srv4_nrm =135,srv4_bit =200,//  bitiş konumları
        srv5_bas = 45,srv5_nrm =130,srv5_bit =215,//  sabit olarak tanımlanır
        srv6_ac  = 80,srv6_nrm =50,srv6_kapa =47;

void main(){  
  TRISB  = 0X0F;
  TRISD  = 0X00;                 // D portu çıkış yapılır
  PORTD  = 0X00;                 // D portu silinir
  TRISE  = 0X07;                 // E portun giriş yapılır
  ADCON1 = 7;                    // ADC kapatılır


   srv1 = 80;
   srv3 = 180;                        // Servo değişkenlerine servoların normal
   srv2 = 180;                        // konumlarının tutulduğu sabitlerin
   srv4 = 135;                      // değerleri aktarılır
   srv5 = 130;
   srv6 = 50;
  rc_servo_6(1);                    // "rc_servo_6" alt programı çalıştırılır
  

  while(1){
           if(PORTB != 0X00) {

           if ((PORTB == 0x0D) && (srv1 > srv1_bas)) srv1 = srv1 - 1; // 1.servo sol
           if ((PORTB == 0x0C) && (srv1 < srv1_bit)) srv1 = srv1 + 1; // 1.servo sağ

           if ((PORTB == 0x0A) && (srv2 < srv2_bit)) srv2 = srv2 + 1; // 2.servo yukarı
           if ((PORTB == 0x0B) && (srv2 > srv2_bas)) srv2 = srv2 - 1; // 2.servo aşağı

           if ((PORTB == 0x08) && (srv4 > srv4_bas)) srv4 = srv4 - 1; // 4.servo yukarı
           if ((PORTB == 0x09) && (srv4 < srv4_bit)) srv4 = srv4 + 1; // 4.servo aşağı

           if ((PORTB == 0x06) && (srv5 < srv5_bit)) srv5 = srv5 + 1; // 5.servo yukarı
           if ((PORTB == 0x07) && (srv5 > srv5_bas)) srv5 = srv5 - 1; // 5.servo aşağı

           if (PORTB == 0x05) srv6 = srv6_ac;                         // 6.servo açık
           if (PORTB == 0x04) srv6 = srv6_kapa;                       // 6.servo kapalı

       }
        srv3= srv2;                     // 2. ve 3. servo aynı konumda olmaları gerektiğinden bu servoların
        rc_servo_6(1);                  // değerini tutan değişkenlerin değerleri eşitlenir.
                                       // "rc_servo_6" alt programı çalıştırılır
  }
  }


alt program da bu;
//******************************************************
//*  Name    : Krky.C                                  *
//******************************************************



#define servo1  PORTD.F0
#define servo2  PORTD.F1
#define servo3  PORTD.F7
#define servo4  PORTD.F6
#define servo5  PORTD.F5
#define servo6  PORTD.F4
#define servo7  PORTD.F3
#define servo8  PORTD.F2
      const srv1 = 100, srv2 = 100, srv3 = 100, srv4 = 100;
      const srv5 = 100, srv6 = 100, srv7 = 100, srv8 = 100;

void rc_servo_1(char x ){  // 1 tane RC servo kotrol etmek için
 char i,j,k;
 for (j=1;j<=x;j++){
   for (i=1;i<=10;i++){
               servo1 = 1;
               for(k=0;k<srv1;k++) delay_us(3);
         servo1 = 0;
         delay_ms(15);
       }
  }
}

void rc_servo_2(char x ){  // 1 tane RC servo kotrol etmek için
 char i,j,k;
 for (j=1;j<=x;j++)
  for (i=1;i<=10;i++){
               servo1 = 1;
         for(k=0;k<srv1;k++) delay_us(3);
         servo1 = 0;

               servo2 = 1;
         for(k=0;k<srv2;k++) delay_us(3);
         servo2 = 0;
         delay_ms(15);
      }
}

void rc_servo_3(char x ){  // 1 tane RC servo kotrol etmek için
 char i,j,k;
 for (j=1;j<=x;j++)
  for (i=1;i<=10;i++){
               servo1 = 1;
         for(k=0;k<srv1;k++) delay_us(3);
         servo1 = 0;
         
               servo2 = 1;
         for(k=0;k<srv2;k++) delay_us(3);
         servo2 = 0;
         
               servo3 = 1;
         for(k=0;k<srv3;k++) delay_us(3);
         servo3 = 0;
         
         delay_ms(14);
      }
}

void rc_servo_6(char x ){  // 1 tane RC servo kotrol etmek için
 char i,j,k;
 for (j=1;j<=x;j++){
//  for (i=1;i<=10;i++){
               servo1 = 1;
         for(k=0;k<srv1;k++) delay_us(3);
         servo1 = 0;

               servo2 = 1;
         for(k=0;k<srv2;k++) delay_us(3);
         servo2 = 0;

               servo3 = 1;
         for(k=0;k<srv3;k++) delay_us(3);
         servo3 = 0;
         
               servo4 = 1;
         for(k=0;k<srv4;k++) delay_us(3);
         servo4 = 0;

               servo5 = 1;
         for(k=0;k<srv5;k++) delay_us(3);
         servo5 = 0;

               servo6 = 1;
         for(k=0;k<srv6;k++) delay_us(3);
         servo6 = 0;
         
         delay_ms(10);
      }
}





Klein

Srv1, Srv..n   const  tanımlı. Onların değerini değiştiremezsin. Program içerisinde onların değerini değiştirmek istediğin için hata alıyorsun.

F493

Selam,

    C de const değişkenler sabit olarak kabul edilir. Yani tanımlama esnasında  verdiğiniz ilk değeri değiştiremezsiniz. Daha açığı,

   const  srv1_bas = 20;   ile 
  #define srv1_bas   20   arasında fark yoktur.  C dilinde bir değişkene değer  atamanız için o değişkenin sol taraf değeri olması gerekli (Left value (lvalue)) . Şöyleki,

    int a =20;
    .
    ..
    a = 10; // Hiç bir sorun yok çünkü a değişkeni ram'de tanımlandı ve değer tutabilir.

   Fakat,
   const a = 20;  // yani #define a 20
   .
   ..
   a = 20;  // hata..  Çünkü siz proğram memoriye (Flash) değer  atamaya çalışıyorsunuz.

   Zaten hata mesajıda onu söylüyor. Sol taraf degeri olmayan bir ata işlemi diyor. (assigning to non lvalue)

Esen kalın.


 

eshgi

biraz geç cevap yazıyorum kusura bakmayın.
cok tesekkur ederim yardımlarınız içinç
kafayı kıracaktım nerede hata var diye diye...
cok tesekkur ederim ikinize de..