يوفر ATtiny85 ذاكرة فلاش بسعة 8 كيلوبايت، وذاكرة SRAM بسعة 512 بايت، وستة دبابيس GPIO قابلة للاستخدام في حزمة مكونة من 8 دبابيس، مما يجعله عمليا للتصاميم الحساسة للتكلفة حيث تكون مساحة اللوحة محدودة ويكون متحكم دقيق كامل الميزات مبالغا فيه. يعمل بجهد 1.8-5.5 فولت، ويشمل مدرج ADC بطول 10 بت بأربع قنوات، ويدعم الاتصال التسلسلي المدفوع بالبرمجيات من خلال واجهة السلسلة العالمية. فيما يلي سأستعرض المؤشر الداخلي، والبنية الداخلية، وسير العمل البرمجي، والمنازلات التي تهم عند البناء فعليا.
النقاط الرئيسية:
- ستة دبابيس GPIO تشترك في وظائف ADC وPWM ووظائف تسلسلية؛ التعيين الدقيق للدبوس يمنع تعارض الموارد في التخطيطات الحقيقية.
- يمكن إعادة تكوين دبوس RESET ك GPIO عبر الفيوزات، لكن ذلك يجعلك تخضع لبرمجة عالية الجهد - خطط لتصحيح الأخطاء وسير العمل في الإنتاج قبل الالتزام.
- يتطلب USI ضرب البت يدويا ل I²C و SPI؛ يعمل مع الأجهزة الطرفية منخفضة السرعة لكنه يضيف تعقيد للبرمجيات مقارنة بالأجهزة الطرفية.
- يعتمد استقرار التيار المتردد على جودة مزود الطاقة والتأريض الكهربائي؛ يحسن وضع تقليل الضوضاء في وضع النوم ADC النتائج بشكل ملحوظ عند وجود ضوضاء أساسية.
- دبابيس GPIO المصدر/المصرف تصل إلى الحد الأقصى المطلق 40 مللي أمبير حسب ورقة البيانات، لكن التشغيل المستمر فوق 20 مللي أمبير لكل دبوس يسرع التدهور - دائما ما تخزن الأحمال ذات التيار العالي خارجيا.
المواصفات الفنية
| المعلمة | القيمة |
|---|---|
| المعالج الرئيسي | AVR 8-بت RISC |
| جهد التشغيل | 1.8-5.5 فولت |
| ذاكرة الفلاش | 8 كيلوبايت |
| SRAM | 512 بايت |
| EEPROM | 512 بايت |
| دبابيس GPIO | 6 |
| ADC | 10-بت، 4 قنوات |
| المؤقتات | اثنان من 8-بت |
| سرعة الساعة | حتى 20 ميجاهرتز (خارجي)، 8 ميجاهرتز (RC داخلي، افتراضي) |
| الحزم | PDIP-8، SOIC-8، TSSOP-8، QFN/MLF-20 |
| نطاق درجات الحرارة | -40 إلى +125 °م |
| واجهة التسلسل | USI (قابل للتكوين برمجيا ل SPI أو I²C) |
| كشف القطع الشفاف | نعم |
| مؤقت المراقبة | نعم |

تكوين الدبوس
| دبوس | الوظيفة الأساسية | الوظائف البديلة |
|---|---|---|
| 1 | PB5 (إعادة ضبط) | PCINT5، ADC0، dW (debugWIRE) |
| 2 | PB3 | PCINT3، XTAL1، CLKI، ADC3 |
| 3 | PB4 | PCINT4، XTAL2، CLKO، ADC2 |
| 4 | GND | الملعب |
| 5 | PB0 | MOSI، DI، SDA، AIN0، OC0A، AREF، PCINT0 |
| 6 | PB1 | MISO، DO، AIN1، OC0B، OC1A، PCINT1 |
| 7 | PB2 | SCK، USCK، SCL، ADC1، T0، INT0، PCINT2 |
| 8 | VCC | مصدر الطاقة |

