| מחבר | הודעה |
|---|
מוליכים למחצה
הצטרפה ב: 04 Apr 2003 הודעות: 294 עזר: 3 מיקום: צרפת
| 27 אפריל 2005 18:02 פסק זמן ב 89C51/89C52 | | |
|
| אני מוקצה תרגיל לתוכנית AT89C51 לפרויקט דלת אוטומטית.
אני בבעיה: TIMEOUT
אם החיישן מזהה אנשים כניסה החיצוני, היא תפתח את הדלת ההמתנה חיישן פנימי מזהה אנשים זמין. אחרי שנות ה -20, אם לא אות מזוהה, זה באופן אוטומטי לסגור את הדלת לחזור לתחילת התוכנית (ממתינים לאות מן הדלת החיצונית.
עם AT89C51, אני תכנות ב-C אבל אני לא יודע איך לעצב TIMEOUT אלגוריתם עם AT89C51 (20 שניות).
מישהו יכול להמליץ לי פתרונות? |
|
| לראש הדף | |
 |
IanP
הצטרף: 05 Oct 2004 הודעות: 6490 עזר: 1542 מיקום: West Coast
| 28 אפריל 2005 1:25 Re: פסק זמן ב 89C51/89C52 | | |
|
| השתמש TIMER1 ב MODE1 (16-bit counter) לספור (Fclock/12): FFFFh. אם גביש 11.0952MHz של הפסיקה היא תתרחש בכל (11095200/12) / 65536 = 14,108 .. פעמים בשנייה. צור TimeH משתנה TimeL. הגדל TimeHTimeL בכל להפריע. 20 שניות להגיע תצטרך ≈ 282 קוטע וכי יעזבו את TimeHTimeL = 01 1A (ש) = 0282 (ד). עכשיו אתה יכול לאפס 20s הדלפק (TimeHTimeL) ולבצע את מה שצריך לעשות אחרי ה -20 ..
מזל טוב .. |
|
| לראש הדף | |
 |
mrcube_ns
הצטרף: 10 אפריל 2002 הודעות: 429 עזר: 11 מיקום: הצד האפל של הירח
| 28 אפריל 2005 21:17 Re: פסק זמן ב 89C51/89C52 | | |
|
| IanP הוא צודק לחלוטין,
אבל, אני מציע להשתמש 12MHz גביש, כך מחזור אחד הוא 1us.
ואז, אתה משתמש טיימר 1 כמו שעון 16-bit ו גרם 50ms טיימר (T1H = 0x3C T1L = 0xAF), אז יש לך 20 שקובע באחד השני 20sec => כדי עשיר אתה צריך בדיוק 400 נחשב.
בברכה,
Mr.Cube |
|
| לראש הדף | |
 |
Google AdSense

| 28 אפריל 2005 21:17 מודעות | | |
|
|
|
|
| לראש הדף | |
 |
גיבור
הצטרף: 06 Mar 2002 הודעות: 145 עזר: 2
| 29 אפריל 2005 3:51 Re: פסק זמן ב 89C51/89C52 | | |
|
| הי,
עבור תקופת זמן שאתה צריך sotware הדלפק.
השתמש הדלפק חומרה 16-bit עבור הדור intterupt תקופתיים.
שירות לקטוע את שגרת להגדיר משתנה CNT_FLAG.
CNT_FLAG char חתום; cnt ארוך חתום; TIMEOUT char חתום; char חתום TIMEOUT_ENABLED;
# define TIMEOUT_THRESHOLD 1024
interrupt_routine הריק () ( CNT_FLAG = 1; )
void main () ( init ();
זמן (1) ( ... cnt_process (); לישון (); / / ללכת לישון במצב ) )
cnt_process הריק () ( אם (CNT_FLAG) ( CNT_FLAG = 0; אם (TIMEOUT_ENABLED) ( אם (cnt <TIMEOUT_THRESHOLD) cnt ; Timeout = (cnt == TIMEOUT_THRESHOLD); ) ) )
כאשר מגיעים cnt TIMEOUT_THRESHOLD TIMEOUT יוגדר.
פתרון נוסף הוא תוספת cnt לקטוע את השגרה
interrupt_routine הריק () ( אם (TIMEOUT_ENABLED) ( אם (cnt <TIMEOUT_THRESHOLD) cnt ; Timeout = (cnt == TIMEOUT_THRESHOLD); ) ) |
|
| לראש הדף | |
 |