
هل أنت مبرمج 8 بت أم 32 بت؟ في OMZLO ، ركزنا على شرائح ARM Cortex الجديدة ذات 32 بت (STM32 و SAMD) ، والتي تقدم عادةً المزيد من ذاكرة الوصول العشوائي ، وأداء أفضل من وحدات التحكم الصغيرة (MCU) الأقدم 8 بت. ، ودعم المزيد من الأجهزة الطرفية. وكل هذا - لنفسه ، أو بسعر أقل. لكن MCU 8 بت لم تفقد أهميتها بعد. على وجه الخصوص ، أصدرت Microchip سلسلة جديدة من الرقائق ، "tinyAVR 0-series" ، والتي ، بالمقارنة مع رقائق AVR التي تم إصدارها سابقًا ، تجعل من الممكن العمل مع المزيد من الأجهزة الطرفية الحديثة. في نفس الوقت تتميز الرقائق الجديدة بسعر مغرٍ للغاية. يبدو أن هذه الرقائق مثالية لتطوير أجهزة بسيطة لا تحتاج إلى الإمكانياتما تقدمه وحدات MCU الأحدث 32 بت. بالإضافة إلى ذلك ، يعد برمجة المتحكمات الدقيقة 8 بت أسهل بكثير ، مما يؤدي إلى زيادة سرعة تطوير جزء البرنامج من الأجهزة التي تم إنشاؤها على أساسها.
بفضل نجاح Arduino UNO ، يمكن العثور على العديد من البرامج التعليمية على الإنترنت لشرح ميزات البرمجة للميكروكونترولر ATmega328 8 بت ونظرائهم مثل ATtiny85. نحن نتحدث عن الوصول المباشر إلى السجلات دون استخدام لغة البرمجة المستخدمة في Arduino ، ودون استخدام IDEs التي أنشأتها الشركات المصنعة للرقائق مثل Atmel Studio. للتحقق من ذلك ، ما عليك سوى البحث في Google عن "atmega328 blinky". لبرمجة وحدات التحكم الدقيقة ، لا تحتاج إلا إلى مترجم C لـ AVR ، ومحرر نصوص ، و avrdude ، ومبرمج AVR. على بعض المواردحتى يمكن العثور على أدلة حول كيفية الحصول على ATmega328 وتشغيله مع لوحات التجارب العالمية. ومع ذلك ، إذا تحدثنا عن أحدث شرائح microAVR 0-series ، فليس من السهل العثور على معلومات من هذا النوع عليها.
بالطبع ، تقدم Microchip جميع الأدوات التي تحتاجها لبرمجة tinyAVR الجديدة في بيئة تطوير متكاملة مصممة خصيصًا لنظام التشغيل Windows. بالنسبة لبعض الرقائق الأحدث ، هناك "نوى اردوينو". بفضل هذا ، يمكن برمجة هذه الرقائق باستخدام Arduino IDE. ولكن مرة أخرى ، إذا فضل المرء كتابة كود متحكم دقيق بأسلوب "منخفض المستوى" باستخدام محرر النصوص المفضل لديهم
Makefileومترجم سي ، فسيجدون القليل جدًا من المعلومات حول هذا الأسلوب للعمل مع tinyAVR.
في هذه المقالة ، سنخبرك كيف ، من البداية ، وباستخدام أبسط الأدوات ، يمكنك إنشاء برامج ثابتة وامضةل ATtiny406. معظم ما سيتم مناقشته ينطبق أيضًا على وحدات AVR MCU الصغيرة الأخرى. هذا البرنامج التعليمي مخصص لأولئك الذين يستخدمون macOS و Linux ، ولكن نصيحتنا ، مع تعديلات طفيفة ، ستكون مفيدة لمن يستخدمون بيئة Windows أيضًا.
جزء المعدات من المشروع
▍ البحث ATtiny406
قررنا تجربة ATtiny406 ، على أمل أن يحل هذا المتحكم الدقيق في المستقبل محل ATtiny45 ، المستخدم حاليًا في PiWatcher - في تطويرنا ، والذي يسمح ، عند الحاجة ، بإيقاف تشغيل Raspberry Pi أو إعادة تشغيله تمامًا. يحتوي ATtiny406 على 4 كيلوبايت من ذاكرة فلاش و 256 بايت من ذاكرة الوصول العشوائي ، ويمكن للرقاقة أن تعمل بسرعة 20 ميجاهرتز بدون مصدر ساعة خارجي.
أحد الاختلافات الرئيسية بين وحدات AVR MCU الصغيرة الجديدة والرقائق الأقدم والمعروفة مثل ATtiny85 هو أن الشرائح الأحدث تستخدم بروتوكول البرمجة UPDI. تحتاج فقط إلى 3 دبابيس للعمل ، وهناك حاجة إلى 6 دبابيس لبروتوكول ISP الذي تستخدمه الرقائق القديمة.
بعد دراسة قصيرة للسؤال ، علمنا أنه يمكنك برمجة tinyAVR مع UPDI باستخدام كابل ومقاوم USB إلى تسلسلي بسيط. لقد اكتشفنا ذلك بفضل أداة pyupdi Python ، التي اقترحت مخطط الأسلاك التالي لتحميل البرنامج الثابت إلى وحدة التحكم الدقيقة.

