הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   מחפש הסבר מפורט לגבי פסיקות (interrupt) בC במעבד 8051 (https://hosts.co.il/forums/showthread.php?t=108421)

Haimz 08-02-15 19:38

מחפש הסבר מפורט לגבי פסיקות (interrupt) בC במעבד 8051
 
שלום,
אני מחפש ללמוד על פסיקות (interrupt) בשפת C במעבד 8051, אני צריך הסבר ממש מפורט,
מישהו יכול להפנות אותי למקור שיכול להסביר לי בנושא?
עדיפות לעברית, כמובן שגם אנגלית תתקבל

תודה רבה :)

while1 11-02-15 11:43

גוגל מלא במדריכים והסברים על נושא כ"כ מוכר ונפוץ.
מחיפוש קצר מצאתי לך את זה -
http://www.engineersgarage.com/tutor...pt-programming
זה נראה מעולה. מתחיל מהסבר על מה זה interrupt ולאט לאט מקשר איך עובדים עם זה בתוכנה ומלמד על כל האוגרים של זה.
(תשים לב שלמעלה בצד ימין יש תוכן עניינים לעבור בין הנושאים.)


אם יש לך שאלות או שמשהו לא ברור, אתה מוזמן לשאול כאן ואני אשמח לענות :)

Haimz 11-02-15 16:37

ציטוט:

נכתב במקור על ידי while1 (פרסם 894307)
גוגל מלא במדריכים והסברים על נושא כ"כ מוכר ונפוץ.
מחיפוש קצר מצאתי לך את זה -
http://www.engineersgarage.com/tutor...pt-programming
זה נראה מעולה. מתחיל מהסבר על מה זה interrupt ולאט לאט מקשר איך עובדים עם זה בתוכנה ומלמד על כל האוגרים של זה.
(תשים לב שלמעלה בצד ימין יש תוכן עניינים לעבור בין הנושאים.)


אם יש לך שאלות או שמשהו לא ברור, אתה מוזמן לשאול כאן ואני אשמח לענות :)

תודה רבה :) אני אעבור על זה מאוחר יותר, מאמין שזה מספיק

Haimz 11-02-15 20:44

ציטוט:

נכתב במקור על ידי while1 (פרסם 894307)
גוגל מלא במדריכים והסברים על נושא כ"כ מוכר ונפוץ.
אם יש לך שאלות או שמשהו לא ברור, אתה מוזמן לשאול כאן ואני אשמח לענות :)

שאלות קטנות :)

לפי הקוד שכאן: http://www.engineersgarage.com/tutor...ramming?page=5

1. לפי מה נקבע הזמן שלפיו הLED נדלק\נכבה ?
2. הבנתי (לא רק מהאתר הזה) שמשהו שקשור לזמנים\תדרים מתחלק ב12, מה זה ולמה?
3. מה התפקידים של TH0 , TL0 , TR0 ו TMOD
4. מה עושה, ולמה נכתב הקוד: sbit LED = P1^0; (בשורה 4)

תודה רבה בכל מקרה, אשמח אם מישהו יוכל לענות :)

while1 12-02-15 15:48

נתחיל בהסבר כללי,

לכל מעבד/בקר יש גביש (מתנד) = רכיב שיוצר תדר קבוע, וקובע את קצב העבודה.

C51 עובד על מיקרו-בקר 8051 שאליו מחובר (בדוגמא הזאת) גביש שמייצר תדר של 11.0592MHz.
משמע, הוא מייצר בערך 11 מיליון פולסים בשניה.

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

לפעולות שונות בבקר נדרשים מספר מחזורי מכונה.
אבל לטיימרים המספר הזה קבוע, ואנחנו יודעים שהוא 1.
זה אומר שבכל 12 פולסים של הגביש (= מחזור מכונה אחד), הטיימר יתקדם פעם אחת.

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

קוד:

11,059,000 / 12 = 921,583Hz
משמע, הטיימר יפעל 921,583 פעמים בשניה. כלומר, אם היינו סופרים מ0 - אז תוך שניה היינו מגיעים ל921,583.

כדי לדעת תוך כמה זמן מתבצעת ספירה יחידה, נחשב:

קוד:

1 / 921,583 = 1.08u(=micro) s
כלומר, בערך כל 1 מיקרו-שניה הטיימר יתקדם ב1.

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

TMOD = אוגר שמכיל את אופן פעולת הטיימרים.
ב8051 אפשר להפעיל 2 טיימרים בשיטות פעולה שונות.
בקוד הגדירו את האוגר הזה עם הערך 0x01 כלומר הכניסו את טיימר0 למצב פעולה 1.
מצב זה קובע שהטיימר ידע לספור ערכים בגודל של 16 סיביות ואז יעצר, עד שיפעילו אותו מחדש או יכניסו לו ערך חדש לספירה.
**הספירה מתבצעת כלפי מעלה, זה אומר שבכל ספירה הטיימר יתקדם +1. (ולא כלפי מטה עד 0 כמו שרגילים לחשוב).

TH0 ו TH1 = קובעים את הערך שבו נמצא טיימר0.
בגלל שאנחנו במצב פעולה 1, יש 16 סיביות ולכן כל אחד מהאוגרים הללו אחראי על 8 מהן.
בקוד הגדירו:
קוד:

TH0 = 0xFC;
TL0 = 0x66;

לכן, הערך ההתחלתי של הטיימר יהיה FC66. (בבסיס 16=הקסאדצימלי)
(שווה ערך ל 64614 עשרוני או 1111110001100110 בינארי)