كل دبوس GPIO يجمع ثلاث وظائف على الأقل. من خلال التجربة، يكون الصراع الأكثر شيوعا بين برمجة SPI (التي تستخدم PB0 وPB1 وPB2) وملحقات التطبيقات على نفس الدبابيس. إذا كانت دائرة التطبيق تحمل تلك الدبابيس بشكل كبير أو تثبتها في حالة ثابتة، يمكن أن تفشل برمجة مزود الخدمة بشكل متقطع. إضافة مقاومات تسلسلية (220-470 Ω) بين ATtiny85 والمكونات الخارجية على خطوط SPI تتيح للمبرمج تجاوز دائرة التطبيق أثناء الرفع.
الرقم 1 يوضع افتراضيا على إعادة التعيين مع جهاز سحب داخلي. تكوينها ك GPIO (PB5) عبر فيوز RSTDISBL يمنحك دبوس إدخال/إخراج إضافي، لكنك تفقد القدرة على إعادة البرمجة عبر مزود الخدمة العادي. ثم يطلب البرمجة المتوازية عالية الجهد (HVPP)، والتي تتطلب مبرمجا متخصصا وتضيف تعقيدا لسير العمل الإنتاجي. رأيت الفرق تعطيل RESET للحصول على الدبوس السادس، لكنهم اكتشفوا في وقت متأخر من المشروع أن تحديثات الحقول تصبح غير عملية.
مخطط الكتل والبنية الداخلية

