פורסם 2012 ביוני 2113 שנים 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 שאחראי על החזרה לתחילת הפונקציה פשוט לא עובד לי למרות שבפונקציה אחרת הוא כן בדיוק באותה הצורה, ואני מתחרפן מזה!בנוסף, אם יש דרך ליישם את אותו הדבר בצורה אחרת אשמח גם לדעת.תודה!
פורסם 2012 ביוני 2213 שנים עקרונית ניתן לממש בדרך אחרת ע"י שימוש בלולאה חיצונית נוספת ומילת המפתח CONTINUE.ניסת לדבג את זה?אני מניח שהגדרת את key בתור גלובלי.
פורסם 2012 ביוני 2313 שנים מחבר תשובות לכולם. דיבגתי את זה, וכפי שזה נראה זה פשוט לא נכנס לתוך הIF ולכן לא חוזר לתחילת הקובץ בעצם. הKEY הוא גלובלי כמובן. כרגע בעזרת חבר אני מנסה לבצע את המימוש הזה בעזרת לולאה ונתקלתי בעוד בעיה, רק שזה יהיה כמעט ובלתי אפשרי להסביר אותה פה. אנסה לפתור את זה לבד בצורה יצירתית תודה לכולם על העזרה
פורסם 2012 ביוני 2313 שנים מחבר טוב, אז אחרי ששיניתי את הצורה בה אני מיישם את הפעולה, שיניתי את הלולאה החיצונית, והלולאה החיצונית פשוט לא עובדת, למרות שהתנאי מתקיים, יש יציאה מהלולאה ואין חזרה לתחילתה.ניסתי לדבג וזה המצב, ולא משנה מה זה יוצא מהלולאה , הלולאה עובדת בעצם רק כאשר אני משווה 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:
פורסם 2012 ביוני 2413 שנים מחבר למה הכוונה שיניתי את הkey ל35? את הנתונים אני קולט דרך מקלדת PS2 רגילה. ה0x35 זה 5 במקלדת.
פורסם 2012 ביוני 2413 שנים הוא התכוון שבזמן הדיבג לפני הכניסה לתנאי תנסה לשנות את ערכו של המשתנה key ל 0x35 כדי לראות אם הבעיה בהשמה של הערך למשתנה (ז"א הפונקציה שקולטת תו מהמקלדת) או התנאי עצמו.חזרה לשאלתי שלא זכתה למענה, האם key מוגדר כVolatile ?
פורסם 2012 ביוני 2413 שנים מחבר טוב, עשיתי השמה אוטומטית של 0x35 בתוך הפונקציה לkey ונראה שהלולאה מתפקדת במקרה כזה, אז הבעיה היא בעצם בקליטת התו, רק שאני לא מבין מה הבעיה כי בפונקציה אחרת הקליטה מתפקדת.ואין לי מושג מה זה Volatile, הוא מוגדר בתור extern
פורסם 2012 ביוני 2413 שנים מצבך לא טוב אם אתה לא יודע מה זה Volatile כשאתה עוסק בC למיקובקרים.לפי מה שתארת אני די סבור שזו באמת הבעיה.הקומפיילר עושה אופטימיזציה לקוד שלך ואם יש לך שם דברים מיותר ולא הגיונים הוא יודע להתעלם מהם. key = 0; while(!key) כאן הקומפיילר חושב שkey תמיד יקבל את הערך 0 אז מה בעצם הטעם לעשות לולאה אין סופית שתבדוק שהוא לא 0 ?הקומפיילר לא יודע שיש לך פסיקה (אני צודק ?) שתשנה את ערך המשתנה key מחוץ לקוד הנ"ל.אתה צריך "ליידע" את הקומפיילר שהמשתנה key עלול להשתנות מחוץ לקוד המרכזי (ז"א ע"י פסיקה) כך שהקומפיילר לא יתעלם לעולם מבדיקת הערך key.בשביל ליידע את הקומפיילר אתה צריך להשתמש במילה השמורה volatile בהגדרת המשתנה key.אם לא הבנת את ההסבר שלי או שאתה רוצה עוד מידע בנושא כמו סינטקס מדוייק וכו' תחפש בגוגל: c volatile
פורסם 2012 ביוני 2413 שנים מחבר איזה מזל שאני לא עוסק בבקרים מתוכנתים זה רק פרוייקט קטן. ממה שהבנתי מקריאה ברשת, להגדיר את המשתנה volatile בעצם מונע מהקומפיילר לעשות עליו אופטימיזציה והוא לא ישמור את הנתון ברגיסטר לשליפה מהירה. הגדרתי את הkey בתור volatile איפה שהוא מופיע במקור, ועדיין הבעיה קיימת לצערי.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.