Picproje Elektronik Sitesi

ENDÜSTRiYEL OTOMASYON => Proses Kontrol Sistemleri => Konuyu başlatan: berkay_91 - 09 Ağustos 2014, 12:28:04

Başlık: Atmel Studio PID kodlarını derlemiyor
Gönderen: berkay_91 - 09 Ağustos 2014, 12:28:04
mrb, aşağıdaki PID kodlarını atmel studio 6.0 da derlettiğimde şöyle bi hata veriyo;

 
------ Build started: Project: pid, Configuration: Debug AVR ------
Build started.
Project "pid.cproj" (default targets):
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.targets" from project "C:\Users\BERKAY\Documents\Atmel Studio\pid\pid\pid.cproj" (target "Build" depends on it):
   Using "RunCompilerTask" task from assembly "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.Task.dll".
   Task "RunCompilerTask"
      C:\Program Files (x86)\Atmel\Atmel Studio 6.0\make\make.exe all
   Done executing task "RunCompilerTask" -- FAILED.
Done building target "CoreBuild" in project "pid.cproj" -- FAILED.
Done building project "pid.cproj" -- FAILED.

Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========


hatanın hangi satırda olduğunu söylemediği için bi türlü anlayamadım.


/*
* pid.c
*
* Created: 04.04.2014 16:08:59
*  Author: BERKAY
*/


#ifndef F_CPU
#define F_CPU 1000000UL
#endif

#include <avr/io.h>

#include <util/delay.h >
#include <avr/interrupt.h >
#include "lcd16.h"

#define P_GAIN 0.8
#define I_GAIN 0.005
#define D_GAIN 0.01

volatile int set_rpm = 0,previous_error = 0;
volatile int error, feedback_rpm, output;
volatile int D_error = 0, I_error = 0;

volatile int sayac,pulses=0;

void timer2_init(){

TCCR2=0X07;
TCNT2=0;
TIMSK=(1<<TOIE2);
sei();
sayac=0;

}

void init_pwm(){

// Fast PWM mode - 16bit , Fixed frequency , Non- Inverting mode , TOP = ICR1 = 259
// Frequency = F_CPU/(N*(1+TOP) = 60Hz , N = 64
// Duty cycle set by OCR1A and OCR1B

TCCR1A|=(1<<WGM10)|(1<<WGM11)|(1<<COM1A1);
TCCR1B|=(1<<CS10)|(1<<CS11);

ICR1 = 259;
TCNT1 = 0;
OCR1A = 0;

}

ISR(TIMER2_OVF_vect){

sayac++;

TCNT2=0;

}

ISR(INT1_vect){

pulses++;

}

void kesme(){

MCUCR|=(1<<ISC10)|(1<<ISC11);
GICR|=(1<<INT1);
sei();

}


void cont(){

feedback_rpm = pulses;

gotoXy(4,1);
integerToLcd(feedback_rpm);

pulses=0;
TCNT2=0;
sayac=0;

}



int main(){

DDRB = 0xff;
DDRD&=~(1<<4)|(1<<5)|(1<<6)|(1<<7);


timer2_init();
init_pwm();
kesme();
lcdInit();

lcdcmd(1);

// kütüphanede(lcd16.h) RW =0X04 EN=0X08 OLUCAK OC1A BACAĞINI KULLANMAK İÇİN

previous_error = set_rpm - feedback_rpm;

gotoXy(0,0);
prints("SET RPM:");
gotoXy(0,1);
prints("RPM:");
gotoXy(8,1);
prints("OUT:");

while(1){

if(bit_is_set(PIND,4)){ // set_rpm ayarlama

while(bit_is_set(PIND,4)){

if(bit_is_set(PIND,6)){ // rpm arttırma

while(bit_is_set(PIND,6)){

set_rpm++;
gotoXy(9,0);
integerToLcd(set_rpm);
_delay_ms(80);

}
}

else if(bit_is_set(PIND,7)){  // rpm azaltma

while(bit_is_set(PIND,7)){

set_rpm--;
gotoXy(9,0);
integerToLcd(set_rpm);
_delay_ms(80);

if(set_rpm<=0)
set_rpm=0;

}
}



}
}

else if(bit_is_set(PIND,5)){  // PID KONTROL

while(1){

if (sayac>=3){

if(TCNT2>=211){

cont();

}

}


error = set_rpm - feedback_rpm;
I_error += (error);
D_error = (error - previous_error);

output = (P_GAIN * error) + (I_GAIN * I_error) + (D_GAIN * D_error);

previous_error = error;

if(OCR1A + output > 259){
OCR1A= 259;
gotoXy(12,1);
integerToLcd(output);
}
else if(OCR1A + output < 0){
OCR1A= 0;
gotoXy(12,1);
integerToLcd(output);
}
else{
OCR1A += output;
gotoXy(12,1);
integerToLcd(output);
}


}
}



} //End of while
return 0;
}