וברגע שנפעיל את הטיימר, הוא ימנה עד הערך העליון - FFFF שהוא 65535.

ואז.. מגיע הרגע המיוחל :)
TR0 = 1 = מפעיל את טיימר0 וגורם לו להתחיל לספור! :D

איך נקבע הזמן שלפיו הלד נדלק/נכבה -

אנחנו יודעים שהטיימר סופר עכשיו מ64614 עד ל 65535, כלומר הוא יספור 921 פעמים.
**רק אחרי שהוא מגיע לערך העליון הוא קורא לפונקציה של הפסיקה**

נכפיל את זה בזמן שלוקח לו להשלים ספירה יחידה =

קוד:

921 x 1.08u = ~ 0.001s
משמע, בכל אלפית שניה הוא יסיים לספור, יקרא לפונקציה והלד ידלק/יכבה.

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

** אני חייב להגיד שהתוצאה שיצאה היא ממש מוזרה, אני לא מבין מה הפואנטה לתת דוגמא ללד שמהבהב כל אלפית-שניה = אי אפשר לראות את התוצאה הזאת בעין = מבחינתך הלד יראה כאילו הוא דלוק כל הזמן **


תוכל לראות כל מה שהסברתי (ועוד), כאן - http://www.engineersgarage.com/tutor...mming-tutorial


בנוגע ל P1^0, אם אני זוכר נכון זה פונה לכתובת של הסיבית הספציפית (0) בפורט P1.

Haimz 12-02-15 21:37

ציטוט:

נכתב במקור על ידי while1 (פרסם 894321)
נתחיל בהסבר כללי,

לכל מעבד/בקר יש גביש (מתנד) = רכיב שיוצר תדר קבוע, וקובע את קצב העבודה.

C51 עובד על מיקרו-בקר 8051 שאליו מחובר (בדוגמא הזאת) גביש שמייצר תדר של 11.0592MHz.
משמע, הוא מייצר בערך 11 מיליון פולסים בשניה.

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

לפעולות שונות בבקר נדרשים מספר מחזורי מכונה.
אבל לטיימרים המספר הזה קבוע, ואנחנו יודעים שהוא 1.
זה אומר שבכל 12 פולסים של הגביש (= מחזור מכונה אחד), הטיימר יתקדם פעם אחת.

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

קוד:

11,059,000 / 12 = 921,583Hz
משמע, הטיימר יפעל 921,583 פעמים בשניה. כלומר, אם היינו סופרים מ0 - אז תוך שניה היינו מגיעים ל921,583.

כדי לדעת תוך כמה זמן מתבצעת ספירה יחידה, נחשב:

קוד:

1 / 921,583 = 1.08u(=micro) s
כלומר, בערך כל 1 מיקרו-שניה הטיימר יתקדם ב1.

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

TMOD = אוגר שמכיל את אופן פעולת הטיימרים.
ב8051 אפשר להפעיל 2 טיימרים בשיטות פעולה שונות.
בקוד הגדירו את האוגר הזה עם הערך 0x01 כלומר הכניסו את טיימר0 למצב פעולה 1.
מצב זה קובע שהטיימר ידע לספור ערכים בגודל של 16 סיביות ואז יעצר, עד שיפעילו אותו מחדש או יכניסו לו ערך חדש לספירה.
**הספירה מתבצעת כלפי מעלה, זה אומר שבכל ספירה הטיימר יתקדם +1. (ולא כלפי מטה עד 0 כמו שרגילים לחשוב).

TH0 ו TH1 = קובעים את הערך שבו נמצא טיימר0.
בגלל שאנחנו במצב פעולה 1, יש 16 סיביות ולכן כל אחד מהאוגרים הללו אחראי על 8 מהן.
בקוד הגדירו:
קוד:

TH0 = 0xFC;
TL0 = 0x66;

לכן, הערך ההתחלתי של הטיימר יהיה FC66. (בבסיס 16=הקסאדצימלי)
(שווה ערך ל 64614 עשרוני או 1111110001100110 בינארי)

וברגע שנפעיל את הטיימר, הוא ימנה עד הערך העליון - FFFF שהוא 65535.

ואז.. מגיע הרגע המיוחל :)
TR0 = 1 = מפעיל את טיימר0 וגורם לו להתחיל לספור! :D

איך נקבע הזמן שלפיו הלד נדלק/נכבה -

אנחנו יודעים שהטיימר סופר עכשיו מ64614 עד ל 65535, כלומר הוא יספור 921 פעמים.
**רק אחרי שהוא מגיע לערך העליון הוא קורא לפונקציה של הפסיקה**

נכפיל את זה בזמן שלוקח לו להשלים ספירה יחידה =

קוד:

921 x 1.08u = ~ 0.001s
משמע, בכל אלפית שניה הוא יסיים לספור, יקרא לפונקציה והלד ידלק/יכבה.

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

** אני חייב להגיד שהתוצאה שיצאה היא ממש מוזרה, אני לא מבין מה הפואנטה לתת דוגמא ללד שמהבהב כל אלפית-שניה = אי אפשר לראות את התוצאה הזאת בעין = מבחינתך הלד יראה כאילו הוא דלוק כל הזמן **


תוכל לראות כל מה שהסברתי (ועוד), כאן - http://www.engineersgarage.com/tutor...mming-tutorial


בנוגע ל P1^0, אם אני זוכר נכון זה פונה לכתובת של הסיבית הספציפית (0) בפורט P1.

תודה רבה לך, לא הייתי מוצא הסבר מפורט יותר !! :)


כל הזמנים הם GMT +2. הזמן כעת הוא 23:22.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