עבור לתוכן

הפעלת טיימר2 במיקרו בקר 89c52 איך עושים זאת? (צריך הסבר גם איך עובד הטיימר)

Featured Replies

פורסם
  • מחבר

מצטער אבל לא הבנתי,

אם אני מריץ רק את t2_init(); זה לא יצור השהייה של 1MS? כי ככה עשינו מקודם..

אם כן, אז למה פשוט אני לא יכול להריץ אותה כמה פעמים עם הסייקלס עליה?

  • תגובות 30
  • צפיות 4.6k
  • נוצר
  • תגובה אחרונה
פורסם

מה הקשר בין ההשהיה לבין הפונקציה t2_init() ? הפונקציה רק מאתחלת את הטיימר ומאפשרת את פסיקת הטיימר.

הפונקציה it_timer2() תבוצע כאשר טיימר 2 יגיע ל-FFFFH כלומר כל 1ms,והמונה count יקודם.

בפונקציה delay אתה בעצם קובע כמה פעמים count יקודם עד לסיום הפונקציה ובכך יוצר את ההשהיה.

פורסם
  • מחבר

אוקי הבנתי עכשיו בקשר לזה:

void delay(int cycles)
{
count=0;
while(count<cycles)
count=count;
count=0;
}

מתי הוא עושה את הפונקציה הזאת? כל פעם שהוא עובר 1MS זה מעלה ב 1 את ה count?

ולמה אתה מאפס את הcount בהתחלה? ובסוף? ממש לא הבנתי את הפונקציה הזאת..

הבנתי רק אם הcount קטן מהמחזורים אז count=count אבל אחרי זה count=0 לא הבנתי...

פורסם

count מקודם ב-1 בפונקציית הפסיקה כל 1ms.

לכן כאשר אתה קורא לפונקציה delay בשביל השהיה, יש צורך לאפס את count שהספירה תתחיל מ-0.

פורסם
  • מחבר

אוקי, לאחר שבדקתי את זה התוכנה לא עובדת..

אם רשמתי DELAY של 5000 זה עושה את זה תוך שניה ו-COUNT כן מגיע ל 5000 ומשהו.. אבל זה עושה את כל הפעולה הזאת תוך חצי שניה ..

מה יכולה להיות הבעיה?

פורסם

אוקי,הוספתי את המשתנה 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);
}

פורסם
  • מחבר

אבל COUNT כן סופר הוא מגיע ל 1000 אם אני רושם delay(1000) אבל הוא מגיע ממש מהר לזה כאילו אין השהיה של 1 מיקרו בין מחזור למחזור.

פורסם

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.

פורסם
  • מחבר

ניסיתי עם 5000..

שאני בודק את הערך של COUNT לפני שאני מריץ הוא 0

ושאני בודק אחרי ההרצה זה 5000 אבל הוא עושה את זה תוך חצי שניה...

פורסם

בדקת את הקוד האחרון?

פורסם
  • מחבר

הקוד האחרון רק מבדה ש COUNT יהיה 0 לפני שאני מתחיל לא?

אם כן אז בדקתי כבר והוא כן מתאפס כבר..

פורסם

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

אם לא הלך,אז כמו שאמרתי תשאל בפורום של ישראל וייל,שם יש הרבה שמתעסקים עם C51.

פורסם
  • מחבר

אוקי קלטתי מה הבעיה, חייב לאפס את הדגל TF2 אם לא הוא לא מתאפס לבד..

פורסם

אז הכול בסדר עכשיו?

פורסם
  • מחבר

כן :) תודה רבה לך!

ארכיון

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

דיונים חדשים