Haberler:

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

Ana Menü

derleme sorunu

Başlatan yusuf.ozyer, 30 Ocak 2015, 22:51:31

yusuf.ozyer

hocalarım öncelikle hayırlı akşamlar bana vakit ayırdığınız için teşekkür ederim
hocalarım bir kod yazdım fakat derleyemiyorum sürekli hata alıyorum kullandığım pic 16f877a 4 mhz kristal var derlerken sürekli hata veriyor
kodlar bana ait değil kendi robotunu kendin yap 2 kitabından aldım normalde pic basic çalışırım fakat yapamadığım için bu kitaptakini aldım kodlarım şöyle


#define buton  PORTD.F1  //robotun 5 saniye gecikmeli çalışması için kullanılır
#define sensor PORTD.F0 // robotun bir engel ile karşılaşınca durması için kullanılır

unsigned int  an0,an1,an2,an3,an4,an5,an6,an7 ;
int proportional,last_proportional=0,integral=0,derivative,power_difference,pozisyon,Mpos;
char son_sol, son_sag,i,j;
const Tpos=0;

void set_motor (int sol,int sag) {
      if (sol<0) {
         PortC.F4=0;
      }
      else{
         PortC.F4=1;
      }
      if (sag<0){
         PortC.F6=0;
      }
      else{
         PortC.F6=1;
      }

      pwm1_set_duty(sag); // sağ
      pwm2_set_duty(sol); // sol
}

int adc_oku(){
char an0=0,an1=0,an2=0,an3=0,an4=0,an5=0,an6=0,an7=0 ;
const oran=150;
   an0 = Adc_read(0);
   an1 = Adc_read(1);
   an2 = Adc_read(2);
   an3 = Adc_read(3);
   an4 = Adc_read(4);
   an5 = Adc_read(5);
   an6 = Adc_read(6);
   an7 = Adc_read(7);

   if (an7<oran) PortB.F0 =1;  else PortB.F0=0;
   if (an6<oran) PortB.F1 =1;  else PortB.F1=0;
   if (an5<oran) PortB.F2 =1;  else PortB.F2=0;
   if (an4<oran) PortB.F3 =1;  else PortB.F3=0;
   if (an3<oran) PortB.F4 =1;  else PortB.F4=0;
   if (an2<oran) PortB.F5 =1;  else PortB.F5=0;
   if (an1<oran) PortB.F6 =1;  else PortB.F6=0;
   if (an0<oran) PortB.F7 =1;  else PortB.F7=0;

   switch (PortB) {
   // bu bölümde siyah zemin üzerine beyaz çizgi okumak için yazılı
   case 0b00000001 : {Mpos =  7; break;}
   case 0b00000011 : {Mpos =  6; break;}
   case 0b00000111 : {Mpos =  5; break;}
   case 0b00000110 : {Mpos =  4; break;}
   case 0b00001110 : {Mpos =  3; break;}
   case 0b00001100 : {Mpos =  2; break;}
   case 0b00011100 : {Mpos =  1; break;}
   case 0b00011000 : {Mpos =  0; break;}
   case 0b00111000 : {Mpos = -1; break;}
   case 0b00110000 : {Mpos = -2; break;}
   case 0b01110000 : {Mpos = -3; break;}
   case 0b01100000 : {Mpos = -4; break;}
   case 0b11100000 : {Mpos = -5; break;}
   case 0b11000000 : {Mpos = -6; break;}
   case 0b10000000 : {Mpos = -7; break;}

   //bu bölümde beyaz zemin üzerindeki siyah çizgi okumak için yazılı
   case 0b11111110 : {Mpos =  7; break;}
   case 0b11111100 : {Mpos =  6; break;}
   case 0b11111000 : {Mpos =  5; break;}
   case 0b11111001 : {Mpos =  4; break;}
   case 0b11110001 : {Mpos =  3; break;}
   case 0b11110011 : {Mpos =  2; break;}
   case 0b11100011 : {Mpos =  1; break;}
   case 0b11100111 : {Mpos =  0; break;}
   case 0b11000111 : {Mpos = -1; break;}
   case 0b11001111 : {Mpos = -2; break;}
   case 0b10001111 : {Mpos = -3; break;}
   case 0b10011111 : {Mpos = -4; break;}
   case 0b00011111 : {Mpos = -5; break;}
   case 0b00111111 : {Mpos = -6; break;}
   case 0b01111111 : {Mpos = -7; break;}

   default: if (Mpos < 0) Mpos = -8 ; else Mpos = 8;
   //robot pistten çıktığında çıktığı yerden tekrar çizgiyi yakalaması için
   }
   return Mpos; // Mpos değişkenin değeri parametre değeri olarak altprograma aktarılır
}
void pid(){
   const enb = 127, kp=12,kd=10, ki=1 ;

   pozisyon= adc_oku();
   proportional = tpos- pozisyon ;
   derivative   = (proportional - last_proportional);
   integral     = integral+proportional;
   last_proportional = proportional ;

   power_difference = proportional *kp + derivative*kd;
   if (power_difference >enb)  power_difference =  enb;
   if (power_difference <-enb) power_difference = -enb;

   son_sol = (char) enb+power_difference;
   son_sag = (char) enb-power_difference;

   set_motor(son_sol, son_sag);
   //formül ile otomatik hesaplanan motor hız değerleri set_motor altprogramı ile motora gönderilir
}

main(){
   PortB  = 0x00;
   TrisB  = 0b00000000;
   ADCON1 = 0x80;
   PortA  = 0x00;
   TrisA  = 0b11101111;
   PortE  = 0x00;
   TrisE  = 0b00000111;
   PortC  = 0x00;
   TrisC  = 0b00000000;
   PortD  = 0x00;
   TrisD  = 0b11111111;

   pwm1_Init(100000);
   pwm2_Init(100000);

   set_motor(0,0);
   PortB = 1 ; for (i=0 ; i<8  ; i++) {delay_ms(10) ; PortB = PortB<<1;}
   }

   i = 0;
    while (buton ==1) {i=1} ;
   if (i == 1) {
      for (j=0 ; j<5 ; j++) {
      PortB  =1 ;
      for (i=0 ; i<8 ; i++) {delay_ms(125);PortB = Portb<<1;}
   }
   }

pwm1_start ();
pwm2_start();
portb =0;
while(1) {
   pid();
}
}
}