برنامج AVR Assembler التعليمي 1: 5 خطوات
برنامج AVR Assembler التعليمي 1: 5 خطوات

فيديو: برنامج AVR Assembler التعليمي 1: 5 خطوات

فيديو: برنامج AVR Assembler التعليمي 1: 5 خطوات
فيديو: AVR Assembly Tutorial: Part 1 (Basic Commands) 2025, كانون الثاني
Anonim
برنامج AVR Assembler التعليمي 1
برنامج AVR Assembler التعليمي 1

لقد قررت أن أكتب سلسلة من الدروس حول كيفية كتابة برامج لغة التجميع لـ Atmega328p وهو المتحكم الدقيق المستخدم في Arduino. إذا ظل الناس مهتمين ، فسأستمر في تخصيص واحدة أسبوعيًا أو نحو ذلك حتى نفاد وقت الفراغ أو يتوقف الناس عن قراءتها.

أقوم بتشغيل Arch linux وأنا أعمل على atmega328p-pu تم إعداده على لوح التجارب. يمكنك القيام بذلك بنفس الطريقة مثلي أو يمكنك ببساطة توصيل اردوينو بجهاز الكمبيوتر الخاص بك والعمل على وحدة التحكم الدقيقة بهذه الطريقة.

سنقوم بكتابة برامج 328p مثل تلك الموجودة في معظم برامج arduino ولكن يجب ملاحظة أن هذه البرامج والتقنيات نفسها ستعمل أيضًا مع أي من وحدات التحكم الدقيقة Atmel وبعد ذلك (إذا كان هناك اهتمام) سنعمل مع بعض الآخرين كذلك. يمكن العثور على تفاصيل وحدة التحكم الدقيقة في أوراق بيانات Atmel ودليل مجموعة التعليمات. أنا أرفقهم بهذه التعليمات.

هنا هو ما سوف تحتاج إليها:

1. لوح التجارب

2. اردوينو ، أو مجرد متحكم

3. جهاز كمبيوتر يعمل بنظام Linux

4. مُجمّع avra باستخدام git: git clone https://github.com/Ro5bert/avra.git أو إذا كنت تستخدم نظامًا مبنيًا على ubuntu أو نظامًا قائمًا على دبيان ، فاكتب فقط "sudo apt install avra" وستحصل على كل من مُجمّع avr و avrdude. ومع ذلك ، إذا حصلت على أحدث إصدار باستخدام github ، فستحصل أيضًا على جميع ملفات التضمين الضرورية ، أي أنها تحتوي بالفعل على ملفات m328Pdef.inc و tn85def.inc.

5. avrdude

يمكن العثور على المجموعة الكاملة من دروس مجمّع AVR الخاصة بي هنا:

الخطوة 1: إنشاء لوحة اختبار

بناء لوحة اختبار
بناء لوحة اختبار

يمكنك ببساطة استخدام اردوينو الخاص بك والقيام بكل شيء في هذه الدروس حول ذلك إذا أردت. ومع ذلك ، نظرًا لأننا نتحدث عن الترميز في لغة التجميع ، فإن فلسفتنا في جوهرها تتمثل في تجريد كل الحواجز والتفاعل مباشرة مع المتحكم الدقيق نفسه. لذا ألا تعتقد أنه سيكون من الممتع أكثر أن تفعل ذلك بهذه الطريقة؟

بالنسبة لأولئك الذين يوافقون ، يمكنك سحب المتحكم الدقيق من اردوينو الخاص بك ثم البدء بإنشاء "Breadboard Arduino" باتباع الإرشادات هنا:

في الصورة ، أعرض إعدادي الذي يتكون من اثنين من Atmega328p مستقلين على لوح تجارب كبير (أريد أن أكون قادرًا على إبقاء البرنامج التعليمي السابق سلكيًا ومحملاً على متحكم واحد أثناء العمل على المتحكم التالي). لديّ مصدر طاقة تم إعداده بحيث يكون السكة العلوية 9 فولت وجميع الآخرين 5 فولت من منظم الجهد. يمكنني أيضًا استخدام لوحة اندلاع FT232R لبرمجة الرقائق. لقد اشتريتها ووضعت عليها بنفسي محمل الإقلاع ، ولكن إذا قمت للتو بسحب واحد من Arduino ، فهذا جيد بالفعل.

