הפעלת טיימר2 במיקרו בקר 89c52 איך עושים זאת? (צריך הסבר גם איך עובד הטיימר) - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


tom123

Recommended Posts

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

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

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

קישור לתוכן
שתף באתרים אחרים

  • תגובות 30
  • נוצר
  • תגובה אחרונה

מה הקשר בין ההשהיה לבין הפונקציה 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 לא הבנתי...

קישור לתוכן
שתף באתרים אחרים

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

אם רשמתי 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);
}

קישור לתוכן
שתף באתרים אחרים

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.

קישור לתוכן
שתף באתרים אחרים

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

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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


×
  • צור חדש...