- מהו TIMER ב Embedded Electronics?
- רישומי טיימר ארדואינו
- ארמואינו טיימר מפריע
- רכיבים נדרשים
- תרשים מעגל
- תכנות טיימרים של Arduino UNO
פלטפורמת הפיתוח של Arduino פותחה במקור בשנת 2005 כמכשיר לתכנות קל לשימוש לפרויקטים לעיצוב אמנותי. כוונתה הייתה לעזור לא-מהנדסים לעבוד עם אלקטרוניקה בסיסית ומיקרו-בקרים ללא ידע רב בתכנות. אבל אז, בגלל אופיו הקל לשימוש, הוא הותאם עד מהרה על ידי מתחילים אלקטרוניים ותחביבים ברחבי העולם וכיום הוא אפילו מועדף לפיתוח אב-טיפוס ופיתוחים של POC.
אמנם זה בסדר להתחיל עם Arduino, אבל חשוב לאט לעבור למיקרו-בקרי הליבה כמו AVR, ARM, PIC, STM וכו 'ולתכנת אותו באמצעות היישומים המקוריים שלהם. הסיבה לכך היא שקל מאוד להבין את שפת התכנות של Arduino מכיוון שרוב העבודה נעשית על ידי פונקציות שנבנו מראש כמו digitalWrite (), AnalogWrite (), Delay () וכו 'בעוד ששפת המכונה ברמה נמוכה מוסתרת מאחוריהן. תוכניות Arduino אינן דומות לקידוד Embedded C אחר שבו אנו מתמודדים עם ביטים של רישום והופכים אותם לגבוהים או נמוכים על סמך ההיגיון של התוכנית שלנו.
טיימרים לארדואינו ללא דיחוי:
לפיכך, כדי להבין מה קורה בתוך הפונקציות שנבנו מראש עלינו לחפור מאחורי מונחים אלה. לדוגמא כאשר משתמשים בפונקציה עיכוב () הוא מגדיר בפועל את סיביות הטיימר והרשם הנגדי של מיקרו-בקרת ATmega.
בהדרכת טיימר זו של ארדואינו אנו נמנע משימוש בפונקציית ה- delay () ובמקום זאת נעסוק ברשומות עצמן. הדבר הטוב הוא שאתה יכול להשתמש באותו IDE של ארדואינו לשם כך. נגדיר את סיביות הרישום של הטיימר ונשתמש בהפסקת הצפת הטיימר כדי להחליף נורית בכל פעם שההפרעה מתרחשת. ניתן לכוונן את הערך הטוען מראש של ביט הטיימר באמצעות לחצני כפתור כדי לשלוט על משך הזמן בו מתרחשת ההפרעה.
מהו TIMER ב Embedded Electronics?
טיימר הוא סוג של הפרעה. זה כמו שעון פשוט שיכול למדוד את מרווח הזמן של אירוע. לכל מיקרו-בקר יש שעון (מתנד), נניח בארדואינו אונו שהוא 16Mhz. זה אחראי למהירות. מהירות העיבוד גבוהה יותר בתדר השעון גבוה יותר. טיימר משתמש במונה אשר נספר במהירות מסוימת בהתאם לתדר השעון. בארדוינו אונו לוקח 1/16000000 שניות או 62 ננו שניות לספור יחיד. כלומר ארדואינו עובר מהוראה אחת להוראות אחרות בכל 62 ננו שנייה.
טיימרים בארדוינו UNO:
ב- Arduino UNO ישנם שלושה טיימרים המשמשים לפונקציות שונות.
טיימר 0:
זהו טיימר של 8 ביט ומשמש בפונקציית טיימר כגון עיכוב (), מילי ().
טיימר 1:
זהו טיימר של 16 סיביות ומשמש בספריית סרוו.
טיימר 2:
זהו טיימר של 8 ביט ומשמש בפונקציית הטון ().
רישומי טיימר ארדואינו
כדי לשנות את תצורת הטיימרים, משתמשים ברשומות טיימר.
1. רושמי בקרת טיימר / מונה (TCCRnA / B):
רישום זה מכיל את סיביות הבקרה העיקריות של הטיימר ומשמש לבקרה על מחליפי הטיימר. זה גם מאפשר לשלוט על מצב הטיימר באמצעות סיביות ה- WGM.
פורמט מסגרת:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Prescaler:
ביטי CS12, CS11, CS10 ב- TCCR1B מגדירים את ערך prescaler. נעשה שימוש במכשיר prescaler להגדרת מהירות השעון של הטיימר. ל- Arduino Uno יש prescalers של 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | להשתמש |
0 | 0 | 0 | אין שעון טיימר STOP |
0 | 0 | 1 | CLCK i / o / 1 ללא הגדרה מוקדמת |
0 | 1 | 0 | CLK i / o / 8 (מאת Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (מאת Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (מ Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (מאת Prescaler) |
1 | 1 | 0 | מקור שעון חיצוני בפין T1. שעון בקצה נופל |
1 | 1 | 1 | מקור שעון חיצוני על סיכת T1. שעון בקצה עולה. |
2. רישום טיימר / מונה (TCNTn)
רישום זה משמש לשליטה בערך הנגד ולהגדרת ערך מטעין מקדים.
נוסחה לערך הטעינה מראש לשעה הנדרשת:
TCNTn = 65535 - (16x10 10 xTime בשנייה / ערך Prescaler)
לחישוב ערך הטעינה מראש לטיימר 1 לזמן של 2 שניות:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
ארמואינו טיימר מפריע
בעבר למדנו על הפרעות בארדואינו וראינו שהפרעות טיימר הן סוג של הפרעות בתוכנה. ישנן הפרעות טיימר שונות בארדואינו אשר מוסברות להלן.הפסקת הצפת טיימר:
בכל פעם שהטיימר מגיע לערכו המקסימלי נניח לדוגמא (16 ביט -65535) מתרחשת הפרעת הצפת הטיימר . לכן, נקראת שגרת שירות הפסקת ISR כאשר ביט ההפרעה של Timer Overflow Interrupt מופעל ב- TOIEx הקיים ברשמת מסיכת הפסקה של טיימר TIMSKx.
פורמט ISR:
ISR (TIMERx_OVF_vect) { }
רישום השוואת תפוקה (OCRnA / B):
כאן כאשר מתרחשת הפרעת ההתאמה של השוואת הפלט אז נקרא שירות ההפרעה ISR (TIMERx_COMPy_vect) וגם ביט הדגל של OCFxy ייקבע במרשם TIFRx. ISR זה מופעל על ידי הגדרת ביט הפעלה ב- OCIExy הקיים ברשמת TIMSKx. היכן TIMSKx הוא רישום מסיכת הפסקה של טיימר.
לכידת קלט טיימר:
לאחר מכן כאשר מתרחש הפסקת לכידת הקלט של הטיימר, נקרא שירות ההפרעה ISR (TIMERx_CAPT_vect) וגם ביט הדגל ICFx יוגדר ב- TIFRx (Timer Interrupt Flag Register). ISR זה מופעל על ידי הגדרת סיבית ההפעלה ב- ICIEx הקיימת במרשם TIMSKx.
רכיבים נדרשים
- ארדואינו UNO
- לחצני כפתור (2)
- LED (בכל צבע)
- נגד 10k (2), 2.2k (1)
- צג LCD 16x2
תרשים מעגל
חיבורי מעגל בין Arduino UNO לתצוגת LCD 16x2:
LCD בגודל 16x2 |
ארדואינו UNO |
VSS |
GND |
VDD |
+ 5 וולט |
V0 |
לפין מרכז פוטנציומטר לבקרת ניגודיות של LCD |
RS |
8 |
RW |
GND |
ה |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
א |
+ 5 וולט |
ק |
GND |
שני כפתורי כפתור עם נגדים נפתחים של 10K מחוברים לסיכות Arduino 2 & 4 ונורית LED מחוברת ל- PIN 7 של Arduino דרך נגן 2.2K.
ההתקנה תיראה כמו בתמונה למטה.
תכנות טיימרים של Arduino UNO
במדריך זה נשתמש ב- TIMER OVERFLOW INTERRUPT ונשתמש בו כדי להבהב את ה- LED ON ו- OFF למשך זמן מסוים על ידי התאמת ערך הטעינה מראש (TCNT1) באמצעות כפתורי לחיצה. הקוד השלם עבור טיימר הארדואינו ניתן בסוף. כאן אנו מסבירים את הקוד שורה אחר שורה:
כמו LCD 16x2 משמש בפרויקט כדי להציג את הערך מטעין מראש, כך ספריית גביש נוזלי משמש.
#לִכלוֹל
סיכת האנודה LED המחוברת לסיכה ארדואינו 7 מוגדרת כ- ledPin .
# הגדר ledPin 7
בשלב הבא מוכרז האובייקט לגישה לכיתת גביש נוזלי באמצעות סיכות LCD (RS, E, D4, D5, D6, D7) המחוברות ל- Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
לאחר מכן הגדר את ערך הטעינה מראש 3035 למשך 4 שניות. בדוק את הנוסחה שלעיל כדי לחשב את הערך הטוען מראש.
ערך צף = 3035;
לאחר מכן בהגדרת הריק (), הגדר תחילה את ה- LCD למצב 16x2 והצג הודעת ברכה למספר שניות.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); עיכוב (2000); lcd.clear ();
לאחר מכן הגדר את פין LED כסיכת OUTPUT ולחצני הדחיפה מוגדרים כסיכות INPUT
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
לאחר מכן השבת את כל ההפרעות:
noInterrupts ();
לאחר מכן מאותחל טיימר 1.
TCCR1A = 0; TCCR1B = 0;
ערך הטיימר של הטעינה מראש מוגדר (בתחילה כ- 3035).
TCNT1 = ערך;
לאחר מכן נקבע ערך הסולם המוקדם 1024 במרשם TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
הפסקת הצפת הטיימר מופעלת במרשם מסיכות ההפסקה של הטיימר כך שניתן להשתמש ב- ISR.
TIMSK1 - = (1 << TOIE1);
סוף סוף כל ההפרעות מופעלות.
מפריע ();
כעת כתוב את ה- ISR עבור Timer Overflow Interrupt האחראי להפעלת וכיבוי LED באמצעות DigitalWrite . המצב משתנה בכל פעם שהפרעת הצפת הטיימר מתרחשת.
ISR (TIMER1_OVF_vect) { TCNT1 = ערך; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
ב לולאת החלל () הערך של preloader מוגדל או decremented באמצעות התשומות בלחיצת הכפתור וגם הערך מוצג על LCD 16x2.
אם (digitalRead (2) == HIGH) { value = value + 10; // ערך טעינה מוקדמת של תוספת } אם (digitalRead (4) == HIGH) { value = value-10; // ירידה בערך הטעינה מראש } lcd.setCursor (0,0); lcd.print (ערך); }
אז ככה ניתן להשתמש בטיימר להפקת עיכוב בתכנית Arduino. בדוק את הסרטון למטה בו הדגמנו את השינוי בעיכוב על ידי הגדלת וירידה בערך הטעינה באמצעות לחצני לחיצה.