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);
}
}
(http://s32.postimg.cc/wbg193s8x/picproje.jpg) (http://postimg.cc/image/wbg193s8x/)
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.
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.
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..