جدول المحتويات:

Attiny85 البرمجة المتزامنة أو القرع مع عيون متعددة الألوان: 7 خطوات
Attiny85 البرمجة المتزامنة أو القرع مع عيون متعددة الألوان: 7 خطوات

فيديو: Attiny85 البرمجة المتزامنة أو القرع مع عيون متعددة الألوان: 7 خطوات

فيديو: Attiny85 البرمجة المتزامنة أو القرع مع عيون متعددة الألوان: 7 خطوات
فيديو: ESP8266 Futures - Part 1/3: Function Chaining - Day 34 of #100DaysOfCode in IoT 2024, يوليو
Anonim

بواسطة jumbleviewJumbleview.info اتبع المزيد من المؤلف:

الصرخة
الصرخة
الصرخة
الصرخة
استبدال بطارية NiCd بمصدر طاقة خارجي
استبدال بطارية NiCd بمصدر طاقة خارجي
استبدال بطارية NiCd بمصدر طاقة خارجي
استبدال بطارية NiCd بمصدر طاقة خارجي
مقبض الكاميرا الرقمية
مقبض الكاميرا الرقمية
مقبض الكاميرا الرقمية
مقبض الكاميرا الرقمية

حول: أعمل كمهندس برمجيات في إحدى شركات Bay Area (California). كلما كان لدي وقت أحب برمجة وحدات التحكم الصغيرة ، وبناء الألعاب الميكانيكية ، والقيام ببعض مشاريع تحسين المنزل. المزيد حول jumbleview »

يوضح هذا المشروع كيفية التحكم في اثنين من مصابيح الأنود الشائعة ذات الألوان الثلاثة مقاس 10 مم (عيون متعددة الألوان من Pumpkin Halloween Glitter) باستخدام شريحة Attiny85. الهدف من المشروع هو تعريف القارئ بفن البرمجة المتزامنة واستخدام مكتبة آدم دنكلس الأولية. يفترض هذا المشروع أن القارئ يعرف عن وحدات التحكم AVR 8 بت ، ويمكنه كتابة بعض برامج C ولديه بعض الخبرة مع Atmel studio.

كود المشروع المنشور على جيثب:

اللوازم

قبل البرمجة لا يزال المرء بحاجة إلى بناء الدائرة. فيما يلي المكونات:

  • تحكم Attiny85 (أي مورد إلكتروني).
  • اثنان من ثلاثة ألوان 10 ملم LEDs مع الأنود المشترك. مصابيح Adafruit
  • المقاومات 100 أوم ، 120 أوم ، 150 أوم 0.125 أو 0.250 واط (أي مورد إلكتروني).
  • ستة رأس دبوس لواجهة AVR ISP. يمكن صنعه من رأس Adafruit هذا
  • بعض ألواح الخبز أو لوحة القالب المطبوعة. لقد استخدمت هذا
  • واجهة AVR ISP MKII و Atmel Studio 6.1 (يجب أن يعمل الإصدار الأخير أيضًا).

الخطوة 1: Circut

سيركت
سيركت

يستخدم التصميم خمسة دبابيس رقاقة:

  • يتم استخدام دبابيس للتحكم في الأنودات: كل أنود LED متصل بالدبوس المخصص.
  • ثلاثة دبابيس متصلة (من خلال المقاومات) بمصابيح LED كاثودات (نفس الكاثود اللوني لكل مصباح LED متصل بنفس الدبوس)

قد يتساءل المرء: لماذا لا تستخدم جميع المسامير الستة للداخل / الخارج للرقاقة بحيث يتم توصيل أنودات LED مباشرة بـ +5 v وسيكون لكل كاثود دبوس مخصص؟ هذا سيجعل البرمجة مباشرة. للأسف ، هناك مشكلة: دبوس PB5 (إعادة تعيين) هو دبوس ضعيف قادر على توفير ~ 2 مللي أمبير فقط من التيار ، بينما هناك حاجة إلى 20 مللي أمبير تقريبًا.

بالطبع يمكن للمرء أن يبني مضخم ترانزستور لهذا الدبوس الضعيف لكني أنا نفسي كلما أمكن ذلك أفضل حل المشكلة من خلال الكود.

الخطوة 2: مخطط التوقيت

الرسم البياني توقيت
الرسم البياني توقيت

يساعدنا مخطط التوقيت على فهم ما نحتاج إلى برمجته.

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

كما نرى هناك ترابط على حالة الدبابيس. بدون إطار عمل لن يكون من السهل حلها. وهذا هو المكان الذي تصبح فيه مكتبة الخيوط الأولية في متناول يدي.

الخطوة الثالثة: البرمجة. وحدات الماكرو والتعريفات

برمجة. وحدات الماكرو والتعريفات
برمجة. وحدات الماكرو والتعريفات

مثال في خطوات البرمجة يمثل نسخة مبسطة قليلا. تم اختصار البرنامج واستبدال بعض التعريف الرمزي بثوابت صريحة.

دعونا نبدأ من البداية. يتضمن البرنامج الملفات القادمة مع Atmel Studio بالإضافة إلى رأس مكتبة الخيوط الأولية. بعد ذلك ، هناك نوعان من وحدات الماكرو لمعالجة مستويات الدبابيس وبعض التعريفات لإعطاء أسماء منطقية لإشارات الدبوس. حتى الآن لا يوجد شيء خاص.

الخطوة 4: البرمجة. الحلقة الرئيسية

برمجة. الحلقة الرئيسية
برمجة. الحلقة الرئيسية

ثم دعونا نلقي نظرة على النهاية لمعرفة ما يحتويه الإجراء الرئيسي.

تظل الوظيفة الرئيسية بعد إجراء بعض التهيئة في حلقة دائمة. في هذه الحلقة يقوم بالخطوات التالية:

  • يستدعي روتين خيط أولي لمصباح LED الأيسر. يغير بعض الجهد الدبابيس.
  • جعل تأخير ملي ثانية. لا يوجد تغيير في جهد الدبوس.
  • يستدعي خيط أولي لمصباح LED الأيمن. يغير بعض الجهد دبوس.
  • جعل 2 MS تأخير. لا يوجد تغيير في جهد الدبوس.

الخطوة الخامسة: البرمجة. وظائف مساعدة

برمجة. وظائف مساعدة
برمجة. وظائف مساعدة

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

وهناك وظيفة أخرى سيتم استدعاؤها مباشرة من خلال روتين خيط أولي. اسمها هو DoAndCountdown ().

من الناحية الفنية ، فإن استخدام مثل هذه الوظيفة ليس إلزاميًا ولكني وجدته مناسبًا. لها ثلاث حجج:

  • مؤشر لوظيفة إعداد لون LED (مثل RedColor أو GreenColor أو ما إلى ذلك)
  • القيمة الأولية للعداد العكسي: عدد المرات التي يجب فيها استدعاء هذه الوظيفة في مرحلة خيط أولية معينة.
  • مؤشر لعكس العداد. من المفترض أنه عندما يكون هناك تغيير في اللون ، يكون العداد العكسي 0 ، لذلك في البداية سيتم تعيين رمز التكرار لتلك القيمة الأولية للعداد. بعد إنقاص كل عداد تكرار.

الدالة DoAndCountdown () ترجع قيمة العداد العكسي.

الخطوة السادسة: البرمجة. إجراءات Protothread

برمجة. إجراءات Protothread
برمجة. إجراءات Protothread

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

يتم استدعاء الوظيفة مع وسيطتين:

  • مؤشر لبنية خيوط أولية. تمت تهيئة هذا الهيكل بواسطة main قبل أن تبدأ الحلقة الرئيسية.
  • مؤشر لعكس العداد. تم ضبطه على 0 بواسطة main قبل أن تبدأ الحلقة الرئيسية.

وظيفة مجموعة الفولتية لتنشيط مؤشر LED الأيسر ثم يبدأ مقطع الحلقة الأولية. يقع هذا المقطع بين وحدات الماكرو PT_BEGIN و PT_END. يوجد في الداخل بعض التعليمات البرمجية التي في حالتنا لا تكرر سوى وحدات الماكرو PT_WAIT_UNTIL. يتم تنفيذ وحدات الماكرو التالية:

  • استدعاء وظيفة DoAndCountdown. هذا يضبط الجهد على كاثودات LED لإصدار لون معين.
  • النتيجة التي تم إرجاعها مقارنة بـ 0. إذا كان الشرط "خاطئ" ، فإن دالة الخط الأولي تعود فورًا وتؤدي إلى التحكم في الحلقة الرئيسية.
  • عندما يتم استدعاء خيط أولي في المرة التالية ، فإنه ينفذ مرة أخرى التعليمات البرمجية قبل PT_BEGIN ، ثم يقفز مباشرةً داخل وحدات الماكرو PT_WAIT_UNTIL التي تم إرجاعها منها في المرة الأخيرة.
  • تتكرر مثل هذه الإجراءات حتى تكون نتيجة DoAndCountdown هي 0. في هذه الحالة لا يوجد عودة ، يظل البرنامج في خيوط أولية وينفذ السطر التالي من الكود. في حالتنا هو PT_WAIT_UNTIL التالي ولكن بشكل عام يمكن أن يكون أي رمز C تقريبًا.
  • عند التنفيذ الأولي للعداد العكسي PT_WAIT_UNTIL الثاني هو 0 ، لذا فإن الإجراء DoAndCountdown () اضبطه على القيمة الأولية. سيتم تنفيذ وحدات الماكرو الثانية مرة أخرى 250 مرة حتى يصل عداد الانعكاس إلى 0.
  • تتم إعادة تعيين حالة البنية بمجرد وصول التحكم إلى وحدات الماكرو PT_END. عندما يتم استدعاء دالة protothread في المرة القادمة يبدأ مقطع protothread تنفيذ سطر من الكود مباشرة بعد PT_BEGIN.

يوجد روتين خيط أولي مشابه لمصباح LED الأيمن. في مثالنا ، يفرض فقط ترتيبًا مختلفًا للألوان ، ولكن إذا قمنا بذلك بشكل مختلف تمامًا: لا يوجد اقتران ضيق بين روتين LED الأيمن والأيسر.

الخطوة 7: باطني

الداخلية
الداخلية

البرنامج بأكمله أقل من 200 سطر من التعليمات البرمجية (مع التعليقات والأسطر الفارغة) ويستهلك أقل من 20٪ من ذاكرة كود Attiny85. إذا لزم الأمر ، فمن الممكن استخدام العديد من إجراءات الخيوط الأولية وتعيين منطق أكثر تعقيدًا لهم.

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

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

ربما تريد أن تعرف كيف يعمل الخيط الأولي في الواقع؟ أين يختبئ السحر؟ تعتمد Protothreads على ميزة لغة C الخاصة: حقيقة أن بيان حالة C switch قد يتم تضمينه في if أو بعض الكتل الأخرى (مثل while أو for). قد تجد التفاصيل على موقع Adam Dunkels

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

موصى به: