فئات: دوائر متحكم
مرات المشاهدة: 41940
تعليقات على المقال: 5
طرق لقراءة وإدارة منافذ الإدخال / الإخراج من Arduino
للتفاعل مع العالم الخارجي ، تحتاج إلى تكوين مخرجات متحكم لتلقي إشارة أو نقلها. نتيجة لذلك ، سيعمل كل دبوس في وضع الإدخال والإخراج. هناك طريقتان للقيام بذلك على لوحة Arduino المفضلة لديك ، بالضبط كيف ستتعلم من هذه المقالة.

الطريقة الأولى - اللغة القياسية لـ Arduino IDE
الجميع يعرف ذلك اردوينو مبرمجة في C ++ مع بعض التكيف والتبسيط للمبتدئين. ويسمى الأسلاك. في البداية ، يتم تعريف جميع منافذ اردوينو على أنها مدخلات ، وليس هناك حاجة لتحديد ذلك في الكود.
تتم كتابة المنافذ عادة في وظيفة التهيئة المتغيرة:
إعداد باطل ()
{
// الرمز
}
للقيام بذلك ، استخدم الأمر pinMode ، به بناء جملة بسيط إلى حد ما ، أوضح أولاً رقم المنفذ ، ثم دوره ، مفصولة بفواصل.
pinMode (nomer_porta ، naznachenie)
باستخدام هذا الأمر ، يتم تكوين الدوائر الداخلية للتحكم بطريقة معينة.
هناك ثلاثة أوضاع يمكن أن يعمل بها المنفذ: الإدخال - الإدخال ، في هذا الوضع يحدث قراءة البيانات من أجهزة الاستشعار، حالة زر ، التناظرية والرقمية إشارة. يقع الميناء في ما يسمى حالة مقاومة عالية ، وبعبارة بسيطة - المدخلات لديها مقاومة عالية. يتم تعيين هذه القيمة ، على سبيل المثال ، 13 دبوس من اللوحة ، إذا لزم الأمر ، على النحو التالي:
pinMode (13 ، INPUT) ؛
الإخراج - الإخراج ، اعتمادًا على الأمر الموضح في الكود ، يأخذ المنفذ قيمة واحدة أو صفر. يصبح الإخراج نوعًا من مصدر الطاقة المتحكم به وينتج أقصى تيار (في حالتنا ، 20 مللي أمبير و 40 مللي أمبير في الذروة) للحمل المتصل به. لتعيين منفذ كإخراج إلى Arduino ، يلزمك إدخال:
pinMode (13 ، الإخراج) ؛
INPUT_PULLUP - يعمل المنفذ كمدخل ، ولكن ما يسمى يتصل به. 20 كيلو متر المقاوم متابعة.
فيما يلي الدوائر الداخلية الشرطية للمنفذ في هذه الحالة. تتمثل إحدى ميزات هذا الإدخال في أن إشارة الدخل تعتبر مقلوبة ("الوحدة" في الإدخال يتم إدراكها بواسطة المتحكم الدقيق "صفر"). في هذا الوضع ، لا يمكنك استخدام مقاومات سحب خارجية عند العمل مع الأزرار.
pinMode (13 ، INPUT_PULLUP) ؛

يتم استلام البيانات من المنافذ ويتم إرسالها إليهم بواسطة الأوامر:
-
digitalWrite (رقم التعريف الشخصي ، القيمة) - يحول دبوس الإخراج إلى منطقية 1 أو 0 ، على التوالي ، يظهر جهد 5V أو يختفي عند الإخراج ، على سبيل المثال digitalWrite (13 ، HIGH) - يوفر 5 فولت (وحدة منطقية) إلى 13 دبابيس ، و digitalWrite (13 ، منخفض ) - يترجم 13 دبابيس إلى حالة من الصفر المنطقي (0 فولت) ؛
-
digitalRead (pin) - يقرأ القيمة من المدخلات ، على سبيل المثال digitalRead (10) ، يقرأ الإشارة من 10 دبابيس ؛
-
analogRead (pin) - يقرأ إشارة تمثيلية من منفذ تمثيلي ، تحصل على قيمة في النطاق من 0 إلى 1023 (ضمن ADC 10 بت) ، مثال هو analogRead (3).
الطريقة الثانية - إدارة المنافذ من خلال سجلات Atmega وتسريع التعليمات البرمجية
هذا التحكم بسيط بالطبع ، ولكن في هذه الحالة هناك عيبان - استهلاك أكبر للذاكرة وضعف الأداء عند العمل مع المنافذ. ولكن تذكر ما هو Arduino ، بغض النظر عن لوحة الخيار (uno ، micro ، nano)؟ بادئ ذي بدء ، هذا متحكم AVR الأسرة ATMEGA، استخدمت مؤخرا MK atmega328.
في Arduino IDE ، يمكنك برمجة لغة C AVR الأصلية لهذه العائلة ، كما لو كنت تعمل مع متحكم منفصل. لكن أول الأشياء أولا. لإدارة منافذ Arduino بهذه الطريقة ، عليك أولاً التفكير بعناية في الرسم التوضيحي التالي.
ربما سيقوم شخص ما بفحص المنافذ في هذا النموذج بشكل أكثر وضوحًا (نفس الشيء في الشكل ، ولكن في تصميم مختلف):

هنا ترى مراسلات استنتاجات اردوينو وأسماء موانئ أتميغا. لذلك ، لدينا 3 منافذ:
-
PORTB.
-
PORTC.
-
PORTD.
بناءً على الصور المعروضة ، قمت بتجميع جدول المراسلات بين موانئ Arduino و Atmega ، سيكون مفيدًا لك في المستقبل.

