פורסם 2008 בינואר 2717 שנים מחבר מצטער אבל לא הבנתי,אם אני מריץ רק את t2_init(); זה לא יצור השהייה של 1MS? כי ככה עשינו מקודם..אם כן, אז למה פשוט אני לא יכול להריץ אותה כמה פעמים עם הסייקלס עליה?
פורסם 2008 בינואר 2717 שנים מה הקשר בין ההשהיה לבין הפונקציה t2_init() ? הפונקציה רק מאתחלת את הטיימר ומאפשרת את פסיקת הטיימר.הפונקציה it_timer2() תבוצע כאשר טיימר 2 יגיע ל-FFFFH כלומר כל 1ms,והמונה count יקודם.בפונקציה delay אתה בעצם קובע כמה פעמים count יקודם עד לסיום הפונקציה ובכך יוצר את ההשהיה.
פורסם 2008 בינואר 2717 שנים מחבר אוקי הבנתי עכשיו בקשר לזה:void delay(int cycles){count=0; while(count<cycles) count=count;count=0;}מתי הוא עושה את הפונקציה הזאת? כל פעם שהוא עובר 1MS זה מעלה ב 1 את ה count?ולמה אתה מאפס את הcount בהתחלה? ובסוף? ממש לא הבנתי את הפונקציה הזאת..הבנתי רק אם הcount קטן מהמחזורים אז count=count אבל אחרי זה count=0 לא הבנתי...
פורסם 2008 בינואר 2717 שנים count מקודם ב-1 בפונקציית הפסיקה כל 1ms.לכן כאשר אתה קורא לפונקציה delay בשביל השהיה, יש צורך לאפס את count שהספירה תתחיל מ-0.
פורסם 2008 בינואר 2817 שנים מחבר אוקי, לאחר שבדקתי את זה התוכנה לא עובדת..אם רשמתי DELAY של 5000 זה עושה את זה תוך שניה ו-COUNT כן מגיע ל 5000 ומשהו.. אבל זה עושה את כל הפעולה הזאת תוך חצי שניה ..מה יכולה להיות הבעיה?
פורסם 2008 בינואר 2817 שנים אוקי,הוספתי את המשתנה b,שיהיה ב-1 רק כאשר יש קריאה להשהיה ואז count יתחיל לספור.תבדוק עכשיו.#include "reg_c51.h"#include <stdio.h>int count,b;void t2_init(){b=0;count=0;T2CON=0x01;EA=1; ET2=1; TH2=0xFC; TL2=0x17; TR2=1; }void it_timer2(void) interrupt 5 {TH2=0xFC; TL2=0x17;if(b) count++;}void delay(int cycles){count=0;b=1; while(count<cycles) count=count;b=0;}void main(){t2_init();while(1);}
פורסם 2008 בינואר 2817 שנים מחבר אבל COUNT כן סופר הוא מגיע ל 1000 אם אני רושם delay(1000) אבל הוא מגיע ממש מהר לזה כאילו אין השהיה של 1 מיקרו בין מחזור למחזור.
פורסם 2008 בינואר 2817 שנים 1 מילי אתה מתכוון.יש לי הרגשה שהטיימר פשוט לא נטען מחדש,אז ,תנסה לעצור אותו,לטעון שוב,ולהפעיל מחדש.תרשום בdelay ערך גבוה נגיד 5000.#include "reg_c51.h"#include <stdio.h>int count,b;void t2_init(){b=0;count=0;T2CON=0x01;EA=1; ET2=1; TH2=0xFC; TL2=0x17; TR2=1; }void it_timer2(void) interrupt 5 {TR2=0;TH2=0xFC; TL2=0x17;TR2=1;if(b) count++;}void delay(int cycles){count=0;b=1; while(count<cycles) count=count;b=0;}void main(){t2_init();while(1);}אם זה לא עובד,אז תשאל בפורום של ישראל וייל,אולי מישהו יודע איך עושים את זה ב-C51.
פורסם 2008 בינואר 2817 שנים מחבר ניסיתי עם 5000..שאני בודק את הערך של COUNT לפני שאני מריץ הוא 0ושאני בודק אחרי ההרצה זה 5000 אבל הוא עושה את זה תוך חצי שניה...
פורסם 2008 בינואר 2817 שנים מחבר הקוד האחרון רק מבדה ש COUNT יהיה 0 לפני שאני מתחיל לא?אם כן אז בדקתי כבר והוא כן מתאפס כבר..
פורסם 2008 בינואר 2817 שנים בקוד האחרון קודם עצרתי את הטיימר לפני טעינתו מחדש,קשה לי להאמין שזה מה שגורם לבעיה,אבל תנסה לבדוק בכל זאת.אם לא הלך,אז כמו שאמרתי תשאל בפורום של ישראל וייל,שם יש הרבה שמתעסקים עם C51.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.