מיקרו מיקרו בקר

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

המיקרו-בקר הזעיר PIC10F206, מונח על גבי PIC12F675 במארז DIP8
המיקרו-בקר הזעיר PIC10F206, מונח על גבי PIC12F675 במארז DIP8

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

מדובר בדגם ישן (2004) וחלש מאד, בסטנדרטים מודרניים: הוא מסוגל לבצע רק מיליון פעולות בשניה, יש לו כחצי(!) קילובייט זיכרון Flash ו-24 בייטים של RAM בלבד. הוא כולל גם Comparator (להשוואה של מתחים), Watchdog בסיסי וכן טיימר/מונה יחיד של 8 ביטים. אפשר להכניס אותו למצב שינה ולהעיר אותו באמצעות שינוי מתח על פינים, אבל אין לו פסיקות. מה שווה טיימר בלי פסיקות, אתם שואלים? לא הרבה, וזו אחת הסיבות לכך שהמיקרו-בקר הזה מתאים רק ליישומים הבסיסיים והפשוטים ביותר.

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

הנה הקוד המלא של התוכנה שכתבתי, שיוצרת מעין PWM לשינוי מחזורי של עוצמת ההארה של נורית LED, ו"מקפיאה" את העוצמה כל עוד לחצן קלט נשאר לחוץ. התוכנה הזו תופסת 6 בייטים ב-RAM (רבע מהזיכרון הזמין), ו-9% מהמקום הזמין ב-Flash.

// LED Breather for the PIC10F206
// by Ido Gendel, 2016

#pragma config WDTE = OFF 
#pragma config CP = OFF   
#pragma config MCLRE = ON 

#include <xc.h>

// Duty Cycle
unsigned char dc = 0, c = 0;

void setup(void) {

    // GP1 <- input button
    // Enable WPU resistors 
    // OPTION isn't memory-mapped, so...
    asm("MOVLW 191"); // b 1011 1111
    asm("OPTION");
    // GP0 -> LED
    // Turn off comparator
    CMPON = 0;
    // TRIS isn't memory-mapped either
    asm("MOVLW 14"); // b 0000 1110
    asm("TRIS 6");
    
}

void cycle(void) {

    do {
      GP0 = (c <= dc);
      ++c;
    } while (c);
    
}

void main(void) {

    setup();
    
    while (1) {

      // Breath in
      do {
        cycle();
        if (GP1) ++dc;
      } while (dc);
     
      // Breath out
      do {
        if (GP1) --dc;
        cycle();
      } while (dc);
     
    }
    
}

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

הלחמת חוטי נחושת ל-PIC10F206
הלחמת חוטי נחושת ל-PIC10F206

אני לא אגיד שזה היה קל, אבל זה היה פחות קשה ממה שציפיתי. השחלתי את הקצוות החופשיים של החוטים לחורים ב-Stripboard, הלחמתי אותם, והוספתי שורת Female Headers אחת לגישה לפינים, ושורת Male Headers בצד השני עבור הצורב PICKIT 2.

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

המיקרו-בקר במקומו, ליד נגד THT רגיל להשוואה
המיקרו-בקר במקומו, ליד נגד THT רגיל להשוואה

נ.ב. הנה סרטון באנגלית עם הפרויקט ועם הסבר מפורט יותר על הקוד.

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

לפי החדשות של היום, בים תופסים פוקימונים ולא דגים!

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

מגזין edn עשו פעם סקר לגבי השיקולים של מהנדסים בבחירת מעבד לפרויקט חדש. בניגוד לציפיות, רוב האנשים לא רשמו יכולות/ביצועים או מחיר, אלא דווקא כלי פיתוח והתמיכה של היצרן….
אגב, זה לא מדויק לגבי השavr. ראיתי לו הרבה שימושים גם בעולם ה״אמיתי״. יש בהחלט מקום לכולם (וכמובן הכי כבוד ל-8051 🙂 )

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