لاحظ أنه إذا كنت تحاول ذلك باستخدام ATtiny85 ، فيمكنك فقط الحصول على Sparkfun Tiny Programmer هنا: https://www.sparkfun.com/products/11801# ثم قم ببساطة بتوصيله بمنفذ USB على جهاز الكمبيوتر الخاص بك. ستحتاج إلى تثبيت محمل إقلاع على Attiny85 أولاً وأسهل طريقة هي استخدام Arduino IDE. ومع ذلك ، سوف تحتاج إلى النقر فوق ملف ، والتفضيلات ، ثم إضافة عنوان URL هذا الجديد للوحات: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json الذي سوف تمكنك من تثبيت أداة تحميل التشغيل (إذا لم يكن ATtiny85 الخاص بك مزودًا بالفعل بواحد.)

الخطوة 2: قم بتثبيت المجمع و Avrdude

يمكنك الآن تنزيل وتثبيت المجمّع و avrdude من الروابط الواردة في الخطوة الأولى من هذا البرنامج التعليمي. من المحتمل أنه إذا كنت تعمل بالفعل مع Arduino ، فأنت بالفعل مثبت عليه avrdude.

بعد تثبيت برنامج avra ، ستلاحظ وجود دليل فرعي يأتي معه يسمى "المصادر" وداخل هذا الدليل مجموعة من ملفات التضمين. هذه هي جميع المتحكمات الدقيقة التي يمكنك برمجتها باستخدام أفرا. ستلاحظ على الفور أنه لا يوجد ملف لـ 328p الذي نستخدمه هنا. لقد أرفقت واحدة. يجب أن يسمى الملف m328Pdef.inc ويجب أن تضعه داخل مجلد include أو في أي مكان آخر تريده. سنقوم بتضمينها في برامج لغة التجميع لدينا. كل ما يفعله هذا هو إعطاء كل من السجلات في أسماء وحدات التحكم الدقيقة من ورقة البيانات حتى لا نضطر إلى استخدام أسمائها السداسية العشرية. يحتوي ملف التضمين أعلاه على "توجيهات pragma" حيث تم تصميمه لبرمجة C و C ++. إذا سئمت من رؤية المجمع يبصق شكاوى "تجاهل توجيه براغما" ، فانتقل إلى الملف واحذف جميع الأسطر التي تبدأ بعلامة براغما أو قم بالتعليق عليها

حسنًا ، بعد أن أصبح لديك المتحكم الدقيق جاهزًا ، والمجمع جاهزًا ، والمبرمج جاهزًا ، يمكننا كتابة برنامجنا الأول.

ملاحظة: إذا كنت تستخدم ATtiny85 بدلاً من ATmega328P فأنت بحاجة إلى ملف تضمين مختلف يسمى tn85def.inc. سوف أرفقه أيضًا (لاحظ أنه كان علي أن أسميها tn85def.inc.txt حتى تسمح لي Instructables بتحميله.) ومع ذلك ، إذا حصلت على مُجمّع avra من github ، فهذا يعني أنه لديك بالفعل كلا الملفين معه. لذلك أوصي بالحصول عليها وتجميعها بنفسك: git clone

الخطوة 3: مرحبًا بالعالم

الهدف من هذا البرنامج التعليمي الأول هو بناء أول برنامج قياسي يكتبه المرء عند تعلم أي لغة جديدة أو استكشاف أي منصة إلكترونية جديدة. "مرحبا بالعالم!." في حالتنا ، نريد ببساطة كتابة برنامج لغة تجميع وتجميعه وتحميله إلى وحدة التحكم الدقيقة الخاصة بنا. سيتسبب البرنامج في تشغيل مؤشر LED. إن التسبب في "وميض" LED كما يفعلون في برنامج Arduino hello world العادي هو في الواقع برنامج أكثر تعقيدًا في لغة التجميع ولذا فإننا لن نفعل ذلك بعد. سنقوم بكتابة أبسط كود "عظام عارية" بأقل قدر من الزغب غير الضروري.

قم أولاً بتوصيل مؤشر LED من PB5 (انظر مخطط pinout) والذي يُسمى أيضًا Digital Out 13 على اردوينو ، بمقاوم 220 أوم ، ثم بـ GND. بمعنى آخر.

PB5 - LED - R (220 أوم) - GND

الآن لكتابة البرنامج. افتح محرر النصوص المفضل لديك وأنشئ ملفًا يسمى "hello.asm"

مرحباً يا أنا

؛ يقوم بتشغيل مؤشر LED متصل بـ PB5 (مخرج رقمي 13). يتضمن "./m328Pdef.inc" ldi r16، 0b00100000 out DDRB، r16 out PortB، r16 البداية: rjmp Start

ما ورد أعلاه هو الرمز. سنقوم بمراجعتها سطرًا بسطر في دقيقة واحدة ، ولكن دعنا أولاً نتأكد من أنه يمكننا تشغيلها على جهازك.

بعد إنشاء الملف ، تقوم بتجميعه في المحطة على النحو التالي:

مرحبا يا افرا

سيؤدي ذلك إلى تجميع الكود الخاص بك وإنشاء ملف يسمى hello.hex يمكننا تحميله على النحو التالي:

avrdude -p m328p -c stk500v1 -b 57600 -P / dev / ttyUSB0 -U فلاش: w: hello.hex

إذا كنت تستخدم لوحة اردوينو ، فسيتعين عليك الضغط على زر إعادة الضبط على لوحة اردوينو قبل تنفيذ الأمر أعلاه. لاحظ أنه قد تضطر أيضًا إلى إضافة sudo في المقدمة أو تنفيذه كجذر. لاحظ أيضًا أنه في بعض أجهزة arduino (مثل Arduino UNO) ، من المحتمل أن تضطر إلى تغيير معدل البت إلى -b 115200 والمنفذ -P / dev / ttyACM0 (إذا تلقيت خطأ من avrdude حول توقيع جهاز غير صالح ، فما عليك سوى إضافة - F للأمر)

إذا كان كل شيء يعمل كما ينبغي ، فسيكون لديك الآن مصباح LED مضاء ….. "Hello World!"

إذا كنت تستخدم ATtiny85 ، فسيكون الأمر avrdude:

avrdude -p attiny85 -c usbtiny -U flash: w: hello.hex

الخطوة 4: Hello.asm سطرًا بسطر

لإنهاء هذا البرنامج التعليمي التمهيدي ، سننتقل إلى برنامج hello.asm سطراً سطراً لنرى كيف يعمل.

مرحباً يا أنا

؛ يقوم بتشغيل مصباح LED متصل بـ PB5 (مخرج رقمي 13)

كل شيء بعد الفاصلة المنقوطة يتم تجاهله من قبل المُجمّع وبالتالي فإن هذين السطرين الأولين هما ببساطة "تعليقات" تشرح ما يفعله البرنامج.

.include "./m328Pdef.inc"

يخبر هذا السطر المجمع بتضمين ملف m328Pdef.inc الذي قمت بتنزيله. قد ترغب في وضع هذا في دليل يتضمن ملفات متشابهة ثم تغيير السطر أعلاه للإشارة إليه هناك.

ldi r16 ، 0b00100000

يرمز ldi إلى "التحميل الفوري" ويخبر المجمّع أن يأخذ سجل عمل ، r16 في هذه الحالة ، وتحميل رقم ثنائي فيه ، 0b00100000 في هذه الحالة. يشير 0b في المقدمة إلى أن رقمنا ثنائي. إذا أردنا اختيار قاعدة أخرى ، مثل سداسي عشري. في هذه الحالة ، سيكون رقمنا هو 0x20 وهو رقم سداسي عشري لـ 0b00100000. أو يمكننا استخدام 32 وهو رقم عشري للأساس 10 لنفس العدد.

التمرين 1: حاول تغيير الرقم في السطر أعلاه إلى رقم سداسي عشري ثم إلى رقم عشري في التعليمات البرمجية الخاصة بك وتحقق من أنه لا يزال يعمل في كل حالة.

يعد استخدام النظام الثنائي أبسط طريقة على الرغم من طريقة عمل المنافذ والسجلات. سنناقش منافذ وسجلات atmega328p بمزيد من التفاصيل في البرامج التعليمية المستقبلية ، لكن في الوقت الحالي سأذكر أننا نستخدم r16 كـ "سجل العمل" الخاص بنا مما يعني أننا سنستخدمه كمتغير نقوم بتخزينه الأرقام في. "التسجيل" هو مجموعة من 8 بتات. يعني 8 نقاط يمكن أن تكون إما 0 أو 1 ("إيقاف تشغيل" أو "تشغيل"). عندما نقوم بتحميل الرقم الثنائي 0b00100000 في السجل باستخدام السطر أعلاه ، قمنا ببساطة بتخزين هذا الرقم في السجل r16.

إخراج DDRB ، r16

يخبر هذا السطر المترجم بنسخ محتويات السجل r16 في سجل DDRB. يرمز DDRB إلى "Data Direction Register B" ويقوم بإعداد "الدبابيس" على PortB. على خريطة pinout لـ 328p ، يمكنك أن ترى أن هناك 8 دبابيس مسماة PB0 ، PB1 ، … ، PB7. تمثل هذه المسامير "بتات" "PortB" وعندما نقوم بتحميل الرقم الثنائي 00100000 في سجل DDRB ، فإننا نقول إننا نريد تعيين PB0 و PB1 و PB2 و PB3 و PB4 و PB6 و PB7 على أنها دبابيس INPUT نظرًا لأن لديهم 0 بداخلهم ، و PB5 تم تعيينه كدبوس إخراج لأننا وضعنا 1 في تلك البقعة.

مخرج PortB، r16

الآن وقد حددنا اتجاهات المسامير ، يمكننا الآن ضبط الفولتية عليها. ينسخ السطر أعلاه نفس الرقم الثنائي من سجل التخزين الخاص بنا r16 إلى PortB. يؤدي هذا إلى ضبط جميع المسامير على 0 فولت باستثناء دبوس PB5 إلى HIGH وهو 5 فولت.

التمرين 2: خذ مقياسًا رقميًا متعددًا ، وقم بتوصيل الرصاص الأسود بالأرض (GND) ، ثم اختبر كلًا من السنون PB0 إلى PB7 بالسلك الأحمر. هل الفولتية على كل سنون مطابقة تمامًا لوضع 0b00100000 في PortB؟ إذا كان هناك أي شيء غير موجود ، فلماذا تعتقد ذلك؟ (انظر خريطة الدبوس)

يبدأ:

rjmp ابدأ

أخيرًا ، السطر الأول أعلاه هو "التسمية" التي تسمي مكانًا في الشفرة. في هذه الحالة تسمية تلك البقعة على أنها "ابدأ". يقول السطر الثاني "الانتقال النسبي إلى التسمية ابدأ". والنتيجة النهائية هي أن الكمبيوتر يتم وضعه في حلقة لا نهائية تحافظ على إعادة التدوير إلى البداية. نحتاج إلى هذا لأنه لا يمكننا إنهاء البرنامج فقط ، أو السقوط من منحدر ، يجب أن يستمر البرنامج في العمل حتى يظل الضوء مضاءًا.

التمرين 3: قم بإزالة السطرين أعلاه من التعليمات البرمجية الخاصة بك بحيث يسقط البرنامج من الهاوية. ماذا يحدث؟ يجب أن ترى شيئًا يشبه برنامج "blink" التقليدي الذي تستخدمه Arduino كـ "hello world!". لماذا تعتقد أنه يتصرف بهذه الطريقة؟ (فكر فيما يجب أن يحدث عندما يسقط البرنامج من منحدر …)

الخطوة 5: الخاتمة

إذا وصلت إلى هذا الحد فتهانينا! أنت الآن قادر على كتابة كود التجميع وتجميعه وتحميله على وحدة التحكم الدقيقة الخاصة بك.

تعلمت في هذا البرنامج التعليمي كيفية استخدام الأوامر التالية:

تسجيل ldi ، يقوم الرقم بتحميل رقم (0-255) في سجل النصف العلوي (16-31)

خارج ioregister ، سجل نسخ رقم من سجل العمل إلى I / O سجل

تنتقل تسمية rjmp إلى سطر البرنامج المسمى بـ "التسمية" (والذي لا يمكن أن يكون أبعد من 204 تعليمات - أي قفزة نسبية)

الآن بعد أن أصبحت هذه الأساسيات بعيدة عن الطريق ، يمكننا الاستمرار في كتابة أكواد أكثر إثارة للاهتمام ودوائر وأجهزة أكثر إثارة للاهتمام دون الحاجة إلى مناقشة آليات التجميع والتحميل.

أتمنى أن تكون قد استمتعت بهذا البرنامج التعليمي التمهيدي. في البرنامج التعليمي التالي ، سنضيف مكون دائرة آخر (زر) ونوسع الكود الخاص بنا ليشمل منافذ الإدخال والقرارات.