جدول المحتويات:
- الخطوة 1: كيف يمكننا الحصول على اثنين من وحدات التحكم الدقيقة للتحدث مع بعضنا البعض؟
- الخطوة 2: الاتصالات الفرعية
- الخطوة الثالثة: الخاتمة
فيديو: برنامج AVR Assembler التعليمي 6: 3 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:35
مرحبًا بك في البرنامج التعليمي 6!
سيكون البرنامج التعليمي اليوم قصيرًا حيث سنطور طريقة بسيطة لتوصيل البيانات بين واحد atmega328p وآخر باستخدام منفذين يربطانهما. سنأخذ بعد ذلك بكرة النرد من البرنامج التعليمي 4 ومحلل التسجيل من البرنامج التعليمي 5 ، ونوصلهما معًا ، ونستخدم طريقتنا لإيصال نتيجة لفات النرد من الأسطوانة إلى المحلل. سنقوم بعد ذلك بطباعة الملف الثنائي باستخدام مصابيح LED التي أنشأناها للمحلل في البرنامج التعليمي 5. وبمجرد الانتهاء من هذا العمل ، سنكون قادرين على إنشاء الجزء التالي من مشروعنا العام في البرنامج التعليمي التالي.
ستحتاج في هذا البرنامج التعليمي إلى:
- لوحة النماذج الخاصة بك
- بكرة النرد الخاصة بك من البرنامج التعليمي 4
- محلل التسجيل الخاص بك من البرنامج التعليمي 5
- اثنان من الأسلاك المتصلة
-
نسخة من ورقة البيانات الكاملة (مراجعة 2014):
www.atmel.com/images/Atmel-8271-8-bit-AVR-M…
-
نسخة من دليل مجموعة التعليمات (مراجعة 2014):
www.atmel.com/images/atmel-0856-avr-instruc…
هنا رابط إلى المجموعة الكاملة من دروس مجمّع AVR الخاصة بي:
الخطوة 1: كيف يمكننا الحصول على اثنين من وحدات التحكم الدقيقة للتحدث مع بعضنا البعض؟
نظرًا لأننا بدأنا في توسيع مشروعنا بحيث يتكون منتجنا النهائي الفردي من مجموعة من الأجزاء الأصغر ، فسنحتاج إلى المزيد من الدبابيس أكثر مما يمكن أن يوفره Atmega328P واحد. لذلك سنقوم بكل جزء من المشروع الكلي على متحكم منفصل ومن ثم نطلب منهم مشاركة البيانات بينهم. لذا فإن المشكلة التي نحتاج إلى حلها هي كيف يمكننا التوصل إلى طريقة بسيطة للمراقبين للتحدث مع بعضهم البعض ونقل البيانات بينهم؟ حسنًا ، هناك شيء واحد بخصوص وحدات التحكم هذه هو أنها تنفذ 16 مليون أمر في الثانية. هذا توقيت دقيق للغاية ولذا يمكننا استخدام هذا التوقيت لنقل البيانات. إذا استخدمنا تأخيرات بالمللي ثانية لتكوين البيانات ، فلا يتعين علينا حقًا أن نكون دقيقين تمامًا لأن وحدة المعالجة المركزية تنفذ 16000 تعليمات في جزء من الثانية. بمعنى آخر ، الميلي ثانية هي أبدية لوحدة المعالجة المركزية. لذلك دعونا نجربها مع لفات النرد. أريد أن أنقل نتيجة لفة النرد من شريحة بكرة النرد إلى شريحة المحلل. لنفترض أنك كنت تقف في الجانب الآخر من الشارع وأردت أن أشير إليك نتيجة رمي زوج من النرد. شيء واحد يمكنني القيام به ، إذا كان كلانا يمتلك ساعة ، هو أنه يمكنني تشغيل مصباح يدوي ، ثم عندما تكون مستعدًا لاستلام بياناتي ، تقوم بتشغيل المصباح الخاص بك ويبدأ كلانا في تشغيل ساعاتنا. ثم أحتفظ بالمصباح اليدوي الخاص بي للعدد الدقيق من المللي ثانية حيث يتدحرج النرد ثم أغلقه. لذلك إذا قمت بتدوير 12 ، فسوف أبقي الضوء مضاءًا لمدة 12 مللي ثانية. الآن المشكلة مع ما سبق هي أنه ، بالنسبة لي ولك ، لا توجد طريقة يمكننا من خلالها ضبط الوقت بدقة كافية للتمييز بين 5 ميلي ثانية و 12 مللي ثانية. ولكن ماذا عن هذا: لنفترض أننا قررنا أن أبقي الضوء مضاءًا لمدة عام واحد لكل رقم على النرد؟ ثم إذا قمت بتدوير الرقم 12 ، فسوف أسلط الضوء عليك لمدة 12 عامًا وأعتقد أنك ستوافق على أنه لا يوجد احتمال لارتكاب خطأ في معرفة الرقم بشكل صحيح؟ يمكنك أخذ قسط من الراحة والذهاب للعب البيسبول ، بل يمكنك الذهاب للعب كرابس في فيغاس لمدة 6 أشهر ، طالما أنه في وقت ما خلال العام لإلقاء نظرة خاطفة على الشارع لمعرفة ما إذا كان الضوء مضاءًا فلن يفوتك أي عدد. حسنًا ، هذا هو بالضبط ما نفعله للميكروكونترولر! إن المللي ثانية الواحدة لوحدة المعالجة المركزية هي مثل العام. لذلك إذا قمت بتشغيل الإشارة لمدة 12 مللي ثانية ، فليس هناك أي فرصة تقريبًا لأن المتحكم الآخر سوف يربكها لمدة 10 أو 11 بغض النظر عن المقاطعات وما لا يحدث في هذه الأثناء. بالنسبة للميكروكونترولر ، فإن الملي ثانية هي الأبدية ، لذا فإليك ما سنفعله. أولاً سنختار منفذين على وحدة التحكم ليكونا منافذ الاتصال الخاصة بنا. سأستخدم PD6 لتلقي البيانات (يمكننا تسميتها Rx إذا أردنا) وسأختار PD7 لنقل البيانات (يمكننا تسميتها Tx إذا أردنا). ستتحقق شريحة المحلل بشكل دوري من دبوس Rx وإذا رأت إشارة ، فسوف تنخفض إلى "روتين فرعي للاتصال" ثم ترسل إشارة عودة إلى بكرة النرد قائلة إنها جاهزة للاستقبال. سيبدأ كلاهما التوقيت وستقوم أسطوانة النرد بإرسال إشارة (أي 5 فولت) لملي ثانية لكل رقم على النرد. لذلك إذا كانت اللفة عبارة عن ستين مزدوجين ، أو 12 ، فإن بكرة النرد ستضبط PD7 على 5V لمدة 12 مللي ثانية ثم تعيدها إلى 0V. سيقوم المحلل بفحص دبوس PD6 الخاص به كل مللي ثانية ، مع العد في كل مرة ، وعندما يعود إلى 0 فولت ، فإنه يقوم بإخراج الرقم الناتج إلى شاشة المحلل ، ويظهر اثني عشر في ثنائي على LED. إذن هذه هي الخطة. دعونا نرى ما إذا كان يمكننا تنفيذه.
الخطوة 2: الاتصالات الفرعية
أول شيء يتعين علينا القيام به هو توصيل جهازي التحكم. لذا ، خذ سلكًا من PD6 على أحدهما وقم بتوصيله بـ PD7 على الآخر ، والعكس صحيح. ثم قم بتهيئتها عن طريق ضبط PD7 على OUTPUT على كلاهما و PD6 على INPUT على كليهما. أخيرًا ، قم بتعيين كل منهم على 0V. على وجه التحديد ، أضف ما يلي إلى قسم التهيئة أو إعادة التعيين من الكود في كل وحدة تحكم دقيقة:
sbi DDRD ، 7 ؛ تم تعيين PD7 للإخراج
cbi PortD ، 7 ؛ PD7 مبدئيًا 0V cbi DDRD ، 6 ؛ تم تعيين PD6 لإدخال cbi PortD، 6 ؛ PD6 في البداية 0V clr الإجمالي ؛ المجموع على النرد في البداية 0
لنقم الآن بإعداد روتين الاتصالات على شريحة بكرة النرد. حدد أولاً متغيرًا جديدًا في الجزء العلوي يسمى "إجمالي" والذي سيخزن العدد الإجمالي الذي تم تدحرجه على زوج النرد وتهيئته إلى الصفر.
ثم اكتب روتين فرعي للتواصل مع المحلل:
نقل:
cbi PortD، 7 sbi PortD، 7؛ إرسال انتظار إشارة جاهزة: sbic PinD ، 6 ؛ قراءة PinD وتخطي إذا كان تأخير الانتظار 0V rjmp 8 ؛ تأخير للمزامنة (وجدت هذا تجريبيًا) الإرسال: التأخير الكلي في ديسمبر 2 ؛ التأخير لكل عدد cpi إجمالي عدد القوالب ، 0 ؛ 0 هنا يعني أنه تم إرسال عدد التأخيرات "الإجمالي" breq PC + 2 rjmp send cbi PortD، 7 ؛ مجموع PD7 إلى 0V clr ؛ إعادة تعيين مجموع النرد إلى 0 ret
في المحلل نضيف rcall من الروتين الرئيسي إلى الروتين الفرعي للتواصل:
محلل clr الاستعداد لرقم جديد
sbic دبوس ، 6 ؛ تحقق من PD6 للحصول على إشارة 5V rcall للتواصل ؛ إذا انتقل 5V إلى التواصل مع محلل mov ، إجمالي ؛ الإخراج إلى محلل عرض rcall محلل
ثم اكتب روتين الاتصال الفرعي على النحو التالي:
نقل:
مجموع clr إعادة تعيين المجموع إلى 0 تأخير 10 ؛ تأخير للتخلص من ترتد sbi PortD ، 7 ؛ اضبط PB7 على 5V للإشارة إلى الاستلام الجاهز: تأخير 2 ؛ انتظر العدد التالي inc total؛ زيادة مجموع sbic PinD ، 6 ؛ إذا عاد PD6 إلى 0V ، فقد انتهينا من تلقي rjmp ؛ خلاف ذلك حلقة النسخ الاحتياطي لمزيد من البيانات cbi PortD ، 7 ؛ إعادة تعيين PD7 عند الانتهاء
ها أنت ذا! الآن تم إعداد كل متحكم لإيصال نتيجة لفة النرد ثم عرضها على المحلل.
سنقوم بتطبيق طريقة أكثر فاعلية للتواصل فيما بعد عندما نحتاج إلى نقل محتويات السجل بين وحدات التحكم بدلاً من مجرد لفة نرد. في هذه الحالة ، سنستمر في استخدام سلكين فقط لربطهما ولكننا سنستخدم 1 ، 1 ليعني "بدء الإرسال" ؛ 0 ، 1 تعني "1" ؛ 1 ، 0 تعني "0" ؛ وأخيراً 0 ، 0 تعني "الإرسال النهائي".
التمرين 1: تحقق مما إذا كان يمكنك تنفيذ الطريقة الأفضل واستخدامها لنقل لفة النرد كرقم ثنائي مكون من 8 بتات.
سوف أرفق مقطع فيديو يظهر عملي.
الخطوة الثالثة: الخاتمة
لقد أرفقت الرمز الكامل للرجوع إليه. إنه ليس نظيفًا ومرتبًا كما أرغب ، لكنني سأقوم بتنظيفه أثناء توسيعه في البرامج التعليمية المستقبلية.
من الآن فصاعدًا ، سأقوم فقط بإرفاق الملفات التي تحتوي على رمز بدلاً من كتابتها كلها هنا. سنقوم فقط بكتابة الأقسام التي نهتم بمناقشتها.
كان هذا برنامجًا تعليميًا قصيرًا حيث توصلنا إلى طريقة بسيطة لإخبار وحدة التحكم الدقيقة للمحلل لدينا بنتيجة لفة النرد من وحدة التحكم الدقيقة بكرة النرد أثناء استخدام منفذين فقط.
التمرين 2: بدلاً من استخدام إشارة جاهزة لإظهار متى تكون بكرة النرد جاهزة للإرسال وأخرى عندما يكون المحلل جاهزًا للاستقبال ، استخدم "مقاطعة خارجية" تسمى "Pin Change Interrupt". يمكن استخدام المسامير الموجودة على atmega328p بهذه الطريقة وهذا هو سبب وجود PCINT0 عبر PCINT23 بجانبها في مخطط pinout. يمكنك تنفيذ هذا كمقاطعة بطريقة مماثلة كما فعلنا مع مقاطعة تجاوز تدفق المؤقت. في هذه الحالة ، سيكون "معالج" المقاطعة هو الإجراء الفرعي الذي يتصل بأسطوانة النرد. بهذه الطريقة ، لن تحتاج إلى استدعاء روتين الاتصالات الفرعي من main: سوف يذهب إلى هناك في أي وقت يحدث فيه مقاطعة قادمة من تغيير الحالة على هذا الدبوس.
التمرين 3: هناك طريقة أفضل بكثير لتوصيل البيانات ونقلها بين وحدة تحكم دقيقة إلى مجموعة أخرى ، وهي استخدام الواجهة التسلسلية المضمنة بسلكين في وحدة التحكم الدقيقة نفسها. حاول قراءة القسم 22 من ورقة البيانات ومعرفة ما إذا كان يمكنك معرفة كيفية تنفيذها.
سنستخدم هذه التقنيات الأكثر تعقيدًا في المستقبل عندما نضيف المزيد من وحدات التحكم.
حقيقة أن كل ما فعلناه مع المحلل الخاص بنا هو أخذ إجمالي لفة النرد ثم طباعتها في صورة ثنائية باستخدام مصابيح LED ليس بالأمر المهم. الحقيقة هي أن محللنا الآن "يعرف" ماهية لفة النرد ويمكنه استخدامها وفقًا لذلك.
في البرنامج التعليمي التالي ، سنقوم بتغيير الغرض من "المحلل" الخاص بنا ، وإدخال بعض عناصر الدوائر الإضافية ، واستخدام لفة النرد بطريقة أكثر تشويقًا.
حتى المرة القادمة …
موصى به:
برنامج AVR Assembler التعليمي 2: 4 خطوات
برنامج AVR Assembler التعليمي 2: هذا البرنامج التعليمي هو استمرار لـ & quot؛ برنامج AVR Assembler التعليمي 1 & quot؛ إذا لم تكن قد مررت بالبرنامج التعليمي 1 ، فعليك التوقف الآن والقيام بذلك أولاً. في هذا البرنامج التعليمي سنواصل دراستنا لبرمجة لغة التجميع لـ atmega328p u
برنامج AVR Assembler التعليمي 1: 5 خطوات
برنامج AVR Assembler التعليمي 1: لقد قررت كتابة سلسلة من البرامج التعليمية حول كيفية كتابة برامج لغة التجميع لـ Atmega328p وهو المتحكم الدقيق المستخدم في Arduino. إذا ظل الناس مهتمين ، فسأستمر في تخصيص واحد أسبوعيًا أو نحو ذلك حتى نفاد
برنامج AVR Assembler التعليمي 8: 4 خطوات
برنامج AVR Assembler التعليمي 8: مرحبًا بك في البرنامج التعليمي 8! في هذا البرنامج التعليمي القصير ، سنأخذ القليل من التحويل من تقديم جوانب جديدة لبرمجة لغة التجميع لإظهار كيفية نقل مكونات النماذج الأولية الخاصة بنا إلى & quot؛ مطبوعة & quot؛ منفصلة لوحة دائرة كهربائية. ال
برنامج AVR Assembler التعليمي 7: 12 خطوات
برنامج AVR Assembler التعليمي 7: مرحبًا بك في البرنامج التعليمي 7 ، سنقوم اليوم بعرض كيفية تنظيف لوحة المفاتيح أولاً ، ثم نوضح كيفية استخدام منافذ الإدخال التناظرية للتواصل مع لوحة المفاتيح. إدخال. سنقوم بتوصيل لوحة المفاتيح حتى
برنامج AVR Assembler التعليمي 9: 7 خطوات
برنامج AVR Assembler التعليمي 9: مرحبًا بك في البرنامج التعليمي 9 ، سنعرض اليوم كيفية التحكم في كل من شاشة العرض المكونة من 7 أجزاء والشاشة المكونة من 4 أرقام باستخدام كود لغة التجميع ATmega328P و AVR. أثناء القيام بذلك ، سيتعين علينا إجراء تحويلات إلى كيفية استخدام المكدس