সংকলকটি কোনও ত্রুটি সনাক্ত করবে না এবং কোডটি সংকলন এবং সম্পাদন করবে। সুতরাং, কী ঘটেছিল তা দেখার জন্য আমাদের নেপথ্যে পর্দার যাদুটি অন্বেষণ করতে হবে। একটি সংক্ষিপ্তসার জন্য, শেষ এড়িয়ে যান।
আপনার কোডের দ্বিতীয় লাইনটি হল যেখানে যাদুটি ঘটবে এবং সেখানে আমাদের ফোকাস করা দরকার ts
pinMode(pin, OUTPUT);
pinMode
এই আলোচনার জন্য প্রাসঙ্গিক অংশটি হ'ল:
void pinMode(uint8_t pin, uint8_t mode)
{
uint8_t bit = digitalPinToBitMask(pin); //The first instance where pin is used
uint8_t port = digitalPinToPort(pin);
if (port == NOT_A_PIN) return;
//Do something
}
(সম্পূর্ণ বাস্তবায়ন তারের_ডিজিটাল । সি-তে পাওয়া যাবে )
সুতরাং, এখানে, digitalPinToBitMask
মনে হয় pin
একটি মধ্যবর্তী বিট গণনা করতে ব্যবহার করা হয়। আরও অন্বেষণ, digitalPinToBitMask
একটি ম্যাক্রো সংজ্ঞায়িত করা হয়েছে Arduino.h
যার সংজ্ঞা এই ওয়ান-লাইনার:
#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
এই অদ্ভুত সন্ধানকারী এক লাইনার একটি খুব সাধারণ কাজ করে। এটি অ্যারেতে পি থিম উপাদানকে সূচক করে digital_pin_to_bit_mask_PGM
এবং এটি প্রদান করে। এই অ্যারেটি নির্দিষ্ট বোর্ডের জন্য নির্দিষ্ট করা বা পিন মানচিত্রটিতে digital_pin_to_bit_mask_PGM
সংজ্ঞায়িত করা হয়েছে pins_arduino.h
।
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
_BV(0), /* 0, port D */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
...
};
এই অ্যারেটিতে মোট 20 টি উপাদান রয়েছে, সুতরাং আমরা ভাগ্যের বাইরে। 999 এই অ্যারের বাইরে ফ্ল্যাশ মেমোরিতে একটি মেমরির অবস্থানকে সূচক করবে, যার ফলে অনাকাঙ্ক্ষিত আচরণের দিকে পরিচালিত হবে। নাকি তা করবে?
রানটাইম অরাজকতার বিরুদ্ধে আমাদের আরও একটি প্রতিরক্ষা রেখা আছে। এটি ফাংশনের পরবর্তী লাইন pinMode
:
uint8_t port = digitalPinToPort(pin);
digitalPinToPort
আমাদের একই ধরণের পথে নিয়ে যায়। এটি পাশাপাশি ম্যাক্রো হিসাবে সংজ্ঞায়িত করা হয় digitalPinToBitMask
। এর সংজ্ঞাটি হ'ল:
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
এখন, আমরা পি থিম উপাদানটি সূচক করি digital_pin_to_port_PGM
যার পিন মানচিত্রে একটি অ্যারে সংজ্ঞায়িত করা হয়:
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
PD, /* 0 */
PD,
....
PC,
PC,
};
এই অ্যারেতে 20 টি উপাদান রয়েছে তাই 999 আবার সীমার বাইরে। আবার, এই আদেশটি ফ্ল্যাশ মেমরির কাছ থেকে যার মান আমরা নিশ্চিত হতে পারি না তার একটি মান পড়ে এবং ফিরিয়ে দেয়। এটি আবার এখান থেকে অবিশ্বাস্য আচরণের দিকে পরিচালিত করবে।
প্রতিরক্ষা একটি শেষ লাইন এখনও আছে। এটির রিটার্ন মূল্যের if
চেক ইন :pinMode
digitalPinToPort
if (port == NOT_A_PIN) return;
NOT_A_PIN
0 ইন হিসাবে সংজ্ঞায়িত করা হয় Arduino.h
। সুতরাং, যদি থেকে ফিরে আসা বাইটটি digitalPinToPort
শূন্য হয়, তবে pinMode
নিঃশব্দে ব্যর্থ হয়ে ফিরে আসবে।
যাই হোক pinMode
না কেন , অরাজকতা থেকে আমাদের বাঁচাতে পারে না। 999 এর পরিণাম পরিণতিতে নিয়তিযুক্ত।
টিএল; ডিআর, কোডটি কার্যকর করবে এবং এর ফলাফলটি অবিশ্বাস্য হবে। সম্ভবত, কোনও পিন সেট করা হবে না OUTPUT
এবং digitalWrite
ব্যর্থ হবে। যদি আপনার খুব দুর্ভাগ্য হয়, তবে একটি এলোমেলো পিন সেট হয়ে যেতে পারে OUTPUT
এবং digitalWrite
সেট করতেও পারে HIGH
।