مخطط اتصال متحكم
▍ تصميم اللوحة لـ ATtiny406
لقد أنشأنا لوحة اندلاع أضيق الحدود لـ ATtiny406. يمكن تشغيل هذه اللوحة بجهد 5 فولت من USB. بدلاً من ذلك ، يمكنك تطبيق جهد أقل من 3.3 فولت باستخدام دبابيس VCC / GND المخصصة. يوجد مكان على السبورة لزر ومصباح LED. لإجراء التجارب ، قررنا بناء مقاوم 4.7 kOhm في اللوحة ، وهو مطلوب لاستخدام بروتوكول UPDI (هذا هو المقاوم R2). نتيجة لذلك ، حصلنا على تخطيط اللوحة التالي.

تخطيط اللوحة
▍لوحة منتهية
تبين أن لوحة الانهيار النهائية مضغوطة تمامًا ، وتتناسب جيدًا مع اللوح الصغير. يمكن العثور على مخططات اللوحة هنا .

لوحة معززة مثبتة على لوحة النموذج الأولي
لبرمجة ATtiny406 ، يتم توصيل كبل USB-to-Serial باللوحة باستخدام المسامير الموجودة عليه.

مخطط توصيل الكابلات
الجزء البرمجي للمشروع
▍pyupdi
قمنا بتثبيت pyupdi باتباع الإرشادات من مستودع المشروع .
تم توصيل كبل USB إلى المسلسل باللوحة باستخدام أربعة دبابيس UPDI. شوهد محول USB إلى المسلسل الخاص بنا في macOS على أنه ملف
/dev/tty.usbserial-FTF5HUAV.
للتأكد من أن المبرمج يتعرف على ATtiny406 ، يمكنك تنفيذ أمر مشابه لما يلي عن طريق تحرير مسار الملف:
pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -i
إذا تم تكوين كل شيء بشكل صحيح ، فإن تنفيذ أمر مثل هذا يجب أن ينتج عنه الإخراج التالي:
Device info: {'family': 'tinyAVR', 'nvm': 'P:0', 'ocd': 'D:0', 'osc': '3', 'device_id': '1E9225', 'device_rev': '0.1'}
مترجم ▍C
اتضح أن مترجم avr-gcc العادي الذي يمكن تثبيته على macOS باستخدام Homebrew لا يسمح بتعيين ATtiny406 كهدف تجميع. لذلك قررنا تثبيت avr-gcc المقدم من Microchip. لتنزيل برنامج التحويل البرمجي ، يجب عليك إنشاء حساب على موقع Microchip ، وهو أمر مزعج بعض الشيء.

تنزيل المترجم
بعد تنزيل المواد الضرورية المقدمة في شكل أرشيف ، قمنا بفك ضغط هذا الأرشيف في مجلد منفصل. يجب إضافة المسار إلى الدليل
binالذي سيكون في هذا المجلد إلىPATH. هذا سيجعل العمل أسهل في المستقبل. بافتراض تخزين المترجم في مجلد$HOME/Src/avr8-gnu-toolchain-darwin_x86_64، يمكنك تحريرهPATHعن طريق إضافة الأمر التالي إلى الملف.bash_profile:
export PATH=$PATH:$HOME/Src/avr8-gnu-toolchain-darwin_x86_64/bin/
لا يتم دعم أحدث وحدات MCU من ATtiny بواسطة برنامج التحويل البرمجي avr-gcc من Microchip بدون تكوين إضافي. لدعمهم ، تحتاج إلى تنزيل ATtiny Device Pack .

