הלו טייני #2: הגדרת שעון

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

מיקרו-בקרים מדגם ATtiny85 עם שעון כיס
מיקרו-בקרים מדגם ATtiny85 עם שעון כיס

כמובן, הפעולות שמתבצעות במיקרו-בקר תלויות בתנועה של אלקטרונים בתוך החומרה, והתנועה הזו לוקחת זמן "ממשי" וגם יוצרת חום – שני אלמנטים שמציבים גבול עליון למהירות הפעולה. אף על פי כן, השעון במיקרו-בקרים רבים הוא אלמנט גמיש להפליא, הרבה יותר ממה שניתן לחשוב בעקבות עבודה בסיסית עם ארדואינו למשל. בפוסט זה אציג אפשרויות שעון שונות של ה-ATtiny85, מה הן נותנות לנו ואיך ניגשים אליהן. כמעט כל המידע, אגב, רלוונטי גם למיקרו-בקרים אחרים בארכיטקטורת AVR.

מקורות השעון

יש שישה(!) מקורות אפשריים לשעון עבור ה-ATtiny85, לכל אחד מהם יתרונות וחסרונות:

מקורתדרדיוקפינים נדרשים
מתנד חיצוניעד 20MHzתלוי באיכות המתנד2
מתנד חיצוני בתדר נמוך32.768KHzתלוי באיכות המתנד2
שעון PLL פנימי16MHzנמוך-בינוני*, לא יציב**0
מתנד פנימי8MHzנמוך-בינוני*, לא יציב**0
מתנד Watchdog פנימי128KHzנמוך, לא יציב**0
אות שעון חיצוניעד 20MHzתלוי ביציבות של מחולל האות1

* המתנד הפנימי מגיע, מהמפעל, עם דיוק נמוך (פלוס/מינוס 10%), ויש אפשרות לכוון אותו ידנית, לכל מיקרו-בקר בנפרד, לדיוק גבוה יותר (פלוס/מינוס 1%). לא ניכנס לזה כאן.

** הדיוק של כל המתנדים תלוי במתח ובטמפרטורה, והשפעה זו בולטת במיוחד בפנימיים.

את מקור השעון חייבים לבחור בזמן הצריבה, ואי אפשר לשנות אותו תוך כדי ריצה של הקוד. מה שכן אפשר לשנות בזמן הריצה, כפי שנראה בהמשך, היא החלוקה הפנימית של אות השעון (נקראת בשפה המקצועית "Prescaler"), שיכולה להקטין את הקצב שרשום בטבלה פי 2,4,8,16,23,64,128 או 256.

למה לבחור?

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

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

איך להגדיר מקור שעון

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

שימו לב: בין הפיוזים יש כאלה שעלולים לגרום ל"נעילה" של המיקרו-בקר כך שאי אפשר יהיה לתכנת אותו שוב בתכנות רגיל, אלא רק באמצעות פרוצדורות וכלים ייעודיים. לכן, אם שיטת העבודה שלכם היא ללחוץ באקראי על דברים ולראות מה קורה, היזהרו… 😉

הגדרות הפיוזים עבור מקורות השעון השונים הן כל כך לא אינטואיטיביות, שאפילו ב-Atmel Studio הלכו לקראתנו ופישטו אותן קצת – עם דגש על "קצת". נוודא שהצורב שלנו מחובר למיקרו-בקר תקין שמקבל אספקת חשמל, ונלחץ על התפריט Tools->Device Programming. את החלון שמתקבל כבר ראינו בפוסט הראשון בסדרה. להזכירכם, אם החלון ריק כמעט לגמרי וכתוב בו "Select tool, device and interface", נבצע את הפעולות האלה בחלק השמאלי למעלה ונלחץ על Apply. ברשימה משמאל, נבחר Fuses ונגיע לטופס הזה:

טופס הגדרת פיוזים ב-Atmel Studio
טופס הגדרת פיוזים ב-Atmel Studio

שני פיוזים מעניינים אותנו כרגע: CKDIV8 (השלישי מלמטה בתמונה), ו-SUT_CKSEL. הפיוז CKDIV8, ניחשתם נכון, מחלק את השעון ב-8. זאת אומרת, עוד לפני שהגענו ל-Prescaler, לא משנה איזה מקור שעון נבחר, אם הפיוז הזה מסומן אז השעון שלנו יהיה איטי פי 8. כשה-ATtiny85 מגיע טרי מהמפעל, הוא מכוון כברירת מחדל למתנד הפנימי הרגיל (8MHz, ראו בטבלה) והפיוז CKDIV8 מופעל. כלומר, אם נכתוב לו קוד בלי שום הוראה לגבי השעון, הוא ירוץ במהירות של 1MHz.

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

בחירת הגדרות פיוזים למקור שעון
בחירת הגדרות פיוזים למקור שעון

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

  • Ext. = חיצוני, External
  • Int. = פנימי, Internal
  • Osc. = מתנד, Oscillator
  • WD = (טיימר) Watchdog

בחרו את האופציה המתאימה עבור מקור השעון ועבור התדר הרצויים. התעלמו מהגדרות ה-CK וה-ms שבהמשך ההגדרה, הן לא מעניינות אותנו בינתיים.

בכל פעם שתשנו פיוז, הסימון הירוק שלידו יוחלף בסימן קריאה על רקע עיגול צהוב. זה אומר שבחרתם אבל עוד לא צרבתם. אם אתם שלמים עם השינוי ורוצים לצרוב אותו למיקרו-בקר, לחצו על הכפתור Program (השמאלי בשלישיה שמתחת לרשימת הפיוזים). שימו לב – אם תשכחו ללחוץ על Program ורק תסגרו את החלון, השינויים פשוט לא יישמרו, בלי שום התראה.

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

איך לשנות את ה-Prescaler

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

  1. לנטרל את הפסיקות כדי שלא יפריעו בתהליך
  2. לתת ל-CLKPR את הערך 128 – ערך ה"הכנה לכתיבה"
  3. לתת ל-CLKPR ערך בין 0 ל-8, כולל
  4. לאפשר מחדש את הפסיקות

ה-Prescaler של השעון יקבל את הערך 2 בחזקת מה ששלחנו בשלב 3. למשל, אם שלחנו את המספר 4, אז השעון יחולק ב-16 (שתיים בחזקת 4), ואם בחרנו במתנד הפנימי של 8MHz, מהירות השעון שהמיקרו-בקר יקבל בסופו של דבר תהיה 0.5MHz. כידוע, 2 בחזקת אפס זה 1, כך שאם אנחנו רוצים שהשעון לא יחולק כלל, נשלח ל-CLKPR את הערך 0.

כך, למשל, זה נראה בקוד:

#include <avr/interrupt.h> 
// ...

int main(void)
{

 cli(); // stop interrupts
 CLKPR = 1 << CLKPCE; /* CLKCPE = 7, so 1 << CLKCPE = 128 */
 CLKPR = 0; /* Prescaler Select bits, 2^(4 last bits) */
 sei(); // re-enable interrupts
 // ...

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

חשוב עוד יותר: כשהמיקרו-בקר מריץ את הקוד לבדו, ממש לא אכפת לו מה מהירות השעון – אבל כשהוא צריך לתקשר עם רכיבים אחרים, מהירות השעון יכולה להיות בעייתית. לטייני אין הרבה יכולות תקשורת שיכולות להיפגע, אך למיקרו-בקרים גדולים יותר יש (כגון SPI, I2C או UART של משפחת ATmega) וצריך לקחת את זה בחשבון.

חיבורי החומרה

הנושא האחרון שנשאר פתוח הוא אופן החיבור של הרכיבים החיצוניים במקרה של מקור שעון חיצוני. ובכן, יש שני פינים שנקראים XTAL1/CLKI ו-XTAL2/CLKO (מספרם 2 ו-3 ב-ATtiny). אם משתמשים באות שעון חיצוני, שהוא בעצם גל ריבועי, יש לחבר אותו ל-CLKI (קיצור של Clock Input) וכמובן לוודא שיש אדמה משותפת למיקרו-בקר ולמקור השעון. אם משתמשים במתנד, כמו זה שבתמונה הבאה, יש לחבר את הרגליים שלו לפינים הנ"ל (רגל אחת לכל פין כמובן) ולהוסיף גם קבל בין כל רגל לאדמה. ערך הקבלים המומלץ, על פי המפרט, הוא בין 12 ל-22 פיקו-פאראד ושני הקבלים צריכים להיות זהים. הסתכלו על הכיתוב שעל הרכיב הכסוף בתמונה – זהו מתנד קריסטלי בערך של 16MHz, וזה מה שקובע את תדר השעון של לוחות הארדואינו הנפוצים.

מתנד קריסטלי על לוח ארדואינו
מתנד קריסטלי על לוח ארדואינו

בונוס: פלט שעון

אם מקור השעון שלכם אינו מתנד חיצוני, תוכלו לגרום למיקרו-בקר לשחזר את קצב השעון שלו-עצמו כפלט בפין CLKO (קיצור של Clock Output). זה טוב לדיבוג או לסינכרון מדויק של רכיבים אחרים במערכת עם המיקרו-בקר. כדי לבצע זאת, חיזרו לחלון צריבת הפיוזים וסמנו את CKOUT. זה הכל! וכמובן, כשפלט השעון פועל, אי אפשר להשתמש בפין הזה לשום דבר אחר.

להרשמה
הודע לי על
9 תגובות
מהכי חדשה
מהכי ישנה לפי הצבעות
Inline Feedbacks
הראה את כל התגובות

*איך הכי מהיר ונכון יהיה לעשות את הדרך?
*איך נשלוף את המידע הדרוש ממכשיר הטיונר?

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

לי אין את הציוד חוץ ממלחם ב 3600 שקל…רוצה לעבוד על זה ביחד ? בכייף..יש לי לתת לך משהו שאולי יחסוך לך עלויות לנסיונות…אצלי הוא לא בשימוש כבר שנה בכל אופן..https://www.google.com/search?client=aff-maxthon-maxthon4&hs=2gc&channel=t18&q=gps%20receiver%20bu%20353%20usb&bav=on.2,or.&bvm=bv.62922401,d.bGE,pv.xjs.s.en_US.ZJ_ag0lGXHs.O&biw=1281&bih=885&um=1&ie=UTF-8&hl=iw&tbm=isch&source=og&sa=N&tab=wi&ei=7isnU5WrOYel4ASp34GgDg

אני מבין בטיונרים ובכל השאר

לעומתך אני לא חושש ואולי זה הכוונה..שתתחיל למנף את העבודה שלך …רעיון?