يستخدم ATtiny85 بنية هارفارد مع ذاكرة فلاش منفصلة بحجم 8 كيلوبايت لتخزين البرامج وذاكرة SRAM بحجم 512 بايت لبيانات وقت التشغيل. تحمل الفلاش يقدر ب 10,000 دورة كتابة/مسح في الصفحة؛ تم تصنيف EEPROM ب 100,000 دورة. إذا كان تطبيقك يكتب بيانات معايرة أو يسجل بشكل متكرر، ستصل إلى حدود EEPROM أسرع مما تتوقع - توزع الكتابات عبر عدة عناوين أو انتقل إلى التخزين الخارجي لبيانات ذات عدد دورات عالية.
يقوم مؤقتان ب 8 بت (Timer0 و Timer1) بتوليد PWM، وتعد الأحداث الخارجية، وتشغل المقاطعات. Timer0 أبسط ويستخدم عادة لدوال PWM الأساسية أو دوال التأخير. يتضمن Timer1 وضع PLL يمكنه توليد PWM عالي التردد (حتى 64 ميجاهرتز على PB1/PB4 مع مصدر 5 فولت)، وهو مفيد لتطبيقات مثل توليد حاملات الأشعة تحت الحمراء أو تعتيم التردد العالي.
يمكن لمؤقت المراقبة إعادة ضبط الشريحة إذا توقف البرنامج الثابت، لكنه يعمل أيضا كمؤقت مؤقت منخفض الطاقة في أوضاع السكون. في أحد التصاميم التي تعمل بالبطارية، استخدمنا جهاز المراقبة لإيقاظ ATtiny85 كل 8 ثوان، وقياس حساس، والعودة إلى وضع السكون - مما أدى إلى متوسط استهلاك تيار أقل من 10 ميكروأمبير.
مصدر الطاقة وتكوين الساعة
يأتي ATtiny85 مع صمامات مضبوطة على مذبذب RC الداخلي 8 ميجاهرتز مقسومة على 8، مما يعطي ساعة فعلية 1 ميجاهرتز. هذا الإعداد الافتراضي المحافظ يعمل عبر نطاق الجهد الكامل لكنه يترك الأداء على الطاولة. لتشغيل 5 فولت، إعادة تكوين الفيوزات لتشغيل المذبذب الداخلي بسرعة 8 ميجاهرتز بالكامل أمر بسيط ولا يتطلب مكونات خارجية.
عندما تحتاج إلى توقيت دقيق - مثلا لجهاز UART بمعدلات بودية قياسية أو عداد تردد - فإن معايرة المصنع ±10٪ في المصنع الداخلية ليست محكمة بما فيه الكفاية. بلورة خارجية بسرعة 16 ميجاهرتز أو 20 ميجاهرتز تحسن الدقة إلى ±50 جزء في المليون لكنها تضيف مكثفين وتشغل PB3/PB4. هذا المقابل يستحق ذلك في التطبيقات التي تعتمد على الاتصالات، لكنه مؤلم إذا كنت بالفعل مقيدا بالدبابيس.
يمنع كشف فقدان الإضاءة (BOD) وحدة المعالجة المركزية من تنفيذ تعليمات غير صالحة عند انخفاض جهد الإمداد. تمكين BOD عند 2.7 فولت أو 4.3 فولت يضيف حوالي 20-25 ميكروأمبير إلى تيار السكون. بالنسبة لتصاميم البطاريات التي تستهدف سكون تحت الميكروأمب، قد تحتاج إلى تعطيل BOD والتعامل مع ظروف الجهد المنخفض في البرنامج الثابت - مع قبول خطر حدوث أعطال عرضية أثناء إيقاف التشغيل.
خصائص GPIO وحدود الحمل
كل دبوس GPIO يمكنه الحصول أو استنزاف حتى 40 مللي أمبير كحد أقصى مطلق وفقا لورقة بيانات Microchip، لكن هذا حد مدمر وليس مواصفة تشغيل. التيار المستمر الموصى به لكل دبوس هو 20 مللي أمبير، ويجب أن يبقى التيار الكلي عبر جميع الدبابيس أقل من 200 مللي أمبير لتجنب ارتداد الأرضي الداخلي وخطر القفز.
تشغيل LED مباشرة من GPIO أمر شائع في مشاريع الهواية، لكن الجهد الأمامي والتيار بحاجة إلى دراسة دقيقة. أما LED الأحمر القياسي مع انخفاض أمامي 2 فولت عند 20 مللي أمبير على مزود طاقة 5 فولت فيحتاج إلى مقاومة لا تقل عن 150 Ω. لقد قمت بتصحيح أخطاء في لوحات استخدم فيها شخص ما 47 Ω "لأن الLED كان خافتا جدا" - عمل لبضع ساعات، ثم تعطل GPIO بشكل دائم.
بالنسبة للأحمال التي تزيد عن 20 مللي أمبير - مثل المحركات، المرحلات أو الملفات اللولبية أو حتى مصابيح LED عالية الطاقة - استخدم MOSFET أو BJT خارجي. MOSFET 2N7002 N-channel يكلف بصعوبات قليلة ويبدل مئات الميلي أمبير بشكل نظيف باستخدام مقاومة بوابة بقوة 10 كيلو أوم. محاولة موازي دبابيس GPIO لزيادة سعة التيار لا تنجح بشكل موثوق؛ الاختلافات الطفيفة في مقاومة الدبوس تسبب مشاركة تيار غير متساوية وتلف محتمل.
تشغيل ADC وإدارة الضوضاء
يقوم مدرج ال ADC ذو 10 بت بتحويل 0-VCC (أو مرجع داخلي 1.1 فولت أو 2.56 فولت) إلى قيم من 0 إلى 1023. الدقة هي 10 بت، لكن العدد الفعلي للبتات (ENOB) في بيئة صاخبة يمكن أن ينخفض إلى 8 أو حتى 7 بتات إذا لم تعالج ضوضاء مزود الطاقة.
ثلاثة أشياء تحسن استقرار ال ADC حسب تجربتي:
- مكثفات فصل بالقرب من الشريحة. مكثف سيراميك بقوة 100 نانوفاراد وكهربائي بقوة 10 ميكروفاراد بالتوازي، موضوعان على بعد 5 مم من دبابيس VCC وGND، يقطع ضوضاء التبديل عالية التردد.
- وضع تقليل الضوضاء في مدخل ADC. إيقاف وحدة المعالجة المركزية أثناء التحويل يقضي على ضوضاء التبديل الرقمية داخل الشريحة. الفرق قابل للقياس: رأيت مستويات الضوضاء تنخفض من ±8 LSB إلى ±2 LSB فقط بتفعيل هذا الوضع.
- افصل التأريض التناظري أو التأريض النجمي. إذا كان ال ADC يشترك في مسار العودة مع الأحمال المدفوعة ب PWM، فإن تيار الأرضي من PWM يضخ الضوضاء في قياسات ال ADC. تشغيل تتبع أرضي مخصص إلى مصدر الطاقة لمرجع ADC يحسن النتائج بشكل ملحوظ.
يدعم مدرج ADC أيضا وضع الإدخال التفاضلي مع كسب اختياري (1×، 8×، 20×، 32×) في أزواج دبابيس معينة. نادرا ما يتم توثيق هذا في الدروس لكنه يعمل جيدا مع إشارات التفاضل الصغيرة مثل جسور الترموكولبلين أو جسور قياس الإجهاد. يأتي الكسب على حساب تقليل نطاق الإدخال وزيادة خطأ الإزاحة، لذا تصبح المعايرة أمرا حاسما.
الاتصال التسلسلي عبر USI
واجهة التسلسلية العالمية (USI) هي كتلة عتادية بسيطة تساعد في بروتوكولات التسلسل، لكنها تترك معظم العمل للبرمجيات الثابتة. يتضمن مسجل تبديل السرعات، وعداد، وتوليد ساعة أساسي - وهو ما يكفي لضبط البت بانغ I²C أو SPI بسرعات منخفضة إلى متوسطة.
عندما يعمل USI بشكل جيد:
- التحدث مع حساس I²C واحد على 100 كيلوهرتز.
- تشغيل شاشة SPI أو DAC حيث يكون ATtiny85 هو دائما الرئيس.
- النمذجة الأولية أو التصاميم منخفضة الحجم حيث يكون تعقيد البرنامج الثابت مقبولا.
عندما يصبح USI مشكلة:
- سيناريوهات تمدد الساعة، I²C متعدد الماستر؛ USI لا تتعامل مع هذه الأمور تلقائيا.
- SPI عالي السرعة فوق 1 ميجاهرتز؛ يصبح التوقيت صعبا بدون أجهزة مخصصة.
- التطبيقات التي تحتاج فيها أيضا إلى UART - لا يوجد عتاد UART، لذا ستتعامل مع ذلك أيضا، مما يستهلك دورات المعالج ويعقد التوقيت.
لقد استخدمت مكتبات I²C مبنية على USI مثل TinyWireM بنجاح مع حساسات مثل BMP280 وOLED SSD1306. لكنني قضيت أيضا ساعات في تصحيح حالة حيث كان جهاز I²C يضغط على SCL منخفض (تمديد الساعة)، ولم تكتشف المكتبة ذلك، مما تسبب في توقف البرنامج الثابت. الدرس: اختبر كود USI مقابل أجهزتك الطرفية في وقت مبكر، وليس على الطاولة في ظروف مثالية.
برمجة ATtiny85 باستخدام بيئة تطوير أردوينو

