|
ايه يا بشمهندس حسن هادي محمود
انا رفعتلك الفولدر على موقع تانى ومنتظر ردك على احر من الجمر
|
السلام عليكم
هو كود فيه مجموعه من الاخطاء
1- استعمال الرام بشكل كبير وخصوصا في هذا النوع من البيك سوف يسبب مشاكل كبيره جدا لذا لاتحاول خزن الرسائل في رام لاني لاحظته لايستجيب لبعض الاوامر
شاهد الكود المعدل
2- عند التعامل مع IF وكنت قد وضعت مجموعه من شروط يستوجب تحقيق احداها عند ذلك أستخدم else لكي لاينفذ مايكرو سوى شرط واحد فقط
3- هناك مشكله في داله if وهي عند التعامل مع قيمه متغيره يعني انلوك يفضل عدم ذكر علامه =
يعني انت تقول اذا درجه حراره بين 25 و 30 نفذ كذا اذن لاتقول اذا درجه حراره==25 واصغر من 30 نفذ كذا فهذا خطأ لانه قد لاتكون درجه حراره =25 وانما مثلا 25.1 عندها لاينفذ شرط أطلاقا
في مثل هذه حالات (( انلوك بشكل عام )) هو تقول اذا كانت درجه حراره اكبر او تساوي 25 واصغر من 30 نفذ كذا
4- لاتحاول استعمل متغيرات من نوع int وانت تعرف ان هذه متغيرات قيمهم لاتتجاوز 255 يعني حاول توفير في رام
على عموم هذا هو كود معدل (( طبعا يحتاج تعديل في كود سويج ولكن حاليا جرب الكود وبعدها نكمل التعديل في كود سويج ))
ايضا هناك تعديل مهم هو ايقاف محرك يجب قطع كهرباء عنه بالكامل
على عموم سوف يتم تعديل على هاتين فقرتين لاحقا بعد تجربه هذا الكود
كود:
// Lcd pinout settings
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// variables
float temp , act_temp ;
char disp[15], i, flag = 0 , flag_message=0;
int duty;
char txt[17],x;
const char *message_duty="Duty cycle=";
void display_message( float kk )
{
lcd_out(2,12," ");
for(x=0;x<11;x++)txt[x]=message_duty[x];
txt[11]=0;
FloatToStr(kk,disp);
disp[4]=0;// reset pointer
strcat(txt,disp );
txt[15]=0;
lcd_out(2,1,txt);
lcd_chr_cp('%');
}
void main()
{
trisa = 1; trisb = 0; trisc = 0; trisd = 1; trise = 0;
porta = 0; portb = 0; portc = 0; portd = 0; porte = 0;
adcon1= 0b11011110 ; //initialize A0 as analog input
// LCD instruction
Lcd_Init();
Lcd_cmd(_Lcd_cursor_off);
Lcd_out( 1, 1, "temp = ");
PWM1_Init(5000); //initialise PWM1 at 5KHz
while(1) // start infinit loop
{
// temperature reading & calculation
temp = ADC_Read(0);
act_temp = (temp * 500) / 1024;
floattostr(act_temp, disp); //converting float to char
disp[4]=0;
Lcd_out(1, 8,disp);
portc.f0 = 1; //signal to motor forward direction
// PWM orders
if (act_temp >= 25 && act_temp <30 )
{
PWM1_Start(); PWM1_Set_Duty(32);
if(flag_message.b0==0)display_message(12.5);
flag_message=0x01;
}
else if (act_temp >=30 && act_temp <35 )
{
PWM1_Start(); PWM1_Set_Duty(64);
if(flag_message.b1==0)display_message(25);
flag_message=0x02;
}
else if (act_temp >= 35 && act_temp <40 )
{
PWM1_Start(); PWM1_Set_Duty(96);
if(flag_message.b2==0)display_message(37.5);
flag_message=0x04;
}
else if (act_temp >= 40 && act_temp <45 )
{
PWM1_Start(); PWM1_Set_Duty(127);
if(flag_message.b3==0)display_message(50);
flag_message=0x08;
}
else if (act_temp >= 45 && act_temp <50 )
{
PWM1_Start(); PWM1_Set_Duty(159);
if(flag_message.b4==0)display_message(62.5);
flag_message=0x10;
}
else if (act_temp >= 50 && act_temp <55 )
{
PWM1_Start(); PWM1_Set_Duty(191);
if(flag_message.b5==0)display_message(75);
flag_message=0x20;
}
else if (act_temp >= 55 && act_temp <60 )
{
PWM1_Start(); PWM1_Set_Duty(223);
if(flag_message.b6==0)display_message(87.5);
flag_message=0x40;
}
else if (act_temp >= 60 )
{
PWM1_Start(); PWM1_Set_Duty(255);
if(flag_message.b6==0)display_message(100);
flag_message=0x40;
}
if (portd.f0 == 1) flag = 1;
if (portd.f0 == 0 && flag == 1) // if the push button is pushed
{
i++;
PWM1_Start(); //start PWM1
duty = (i*255)/8 ;
if(duty>=255)duty=255;
PWM1_Set_Duty(duty); // set duty cycle from 25% to 100%
display_message((duty*100)/255);
flag=0;
delay_ms(250);
}
if (i == 9 || act_temp < 25)
{
i = 0 ;
PWM1_Stop();
Lcd_out( 2, 1," STOP ");
}
} //end loop
} //end main