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();
}
}
}