تنزيل حزمة ATtiny Device Pack
نتيجة لذلك ، قمنا بتنزيل الحزمة
Atmel.ATtiny_DFP.1.6.326.atpack(يمكن تسمية هذا الملف بشكل مختلف ، وقد يتضمن اسمه رقم إصدار مختلف). على الرغم من أن امتداد الملف هو. atpack، هذا في الواقع.zipأرشيفعادي. قمنا بتغيير امتدادها.zipواستخراج محتويات الحزمة إلى مجلد$HOME/Src/Atmel.ATtiny_DFP.1.6.326، أي إلى نفس المكان الذي كانت فيه ملفات المترجم بالفعل.
▍ كتابة برنامج سي
كتبنا البرنامج التالي ، الذي يومض ، بتردد 1 هرتز ، مؤشر LED المتصل بالدبوس B5 على لوحة ATtiny الخاصة بنا.
#include <avr/io.h>
#include <util/delay.h>
int main() {
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0); // 20 (, 0x02 2)
PORTB.DIRSET = (1<<5);
for (;;) {
PORTB.OUTSET = (1<<5);
_delay_ms(500);
PORTB.OUTCLR = (1<<5);
_delay_ms(500);
}
}
هذا الرمز مشابه جدًا لبرنامج وامض LED المكتوب لميكروكونترولر AVR المألوف. أول تغيير ملحوظ هو استخدام الهياكل للوصول إلى سجلات MCU. على سبيل المثال ، بدلاً من الإشارة إلى
PORTB، يتم إجراء مكالمة إلى PORTB.DIRSET.
هناك تغيير آخر يمثله رمز ضبط التردد
(_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0)). يعمل ATtiny406 الجديد عند 3.33 ميجاهرتز بعد إعادة التشغيل ، وهو ما يتوافق مع الساعة الأساسية 20 ميجاهرتز ، والتي تقسم على 6. لكي تعمل الشريحة بأقصى سرعة 20 ميجاهرتز ، نقوم بمسح السجل CLKCTRL.MCLKCTRLB. نظرًا لأنه يجب حماية هذا السجل من التغييرات العرضية ، في ATtiny406 ، يجب استخدام إنشاء برنامج خاص لتعديله. لحسن الحظ ، تجعل وحدات الماكرو هذا أسهل _PROTECTED_WRITE. يمكنك قراءة المزيد عن هذا.هنا .
إذا قارنت هذا الرمز بالرمز المكتوب لـ STM32 أو SAMD21 ، فسنجد أنه أبسط بكثير.
▍ ملف
نحن هنا نستخدم بنية الدليل التالية:
src/Atmel.ATtiny_DFP.1.6.326/- المسار إلى حزمة جهاز الرقاقة الدقيقة.src/attiny406-test/- المجلد الذيmain.cيتم فيه تخزين الكود أعلاه في الملف .
يمكن إجراء تجميع التعليمات البرمجية من الدليل
attiny406-test/باستخدام الأمر التالي:
avr-gcc -mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/ -O3 -I ../Atmel.ATtiny_DFP.1.6.326/include/ -DF_CPU=20000000L -o attiny406-test.elf main.c
-Oتسمح لك
العلامة بإجراء التحسينات اللازمة لعمل استدعاءات الوظائف بنجاح _delay_ms(). وينطبق الشيء نفسه على المتغير -DF_CPU، الذي يعكس محتواه التردد المتوقع للرقاقة. تحتوي باقي المعلمات على معلومات حول موقع ملفات ATtiny406 ، والتي قمنا بتنزيلها واستخراجها مسبقًا من أرشيف Device Pack.
لتنزيل البرنامج الثابت إلى MCU ، تحتاج إلى تحويل ما حصلت عليه إلى تنسيق Intel HEX. بعد ذلك ، تحتاج إلى استخدام pyupdi. لقد أنشأنا
Makefileحلاً آليًا بسيطًا لهذه المهام:
OBJS=main.o
ELF=$(notdir $(CURDIR)).elf
HEX=$(notdir $(CURDIR)).hex
F_CPU=20000000L
CFLAGS=-mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/ -O3
CFLAGS+=-I ../Atmel.ATtiny_DFP.1.6.326/include/ -DF_CPU=$(F_CPU)
LDFLAGS=-mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/
CC=avr-gcc
LD=avr-gcc
all: $(HEX)
$(ELF): $(OBJS)
$(LD) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
$(HEX): $(ELF)
avr-objcopy -O ihex -R .eeprom $< $@
flash: $(HEX)
pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -f attiny406-test.hex
read-fuses:
pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -fr
clean:
rm -rf $(OBJS) $(ELF) $(HEX)
لتجميع الكود ، ما عليك سوى تشغيل الأمر
make. يتم تنزيل الكود إلى وحدة التحكم الدقيقة بواسطة الأمر make flash. المقدمة من قبلنا Makefileيمكن أن يكون، إذا لزم الأمر، المنقحة.
النتيجة
إن TinyAVRs الجديدة سهلة البرمجة مثل الأجيال السابقة من MCUs. المفتاح هو العثور على الأدوات الصحيحة. إذا كانت لديك أية نصائح حول برمجة AVRTiny ، فيرجى مشاركتها معنا على Twitter أو في التعليقات أدناه.
هل تخطط لاستخدام TinyAVR الجديد في مشاريعك؟