برمجة ATtiny85 عبر بيئة تطوير Arduino تتطلب إضافة تعريف لوحة من طرف ثالث، مثل ATTinyCore من Spence Konde أو حزمة Attiny الأقدم من ديفيد ميليس. تقوم هذه الأنوية بربط وظائف أردوينو مثل 'digitalWrite()' و 'analogRead()' بأجهزة ATtiny85.
الأسلاك لبرمجة مزود الخدمة:
| دبوس ATtiny85 | مبرمج مزود خدمة الإنترنت | إشارة |--------------|-----------------------| | 1 (إعادة ضبط) | إعادة التعيين | | 5 (PB0) | موسي | | 6 (PB1) | ميسو | | 7 (PB2) | SCK | | 8 (VCC) | +5 فولت (أو جهد الهدف) | | 4 (GND) | GND |
يمكنك استخدام مزود خدمة خدمة الإنترنت USBtinyISP أو USBasp مخصص أو أي لوحة أردوينو مهيأة ك "أردوينو كمزود خدمة إنترنت". إذا كنت تستخدم أردوينو كمزود إنترنت، ضع مكثفا بقوة 10 ميكروفاراد بين RESET و GND على الأردوينو لمنع إعادة الضبط أثناء الرفع.
إعدادات اللوحة مهمة:
- اختيار سرعة الساعة الصحيحة (1 ميجاهرتز، 8 ميجاهرتز داخلي، أو 16 ميجاهرتز خارجي).
- اختر "Burn Bootloader" مرة واحدة لكتابة إعدادات الفيوز - هذه الخطوة لا تثبت محمل إقلاع (ATtiny85 لا يستخدمه)، لكنها تضبط الفيوزات لتتناسب مع الساعة التي اخترتها.
- بعد ضبط الفيوز، قم برفع الرسومات عبر "رسم تخطيطي > رفع باستخدام المبرمج" أو تعيين المبرمج كخيار أساسي في التفضيلات.
أرقام دبابيس الأردوينو لا تتطابق مباشرة مع الدبابيس الفيزيائية. على سبيل المثال، الدبوس الرقمي رقم 0 في أردوينو يتوافق مع PB0 (الدبوس الفيزيائي 5)، والدبوس الرقمي 2 في أردوينو هو PB2 (الدبوس الفعلي 7). تحقق من وثائق النواة أو مخطط التوزيع قبل التوصيل.
دائرة عاملة دنيا

الدائرة الدنيا تحتاج فقط:
- VCC (الدبوس 8) متصل بمصدر طاقة 3.3 فولت أو 5 فولت.
- GND (الدبوس 4) متصل بالأرض.
- مكثف خزفي بقوة 100 نانومفاراد بين VCC وGND، موضوع بالقرب من الدائرة المتكاملة.
- اختياريا، مقاومة سحب بقوة 10 كيلو أوم عند إعادة التعيين (الدبوس 1) إذا كان مصدر الطاقة لديك مزعجا - رغم أن السحب الداخلي للأعلى عادة ما يكون كافيا.
يوفر LED مزود بمقاومة تحد للتيار (220-470 Ω ل5 فولت، و150 Ω على الأقل ل 3.3 فولت) متصل ب PB0 (الدبوس 5) تغذية راجعة بصرية. يعمل المذبذب RC الداخلي بسرعة 8 ميجاهرتز بشكل افتراضي، لذا لا حاجة إلى بلورة خارجية.
يعمل هذا الإعداد بشكل موثوق لاختبارات الوميض، وتجارب PWM، وتطوير البرمجيات الثابتة الأولية. للتطبيقات الإنتاجية أو الحساسة للضوضاء، أضف مكثف حجمي بقوة 10 ميكروفاراد بالتوازي مع السيراميك بقوة 100 نانوفاراد لمعالجة متطلبات التيار العابر.
القضايا الشائعة والحلول العملية
| المشكلة | السبب الجذري | الحل |
|---|---|---|
| فشل رفع المزود في خدمة الإنترنت مع "عدم تطابق توقيع الجهاز" | تم اختيار شريحة خاطئة في بيئة التطوير (IDE)، أو أن الصمامات مضبوطة على ساعة خارجية بدون وجود بلورة | تحقق من اختيار المجلس؛ إذا كانت الصمامات خاطئة، قم بتوصيل إشارة ساعة خارجية إلى PB3 أو استخدم HVPP لاستعادة |
| قراءات ADC تنجرف أو تقفز عشوائيا | ضوضاء مزود الطاقة، مكثف فصل مفقود، أو تأريض سيء | أضف فصل 100 nF + 10 ميكروفاراد بالقرب من VCC/GND؛ تمكين وضع تقليل الضوضاء في مبدل ADC؛ مسارات أرضية تناظرية ورقمية منفصلة |
| يفشل التواصل بين I²C/SPI بشكل متقطع | توقيت USI غير صحيح، عدم تطابق سرعة الساعة، أو فقدان السحب الخارجي (I²C) | تحقق مرتين من اختيار الساعة وإعدادات الفيوز؛ إضافة 4.7 كيلو أوم للسحب إلى SDA/SCL ل I²C; تقليل سرعة الناقل في البرنامج الثابت |
| رمز GPIO يتوقف عن الاستجابة بعد ساعات من العمل | دبوس مدفوع خارج حد التيار، أو تعرض لارتفاع الجهد | تحقق من قيم مقاومات LED؛ تخزين الأحمال عالية التيار باستخدام MOSFET؛ إضافة حماية عابرة (ديود أو TVS) إذا كان الرمز يتصل بكابلات خارجية |
| الكود يعمل بسرعة خاطئة أو التوقيت غير صحيح | إعدادات فيوز الساعة لا تتطابق مع اختيار لوحة Arduino IDE | يقوم بتشغيل محمل الإقلاع (يضبط الفيوزات) بعد تغيير إعداد الساعة؛ تحقق من تردد الساعة الفعلي باستخدام منظار أو محلل منطقي |
عندما يتم تعطيل فيوز إعادة التعيين عن طريق الخطأ:
إذا قمت بضبط صمامات RSTDISBL وفقدت وصول مزود الخدمة، فلن تعمل المبرمجون العاديون. تحتاج إلى مبرمج متوازي عالي الجهد (HVPP) مثل AVR Dragon (تم إيقافه لكنه متوفر مستخدما) أو تصاميم مفتوحة المصدر مبنية على أردوينو. هذا يطبق 12 فولت على دبوس RESET مع الاحتفاظ بدبابيس محددة في حالات محددة، مما يجبر الشريحة على الدخول في وضع البرمجة بغض النظر عن إعدادات الفيوز. يمكن استعادته، لكنه مزعج ويستغرق وقتا طويلا.
متى تستخدم ATtiny85 (ومتى لا تستخدمه)
مناسبة جيدة:
- مهام تحكم بسيطة: تعريفات LED، قارئات حساسات، شاشات صغيرة.
- تصاميم محدودة المساحة حيث يوفر الحزمة ذات الثمانية دبابيس مساحة اللوحة.
- تطبيقات تعمل بالبطارية وتستفيد من أوضاع السكون (حتى ~0.1 ميكروأمبير في إيقاف التشغيل مع إيقاف المراقبة).
- تصاميم حساسة للتكلفة حيث يكون لكل سنت لكل وحدة قيمة مقارنة بالحجم.
التوافق السيء:
- التطبيقات التي تتطلب عدة ملحقات تسلسلية في نفس الوقت (UART + SPI + I²C) - تزداد تعقيد البرمجيات الثابتة بشكل كبير.
- متطلبات الاتصال عالية السرعة أو التوقيت الضيق - محدودة ب USI والتنفيذ أحادي الخيط.
- المشاريع التي تهم سرعة التطوير أكثر من التكلفة؛ الانتقال إلى ATmega328P أو STM32 يمنحك UART وSPI وI²C، وأقل من المتاعب.
لقد استخدمت ATtiny85 بنجاح في وحدات تحكم إضاءة LED، وشاشات البطارية، وأجهزة استقبال الأشعة تحت الحمراء. لكنني تخليت عنه أيضا في منتصف المشروع عندما توسعت المتطلبات لتشمل منفذ تصحيح أخطاء UART وتسجيل فلاش SPI - أشياء بسيطة على شريحة أكبر لكنها مؤلمة على ATtiny85.
الخاتمة
يظل ATtiny85 ذا صلة بالتصاميم التي تكون فيها الحجم، التكلفة، والقدرة هي القيود الأساسية وتبقى الوظائف ضمن حدودها المحددة جيدا. تتطلب دبابيس GPIO الستة ذات الوظائف المشتركة تخصيص دبابيس دقيقة، ويتطلب نظام USI المدفوع بالبرمجيات جهدا أكبر في البرمجيات مقارنة بالأجهزة الطرفية. يعتمد أداء مدرج التيار بشكل كبير على تصميم مزود الطاقة، وحدود تيار GPIO حقيقية - إذا تجاوزتها ستفشل الدبابيس بشكل دائم.
فهم إعدادات الفيوز، ومقايضة دبابيس RESET (RET)، وسير عمل برمجة مزود الخدمة قبل الالتزام بتصميم يمنع المفاجآت المكلفة في مراحل متأخرة. للتطبيق المناسب، يوفر ATtiny85 تحكما موثوقا في مساحة محدودة. بالنسبة لأي شيء أكثر تعقيدا، قيم ما إذا كان عبء البرمجيات الثابتة وقيود الأجهزة يفوق التوفير في التكاليف.