כשחברת Microchip קנתה את Atmel לפני כמה חודשים, היא הכריזה שתתייחס למוצרי Atmel כמו למוצרים שלה – כלומר, אם לסמוך על ההיסטוריה, מיקרו-בקרים ממשפחת AVR יהיו זמינים עוד שנים רבות. מה ש"שכחו" לספר לנו (ושיודעי-דבר הזהירו מפניו), זה שהמחיר שלהם יילך ויעלה. זה קורה כבר עכשיו, וכדאי להתחיל לחשוב ברצינות על אלטרנטיבות.
לפני זמן-מה, בעודי משוטט להנאתי באתרי רכיבים שונים, הבחנתי בקפיצה מפחידה במחירו של ATtiny85, המיקרו-בקר הקטן חביב המייקרים. מדולר וקצת ליחידה הוא זינק ל-$4.8, עליה של כ-300%. השינוי הזה לא חל, אמנם, בכל האתרים, ובחנויות מהמזרח הרחוק (שהן ממילא ברירת המחדל של רוב החובבים) המחירים הישנים עדיין תקפים. יכול להיות שמדובר במשהו זמני. אף על פי כן, הוסיפו לכך את הקפיצה כמעט פי שניים במחיר של הצורב Atmel ICE, ותקבלו חשד סביר שמדובר באסטרטגיה מכוונת של Microchip – כדי לחלוב את הפרה החדשה שלהם עד הסוף, או כדי להבריח משתמשים חדשים מארכיטקטורת AVR, או גם וגם.
בנישה הקטנה (תרתי משמע) שלו, הפרמטרים של ATtiny85 מצוינים, ועבור חובבים רבים שמתעניינים במיקרו-בקרים הוא השלב הבא והטבעי אחרי הארדואינו. אבל כעת, כשג'וק אחד כזה יכול לעלות כמו שלושה תואמי-ארדואינו Pro Mini סיניים, צריך לבחון גם את האופציות האחרות. אם מתמקדים בג'וקים במארז DIP עם שמונה רגליים בלבד, אין הרבה אופציות – והבולטת מביניהן, לפחות מבחינת החובבים, היא כנראה PIC12F1840 – של Microchip כמובן.
ה-PIC12F1840 (עולה כ-$1.2-$1.4, נכון לכתיבת שורות אלה) הופיע בשוק בשנת 2011, שש שנים אחרי ה-ATtiny85, וההבדלים ביניהם מייצגים את הכיוון הכללי של עולם ה-8-ביט בשנים האחרונות: לא רכיבים מהירים יותר ועם יותר זיכרון, אלא צריכת חשמל מופחתת ותוספת של מודולים פריפראליים, שמגדילים את מגוון היכולות של הרכיב ומורידים מהעומס על המעבד שלו.
ל-PIC12F1840 יש חצי מכמות זיכרון ה-RAM וה-EEPROM של ה-ATtiny85, וגם המהירות המרבית שלו קטנה פי שניים (בהסתכלות על פעולות לשניה, כשמסתמכים על המתנד הפנימי). מצד שני, יש לו שלושה טיימרים לעומת שניים בלבד ב-ATtiny85, חומרה לתקשורת SPI, I2C ו-UART, מודול DAC (מדיגיטלי לאנלוגי), מודול גמיש ל"הלבשת" סיגנל על גל נושא (Modulator), אפשרות (מוגבלת) להעביר פונקציונליות בין פינים שונים, ועוד. כלומר, גם אם ה-ATtiny85 מנצח ביכולות המעבד והזיכרון נטו, את רוב היישומים בעולם האמתי אפשר לממש בפחות קוד ובפחות משאבים על ה-PIC12F1840. וכמובן, לא לשכוח את המחיר.
כדי לצרוב קוד אליו צריך אמנם את הצורב PICKIT 3, אבל אפשר למצוא חיקויים סיניים שלו שעולים בסביבות $10 בלבד (כמו שני ATtiny85, בערך…) והם עובדים בלי בעיה.
פרויקט היכרות (מתקדם)
בכל אופן, עם דיבורים לא הולכים למכולת: כדי להתנסות בעבודה תכל'ס עם ה-PIC הזה, החלטתי ליצור פרויקט קטן שמשלב כמה מהיכולות שלו. אני אצור PWM של 50% בתדר 38KHz (שמתאים, כידוע, לשידורי IR), אלביש עליו בעזרת ה-Modulator את הפלט של ה-UART, ואשדר כך מידע שמקורו בפין קלט אנלוגי באופן אלחוטי אל המחשב. הגיע הזמן להתחיל לחפור ב-Datasheet.
אין מקום בפוסט הזה לכל פרטי הפרויקט, אז נתחיל בדברים הבסיסיים כאן ונמשיך בפוסט הבא. קודם כל, אספקת חשמל: הג'וק הזה מתאים למתחים של 2.3-5.5V (כן, חמישה וחצי, וזה הטווח הנורמלי, לא "גבול עליון מוחלט"). שימו לב גם שיש תת-דגם אחר, PIC12LF1840, שמתאים למתחים של 1.8-3.6V. כרגיל ב-PIC, המתח החיובי הולך לפין 1 והאדמה לפין 8, וכמיטב המסורת נוסיף גם קבל קטן ביניהם, משהו כמו 0.1 מיקרופאראד. פין 4, שנקרא MCLR, הוא למעשה פין ה-Reset שלנו. לא נצטרך אותו לפרויקט הזה אז פשוט נעזוב אותו; המהדרין מוזמנים להוסיף נגד pull-up חיצוני בערך גבוה.
לצורב יש 5 קווים, אותם מחברים כמו שראינו בפוסט הזה. שם אמנם הצורב היה PICKIT 2, אך החיבורים זהים.
שעון
נעבור לסביבת הפיתוח, ודבר ראשון נגדיר את מקור השעון הרצוי לנו: המתנד הפנימי, בתוספת ה-PLL שתכפיל אותו פי 4. התדר המרבי שאפשר להשיג עם שילוב של שני אלה הוא 32MHz, וכידוע כל פעולה מינימלית ב-PIC לוקחת 4 מחזורי שעון, כלומר 8MHz "אפקטיביים".
איך בדיוק בוחרים בזה? קוראים ב-Datasheet בעמ' 45. הטקסט הזה אולי נראה במבט ראשון מבלבל ומאיים, אך בפועל זה לא נורא: ראשית בוחרים בסביבת הפיתוח את הערכים הרצויים עבור ה-Configuration Bits הרלוונטיים: הערך INTOSC לביט FOSC (=שעון המערכת נלקח מהמתנד הפנימי), והערך ON ל-PLLEN (=הפעלת ה-PLL). לסיום, בקוד עצמו, צריך לכתוב את הערך הבינארי 1110 לביטים 3-6 ברגיסטר OSCCON, כדי לקבוע שהמתנד הפנימי יותאם ל-8MHz.
PWM
כעת, כבדיקה ראשונה (גם של השעון), נכתוב קוד שמחולל אות PWM בתדר 38KHz ו-Duty Cycle של 50%. הנושא של PWM מתחיל בעמ' 176. הפקת אות ה-PWM נעשית על ידי מודול פריפריאלי שנקרא CCP1, בהסתמך על התזמונים של טיימר מס' 2. נלך לפי השלבים שמתוארים בעמ' 177, סעיף 24.3.2. שם נמצאות גם הנוסחאות שמאפשרות לנו להגיע לערכים הנכונים עבור הרגיסטרים הרלוונטיים.
הנה הקוד, בלי הגדרות ה-Configuration bits הכלליות הנוספות:
// PIC12F1840 Configuration Bit Settings // (partial list...) #pragma config FOSC = INTOSC #pragma config PLLEN = ON #include <xc.h> void setup() { // Select 8MHz for INTOSC (32MHz with PLL) OSCCON = (OSCCON & 0x87) + 0x70; // Set up 38KHz 50% PWM // CCP1 defaults to RA2/P1A (pin 5) // Disable output for that pin TRISA |= 4; // Set Timer 2 Period Register PR2 = 210; // Set CCP1 to PWM state, only P1A modulated, // Duty cycle LSBs are binary 10 CCP1CON = 0x2C; // Duty cycle MSBs CCPR1L = 105; // Timer 2 needs no prescaler. // Enable Timer 2 TMR2ON = 1; // Enable PWM output pin TRISA &= ~4; } void main(void) { setup(); while (1) { } }
והנה התוצאה – תאמינו או לא, במכה ראשונה! גם אם קצת קשה להבחין איפה בדיוק כל מחזור של הגל מתחיל, ברור שזה קרוב מאד למטרה.
בפוסט הבא נקרא קלט אנלוגי, נקודד אותו בצורה קצת לא שגרתית, נשדר אותו ב-UART – ולסיום, נשלב את הכל בעזרת ה-Modulator ונוסיף חומרה וגם קוד בצד המחשב כדי להשלים את הפרויקט.
באתר של היצרן http://www.atmel.com/devices/attiny85.aspx
המחיר הוא 1.37$.
אתה צריך להסתכל על הדגם המדויק, ATtiny85-20PU. הוא עולה אצלם $2.40, וגם זה לכמויות של אלף ומעלה (וזה יוצא אותו דבר כמו באתרים שבדקתי)