يحتوي Atmega على ثلاث سجلات من 8 بت تتحكم في حالة المنافذ ، على سبيل المثال ، سيتعرف المنفذ B على الغرض من ذلك من خلال رسم القياس باستخدام أدوات الأسلاك القياسية الموضحة في بداية هذه المقالة:
-
PORTB - إدارة حالة الإخراج. إذا كان الدبوس في وضع "الإخراج" ، فإن 1 و 0 يحددان وجود نفس الإشارات في الخرج. إذا كان الدبوس في وضع "الإدخال" ، فإن 1 يربط المقاوم بالسحب (مثل INPUT_PULLUP الذي تمت مناقشته أعلاه) ، إذا كانت 0 هي حالة مقاومة عالية (تناظرية INPUT) ؛
-
PINB هو سجل القراءة. وفقًا لذلك ، يحتوي على معلومات حول الحالة الحالية لدبابيس المنفذ (الوحدة المنطقية أو الصفر).
-
DDRB - سجل اتجاه الميناء. مع ذلك ، تشير إلى متحكم ما إذا كان المنفذ هو إدخال أو إخراج ، مع "1" إخراج و "0" إدخال.
بدلاً من الحرف "B" ، يمكن أن يكون هناك أي شيء آخر وفقًا لأسماء المنافذ ، على سبيل المثال ، تعمل أوامر PORTD أو PORTC الأخرى بشكل مشابه.
نحن نغمض مؤشر LED ، واستبدل وظيفة digitalWrite () القياسية. أولاً ، دعنا نتذكر كيف يبدو المثال الأصلي من مكتبة Arduino IDE.

هذا هو رمز "وميض" المشهور ، والذي يظهر يومض المصباح المدمج في اللوحة.

التعليقات شرح الرمز. منطق هذا العمل هو على النحو التالي.
يضع الأمر PORTB B00100000 PB5 في حالة وحدة منطقية ، انظر ، وتلك الصور والجدول الموجود أدناه وترى أن PB5 يتوافق مع 13 دبوسًا من Arduina.
يشير الحرف "B" أمام الأرقام إلى أننا نكتب القيم في شكل ثنائي. ينتقل الترقيم بالثنائي من اليمين إلى اليسار ، أي هنا الوحدة في الجزء السادس من الحافة اليمنى للبت ، والتي تخبر متحكم حول التفاعل مع حالة بت السادس من سجل المنفذ B (PB5). يوضح الجدول أدناه بنية المنفذ D ، وهو مشابه ويتم تقديمه كمثال.

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

أدخل الرقم المطلوب:

وانقر على HEX:

في هذه الحالة ، ننقل كل هذا إلى Arduino IDE ، ولكن بدلاً من البادئة "B" ، ستكون "0x".

ولكن مع هذا الإدخال هناك مشكلة. إذا كان لديك أي شيء متصل بدبابيس أخرى ، فقم بإدخال أمر مثل B00010000 - ستقوم بإعادة تعيين جميع المسامير باستثناء 13 (PB5). يمكنك إدخال البيانات لكل دبوس على حدة. سيبدو مثل هذا:

قد يبدو هذا السجل غير مفهوم ، دعنا نتعرف عليه.

هذه عملية إضافة منطقية ، | = تعني إضافة شيء إلى محتويات المنفذ.

هذا يعني أنك تحتاج إلى إضافة كلمة مكونة من 8 بتات في السجل مع وحدة مبدلة بمقدار 5 بتات - نتيجة لذلك ، إذا تبين أن 11000010 هي 110،110،010. ظلت حالة المسامير متحكم دون تغيير.
ولكن مع الإضافة المنطقية ، تنشأ مشكلة - لا يمكنك تحويل الوحدة إلى صفر ، للأسباب التالية:
0+0=1
1+0=1
0+1=1
الضرب المنطقي والانعكاس سيساعدنا:

& = يعني ضرب محتويات المنفذ برقم محدد.

وهذا هو الرقم الذي نتضاعف به. تشير علامة "~" إلى انعكاس. في حالتنا ، الوحدة المقلوبة هي صفر. بمعنى ، نقوم بضرب محتويات المنفذ بمقدار صفر ، ونحوله إلى 5 بتات. على سبيل المثال ، كان 10110001 ، أصبح 10100001. بقيت البتات المتبقية دون تغيير.

يمكن القيام بنفس الشيء باستخدام العملية العكسية (^):
قراءة من المنافذ ، يتم تنفيذ analog لـ digitalRead () باستخدام سجل PIN ، ويبدو أنه في الممارسة العملية كما يلي:

نحن هنا نتحقق مما إذا كان التعبير الوارد بين قوسين يساوي الحالة الحقيقية للمنافذ ، أي وبالمثل إذا كتبنا إذا (digitalRead (12) == 1).
استنتاج
لماذا توجد مثل هذه الصعوبات في إدارة المنفذ إذا كان يمكنك استخدام وظائف ملائمة قياسية؟ كل شيء عن السرعة وحجم الرمز. عند استخدام الطريقة الثانية ، التي تمت مناقشتها في المقالة ، يتم تقليل حجم الرمز إلى حد كبير ، وتزداد السرعة بعدة أوامر من حيث الحجم. تم تنفيذ digitalWrite القياسي () في 1800 μs ، وتسجيله مباشرة إلى المنفذ في 0.2 μs ، و digitalRead () في 1900 μs ، وأصبح أيضًا 0.2 μs. تم العثور على طريقة التحكم هذه في المساحات المفتوحة للشبكة وغالبًا ما توجد في التعليمات البرمجية. مشاريع مكتملة.
انظر أيضا في electro-ar.tomathouse.com
: