עבור לתוכן

IF שלא עובד בKeil בעבודה עם 8051

Featured Replies

פורסם

u8 temp_menu()
{
u8 data i=0;
u8 code select[]="Please Select Option:";
u8 code options[]="[1] Sensor #1 [2] Sensor #2";
u8 code options1[]="[3] Sensor #3 [4] Avrg temp";
u8 code options2[]="[5] Repeat menu";
lcd_setup();
delay_lcd();
start: do
{
for (i = 0 ; select[i] ; i++)
lcd_write(select[i]);//write message on display - "Please Select Option:"
for (i = 0 ;i<2;i++)
delay(700000);
lcd_clear();
delay_lcd();
for (i = 0 ; options[i] ; i++)
lcd_write(options[i]);//write message on display
for (i = 0 ;i< 2;i++)
delay(700000);
lcd_clear();
delay_lcd();
for (i = 0 ; options1[i] ; i++)
lcd_write(options1[i]);//write message on display
for (i = 0 ;i< 2;i++)
delay(700000);
lcd_clear();
delay_lcd();
for (i = 0 ; options2[i] ; i++)
lcd_write(options2[i]);//write message on display
for (i = 0 ;i< 2;i++)
delay(700000);
do
{
key=0;
read_key();
if(key==0x35)
{
lcd_clear();
delay_lcd();
goto start;
}
}while(!key);//while
lcd_clear();
delay_lcd();

return (ps2ASCII2[key]);
}while(1);

הIF שאחראי על החזרה לתחילת הפונקציה פשוט לא עובד לי למרות שבפונקציה אחרת הוא כן בדיוק באותה הצורה, ואני מתחרפן מזה!

בנוסף, אם יש דרך ליישם את אותו הדבר בצורה אחרת אשמח גם לדעת.

תודה!

פורסם

עקרונית ניתן לממש בדרך אחרת ע"י שימוש בלולאה חיצונית נוספת ומילת המפתח CONTINUE.

ניסת לדבג את זה?

אני מניח שהגדרת את key בתור גלובלי.

פורסם

האם key מוגדר כvolatile ?

פורסם
  • מחבר

תשובות לכולם.

דיבגתי את זה, וכפי שזה נראה זה פשוט לא נכנס לתוך הIF ולכן לא חוזר לתחילת הקובץ בעצם.

הKEY הוא גלובלי כמובן.

כרגע בעזרת חבר אני מנסה לבצע את המימוש הזה בעזרת לולאה :) ונתקלתי בעוד בעיה, רק שזה יהיה כמעט ובלתי אפשרי להסביר אותה פה. אנסה לפתור את זה לבד בצורה יצירתית :)

תודה לכולם על העזרה :yelclap:

פורסם
  • מחבר

טוב, אז אחרי ששיניתי את הצורה בה אני מיישם את הפעולה, שיניתי את הלולאה החיצונית, והלולאה החיצונית פשוט לא עובדת, למרות שהתנאי מתקיים, יש יציאה מהלולאה ואין חזרה לתחילתה.

ניסתי לדבג וזה המצב, ולא משנה מה זה יוצא מהלולאה , הלולאה עובדת בעצם רק כאשר אני משווה key לkey.

העניין הוא שיש לי באותו הפרוייקט כמעט אותו הקובץ, זאת אומרת השינויים היחידים שיש לי בו זה המחרוזות, והוא מתפקד כמו שצריך, ורק בקובץ הזה נוצרת בעיה.

u8 temp_menu()
{
u8 data i=0;
u8 code select[]="Please Select Option:";
u8 code options[]="[1] Sensor #1 [2] Sensor #2";
u8 code options1[]="[3] Sensor #3 [4] Avrg temp";
u8 code options2[]="[5] Repeat menu";
lcd_setup();
delay_lcd();
do
{
for (i = 0 ; select[i] ; i++)
lcd_write(select[i]);//write message on display - "Please Select Option:"
for (i = 0 ;i<2;i++)
delay(700000);
lcd_clear();
delay_lcd();
for (i = 0 ; options[i] ; i++)
lcd_write(options[i]);//write message on display
for (i = 0 ;i< 2;i++)
delay(700000);
lcd_clear();
delay_lcd();
for (i = 0 ; options1[i] ; i++)
lcd_write(options1[i]);//write message on display
for (i = 0 ;i< 2;i++)
delay(700000);
lcd_clear();
delay_lcd();
for (i = 0 ; options2[i] ; i++)
lcd_write(options2[i]);//write message on display
for (i = 0 ;i< 2;i++)
delay(700000);

key = 0;
while(!key)
read_key();//while - dor
lcd_clear();
delay_lcd();

}while(key==0x35);

return (ps2ASCII2[key]);
}

HELP :s05:

פורסם

שינית בדיבאג את ערכו של KEY ל0X35?

פורסם
  • מחבר

למה הכוונה שיניתי את הkey ל35? את הנתונים אני קולט דרך מקלדת PS2 רגילה. ה0x35 זה 5 במקלדת.

פורסם

הוא התכוון שבזמן הדיבג לפני הכניסה לתנאי תנסה לשנות את ערכו של המשתנה key ל 0x35 כדי לראות אם הבעיה בהשמה של הערך למשתנה (ז"א הפונקציה שקולטת תו מהמקלדת) או התנאי עצמו.

חזרה לשאלתי שלא זכתה למענה, האם key מוגדר כVolatile ?

פורסם
  • מחבר

טוב, עשיתי השמה אוטומטית של 0x35 בתוך הפונקציה לkey ונראה שהלולאה מתפקדת במקרה כזה, אז הבעיה היא בעצם בקליטת התו, רק שאני לא מבין מה הבעיה כי בפונקציה אחרת הקליטה מתפקדת.

ואין לי מושג מה זה Volatile, הוא מוגדר בתור extern

פורסם

מצבך לא טוב אם אתה לא יודע מה זה Volatile כשאתה עוסק בC למיקובקרים.

לפי מה שתארת אני די סבור שזו באמת הבעיה.

הקומפיילר עושה אופטימיזציה לקוד שלך ואם יש לך שם דברים מיותר ולא הגיונים הוא יודע להתעלם מהם.


key = 0;
while(!key)

כאן הקומפיילר חושב שkey תמיד יקבל את הערך 0 אז מה בעצם הטעם לעשות לולאה אין סופית שתבדוק שהוא לא 0 ?

הקומפיילר לא יודע שיש לך פסיקה (אני צודק ?) שתשנה את ערך המשתנה key מחוץ לקוד הנ"ל.

אתה צריך "ליידע" את הקומפיילר שהמשתנה key עלול להשתנות מחוץ לקוד המרכזי (ז"א ע"י פסיקה) כך שהקומפיילר לא יתעלם לעולם מבדיקת הערך key.

בשביל ליידע את הקומפיילר אתה צריך להשתמש במילה השמורה volatile בהגדרת המשתנה key.

אם לא הבנת את ההסבר שלי או שאתה רוצה עוד מידע בנושא כמו סינטקס מדוייק וכו' תחפש בגוגל: c volatile

פורסם
  • מחבר

איזה מזל שאני לא עוסק בבקרים מתוכנתים :silly:

זה רק פרוייקט קטן.

ממה שהבנתי מקריאה ברשת, להגדיר את המשתנה volatile בעצם מונע מהקומפיילר לעשות עליו אופטימיזציה והוא לא ישמור את הנתון ברגיסטר לשליפה מהירה.

הגדרתי את הkey בתור volatile איפה שהוא מופיע במקור, ועדיין הבעיה קיימת לצערי. :nixweiss:

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים