১৭. 8051 মাইক্রোকন্ট্রোলারের সাথে ADC ইন্টারফেস




এম্বেডেড সিস্টেমের একটি গুরুত্বপূর্ণ বিষয় হল ADC অর্থাৎ Analog-Digital-Coverter. যেহেতু এম্বেডেড সিস্টেম হল একটি ডিজিটাল সিস্টেম সেহেতু যেকোন এনালগ সিগন্যাল নিয়ে কাজ করতে হলেই আগে তাকে ডিজিটালে কনভার্ট করে নিতে হয়। বর্তমানে প্রায় আধুনিক সব মাইক্রোকন্ট্রোলারেই ADC পেরিফেরালস্‌ আকারেই থাকে। অর্থাৎ মাইক্রোকন্ট্রোলারের ভিতরেই এই অংশটুকু সংযোগ করা থাকে। কিন্তু 8051 মাইক্রোকন্ট্রোলার অনেক আগের মাইক্রোকন্ট্রোলার হওয়ায় এতে ADC পেরিফেরালস্‌ নেই। না থাকলে কি তাহলে আর এই মাইক্রোকন্ট্রোলার দিয়ে কাজ করা যাবেনা? যাবে। তবে একটু ঝামেলা করে এই এনালগ-টু-ডিজিটাল-কনভার্সনের কাজটি করতে হবে। মাইক্রোকন্ট্রোলারে যেসব পেরিফেরালস্‌ থাকে তার প্রায় সবই আইসি চিপ আকারে পাওয়া যায় বাজারে। তেমনি বাজারে ADC এরও চিপ পাওয়া যায়। এই চিপটির নাম হল ADC0808 বা ADC0809. আমরা স্পেসিফিকভাবে এই পোস্টে ADC0808 চিপ নিয়ে কথা বলব এবং 8051 মাইক্রোকন্ট্রোলারের সাথে ADC0808 আইসির ইন্টারফেস শিখব।
এটি একটি ৮ বিটের সাক্সেসিভ-এপ্রক্সিমেশন টাইপের ADC চিপ যাতে ৮ টি ইনপুট চ্যানেল আছে এবং এই ৮টি চ্যানেলকে কন্ট্রোল করার জন্যে ৩টি এড্রেস পিন আছে। এসব পিন সম্পর্কে আমরা ধীরে ধীরে জানতে পারবো। এই চিপটি ৮ বিটের ADC চিপ। এর অর্থ হল এই চিপটি যেকোন এনালগ সিগন্যালকে ২৫৬ টা ভাগে ভাগ করতে পারে। যেহেতু ২ ^ ৮ =  ২৫৬। বিষয়টা একটা উদাহরনের মাধ্যমে দেখা যাক। 

ধরা যাক একটি ডিসি সিগন্যাল, এটাকে আমরা কীভাবে দেখব? সময়ের সাপেক্ষে একটি নিরবিচ্ছিন্ন সিগন্যাল হিসেবে। কিন্তু মাইক্রোকন্ট্রোলার এই সিগন্যালকে কি নিরবিচ্ছিন্ন আকারে দেখবে না, কারন সে তো নিজেই চলে ক্লক পালসে্‌র তালে তালে। এজন্যে সে কি করবে? সে ঐ সিগন্যালটিকে ক্ষুদ্র ক্ষুদ্র নির্দিষ্ট সময়ের জন্যে ক্ষুদ্র ক্ষুদ্র ভাগে ভাগ করে নিবে এবং সেই ক্ষুদ্র ভাগ গুলোকে জাস্ট 1 আর 0 এর মাধ্যমে প্রকাশ করবে। থিওরিটিক্যালি ADC বিষয়টি যথেষ্ট কঠিন এবং এসব কথা হয়ত আমাদের অনেকেরই মাথার উপর দিয়ে যাচ্ছে। একটি সহজ হিসাব দেখা যাক। একটি এনালগ সিগন্যাল হিসেবে ৫ ভোল্টের ডিসি সিগন্যালের কথা চিন্তা করা যাক। আমাদের কাছে এর সর্বনিম্ন মান ০ ভোল্ট এবং সর্বোচ্চ মান ৫ ভোল্ট। কিন্তু মাইক্রোকন্ট্রোলারের কাছেও কি তাই? মাইক্রোকন্ট্রোলার তো 1 আর 0 ছাড়া কিছু বুঝে না। তারমানে তার কাছে ০ ভোল্ট, ৫ ভোল্ট এসবের কোন দাম নেই। সে এটাকে 1 আর 0 এর মাধ্যমে প্রকাশ করবে। যদি মাইক্রোকন্ট্রোলারটি ৮-বিটের ADC ধারন করে তাহলে সে ০ ভোল্টকে 00000000 (0) এই বাইনারি আকারে দেখবে এবং ৫ ভোল্টকে সে 11111111 (255) আকারের বাইনারি আকারে দেখবে। তাহলে ২.৫ ভোল্টকে সে কি আকারে দেখবে? ২৫৬ এর ঠিক অর্ধেক অর্থাৎ ১২৭ আকারে দেখবে। যেটাকে বাইনারি আকারে লিখলে দাড়ায়  01111111 (127). 
এখানে একটি বিষয় হল যেহেতু আমরা কাউন্টিং ০ থেকে করছি এজন্যে ২৫৬ এর অর্ধেক ১২৭ ধরা হয়েছে। মানে আমরা আসলে ধাপ গণনা করছি। ০ থেকে ১২৭ পর্যন্ত মোট ১২৮ ধাপ হয়। আর ৫ ভোল্টকে মাইক্রোকন্ট্রোলার কেন ২৫৫ ধরেছে? ২ ^ ৮ = ২৫৬ ধরা উচিৎ ছিলো তো। এক্ষেত্রেও ০ থেকে ২৫৫ পর্যন্ত মোট ২৫৬ ধাপ হয়।

ডিসি ৫ ভোল্টকে যদি আমরা ২৫৬ ভাগে ভাগ করতে চাই তাহলে প্রত্যেক ভাগে কত করে পড়বে???
৫ / ২৫৬ =  ০.০১৯৫৩১২৫ বা ০.০২ করে পড়বে প্রত্যেক ভাগে। অর্থাৎ প্রত্যেকভাগে ২০ মিলিভোল্ট করে পরছে। এখন যদি আমাদের মনে প্রশ্ন হয় যে ৩.৫ ভোল্টকে মাইক্রোকন্ট্রোলার তাহলে কি হিসেবে দেখবে? তাহলে হিসাব খুবই সহজ।

এনালগ ০ ভোল্ট ======> ডিজিটাল ০
এনালগ ৫ ভোল্ট ======> ডিজিটাল ২৫৫

তাহলে, ২৫৬ ভাগ   =       ৫      ভোল্ট
            ১    ভাগ   =  ৫ / ২৫৬ ভোল্ট
                           =  ২০ মিলিভোল্ট (পূর্ণসংখ্যা ধরে নেয়া হয়েছে হিসেবে সুবিধার্তে)
এখন, ২০ মিলিভোল্ট = ১                      (ডিজিটাল মান)
          ১ মিলিভোল্ট = ১ / ২০                (ডিজিটাল মান)
       ৩.৫  ভোল্ট     = ৩.৫*১০০০ / ২০  (ডিজিটাল মান)
                            = ১৭৫                    (ডিজিটাল মান)

সাধারণভাবে এই সুত্রকে প্রকাশ করা যায়, ডিজিটাল ভ্যালু = এনালগ ভোল্টেজ / (রেফারেন্স ভোল্টেজ / ২৫৬)

এখানে রেফারেন্স ভোল্টেজ হিসেবে আমরা ৫ ভোল্টকে ধরেছি এবং এনালগ ভোল্টেজ হিসেবে ৩.৫ ভোল্টকে ধরেছি।
এই সুত্রের সাহায্যে ০ থেকে ৫ ভোল্টের মধ্যে যেকোন ভোল্টেরই ডিজিটাল ভ্যালু বের করা যাবে। এবারে তাহলে ADC0808 আইসির পিন ডায়াগ্রাম দেখে নেয়া যাক।


ADC0808 একটি ২৮ পিনের ডুয়াল-ইন-লাইন চিপ। এই ২৮টি পিনের মধ্যে ৮ টি ইনপুট পিন, ৮ টি আউটপুট পিন যেহেতু ৮-বিটের, ৩ টি এড্রেস পিন, একটি vcc এবং একটি gnd পিন, একটি রেফারেন্স পজিটিভ এবং রেফারেন্স নেগেটিভ পিন এবং বাকি ৫ টি হল কন্ট্রোল পিন। নিচে সব পিনগুলোর বর্ণনা সংক্ষেপে দেয়া হল।

IN0 থেকে IN7 পিনঃ এই পিনগুলো হল ইনপুট পিন। একটি পিন একটি সিঙ্গেল চ্যানেল হিসেবে কাজ করে। মোট ৮ টি চ্যানেল আছে এই আইসি টিতে। অর্থাৎ ৮টি চ্যানেলের মাধ্যমে ৮টি সিগন্যালের ডিজিটাল কনভার্সন করতে পারে এই আইসিটি। কোন চ্যানেল ব্যবহার করা হবে তা এড্রেস সিলেক্ট পিনের মাধ্যমে বলে দেয়া হয়।

OUT1 থেকে OUT8 পিনঃ এই পিনগুলো হল আউটপুট পিন। যেহেতু এটি ৮ বিটের এনালগ টু ডিজিটাল আইসি সেহেতু একটি সিগন্যালকে যে ৮ বিটের বাইনারি আকারে প্রকাশ করবে তা এই ৮টি পিন হাই এবং লো করার মাধ্যমেই বুঝিয়ে দিবে। অর্থাৎ যদি এনালগ সিগন্যালের মান সর্বোচ্চ হয় তাহলে সবগুলো পিনই হাই হয়ে থাকবে এবং এনালগ সিগন্যালের মান সর্বনিম্ন হলে সবগুলো পিনই লো হয়ে থাকবে। এই পিনগুলোর স্ট্যাস্টাস রিড করার মাধ্যমেই মাইক্রোকন্ট্রোলার বুঝতে পারবে যে উক্ত এনালগ সিগন্যালটির সমতুল্য ডিজিটাল মান কত। এই ৮টি পিনকে মাইক্রোকন্ট্রোলারের কোন একটি পোর্টের ৮টি পিনের সাথে কানেক্ট করে দিতে হবে।এর মধ্যে ২১ নম্বর পিনটি হল মোস্ট সিগনিফিক্যান্ট বিট এবং ১৭ নম্বর পিনটি হল লেস সিগনিফিক্যান্ট বিট।


এড্রেস পিনঃ  ADD A, ADD B এবং ADD C এই তিনটি পিন হল এড্রেস পিন। এই তিনটি পিনের মাধ্যমেই সিলেক্ট করে দেয়া হয় যে কোন ইনপুট পিন থেকে সিগন্যাল রিড করা হবে। এই তিনটি পিনের কম্বিনেশনের মাধ্যমেই ইনপুট পিন নির্বাচন করা যায়। 


Vref+ এবং Vref- পিনঃ   এই পিন দুটি হল রেফারেন্স সিলেকশন পিন। Vref+ পিনে সিগন্যালের সর্বোচ্চ মান এবং Vref- পিনে সিগন্যালের সর্বনিম্ন মান দিতে হয়। যেমন যদি ৫ ভোল্টের কোন একটি সিগন্যাল পরিমাপ করার দরকার হয় তাহলে Vref+ পিনে ৫ ভোল্ট কানেক্ট করতে হবে এবং Vref- পিনে গ্রাউন্ড কানেক্ট করতে হবে। আরও একটি বিষয় হল আমরা একটি সিগন্যালকে কতটা সুক্ষ্ণভাবে পরিমাপ করতে চাই সেটাও এই পিন দুটির মাধ্যমে নির্ধারণ করে দেয়া যায়। যেমন ৫ ভোল্টকে ২৫৬ ভাগে ভাগ করলে প্রত্যেক ভাগের মান হয় ২০ মিলিভোল্ট। তারমানে ১ ভোল্টের পর এই আইসি রিডিং পাবে  ১.২০ ভোল্ট। ১ ভোল্ট এবং ১.২০ ভোল্টের মাঝের কোন মান সে পরিমাপ করতে পারবে না। কিন্তু আমরা যদি Vref+ পিনে ২.৫ ভোল্ট দিই তাহলে ২.৫ ভোল্টকে ২৫৬ ভাগে ভাগ করলে প্রত্যেকভাগে পড়বে ৯.৮ মিলিভোল্ট। এক্ষেত্রে কিন্তু ১ ভোল্টের পর আইসি টি ১.০০৯ ভোল্ট পরিমাপ করতে পারবে। আমাদের কি পরিমান প্রিসিশন দরকার তা আমরা এই পিনের মাধ্যমে সিলেক্ট করে দিতে পারি।

Vcc এবং Gnd পিনঃ এই পিন দুটি তো প্রত্যেক আইসির জন্যের কমন। Vcc পিনে ৫ ভোল্টের সাপ্লাই দিতে হবে এবং Gnd পিনে গ্রাউন্ড কানেকশন দিতে হবে।

ALE পিনঃ এই পিনটিকে বলা হয় Address Latch Enable পিন। এটি হল এক্টিভ লো পিন। অর্থাৎ এই পিনে হাই-টু-লো সিগন্যাল দিলে পিনটি তার কাজ সম্পূর্ণ করবে। ADD A, ADD B এবং ADD C এই তিনটি এড্রেস সিলেক্ট পিনের মাধ্যমে যে  চ্যানেল সিলেক্ট করা হয় তার এক্টিভেশনের জন্যে এই পিনটিতে একটি হাই-টু-লো ট্রানজিশন পাঠাতে হয়। এই পিনের কাজ অনেকটা চ্যানেলের এড্রেস কনফার্ম করে দেয়া। 

SC পিনঃ এই পিনটিকে বলা হয় Start Conversion পিন। এটিও একটি এক্টিভ লো পিন। অর্থাৎ এই পিনে একটি হাই-টু-লো সিগন্যাল দিলে আইসিটি এনালগ সিগন্যালের কনভার্সন শুরু করে।

EOC পিনঃ এই পিনটিকে বলা হয় End of Conversion পিন। এনালগ-টু-ডিজিটাল সিগন্যাল কনভার্সন শেষ হলে এই পিনটি জানান দেয়। SC পিনকে লো করে দিলে কনভার্সন শুরু হয় এবং ঠিক তখনই এই পিনটি লো হয়ে যায়। যতক্ষণ না কনভার্সন কমপ্লিট হয় ততক্ষন এই পিনটি লো - ই থাকে। কনভার্সন কমপ্লিট হয়ে গেলে এই পিনটি হাই হয়ে জানান দেয়। মাইক্রোকন্ট্রোলার এই পিনটি রিড করেই বুঝতে পারে যে কখন এনাল্গ-টু-ডিজিটাল কনভার্সন শুরু হল আর শেষ হল।
OE পিনঃ এই পিনটি হল Output Enable পিন। এই পিনটিতে হাই-টু-লো সিগন্যাল পাঠানোর মাধ্যমে আইসির আউটপুট পিনে এনালগ-টু-ডিজিটাল কনভার্সনের রেজাল্ট আপডেট করা হয়। EOC পিন হাই হওয়ার ঠিক এক ক্লক সাইকেল পরই এই OE পিনকে হাই করা হয় এবং যতক্ষণ পর্যন্ত না মাইক্রোকন্ট্রোলার এই ডেটা রিড করে ততক্ষন পর্যন্ত একে হাই-ই রাখা হয়। ডেটা রিড করা হয়ে গেলে একে আবার লো করে দেয়া হয়।

CLK পিনঃ এই পিনের মাধ্যমে ADC আইসি টিতে ক্লক পালস্‌ দেয়া হয়। সাধারণত ৫০০ কিলোহার্টজ থেকে ৬৫০ কিলোহার্টজ পর্যন্ত ক্লক সিগন্যাল এই পিনে দেয়া হয়ে থাকে। মাইক্রোকন্ট্রোলারের টাইমার ব্যবহার করেও এই ক্লক সিগন্যাল দেয়া যায় আবার যেকোন টাইমার সার্কিট দিয়েও এই ক্লক সিগন্যাল দেয়া যায়। 

মাইক্রোকন্ট্রোলারের সাথে ADC0808 ইন্টারফেস করার আগে আমরা এই আইসিটি নরমালি প্রোটিয়াসে সিমুলেট করে দেখতে পারি মূল বিষয়টি। তবে এর জন্যে কয়েকটি বিষয় আমাদের জেনে নিতে হবে।
বিষয়গুলো হল-
  • EOC এবং OE পিন ৫ ভোল্টের সাথে কানেক্ট করা থাকলে কন্টিনিউয়াস মোডে কনভার্সন চলবে।
  • SC পিন হল এক্টিভ লো। সুতরাং কনভার্সন শুরু করতে হলে এই পিনে হাই-টু-লো সিগন্যাল দিতে হবে।
  • EOC পিন কনভার্সন কমপ্লিট হয়ে গেলে হাই হয়ে যাবে।
  • EOC এবং SC পিন সংযোগ করে দিলে অটোমেটিক মোডে কনভার্সন চলতেই থাকবে। কেননা EOC কনভার্সন শেষ হলে EOC হাই হয়ে যায় এবং নেক্সট ক্লক পালসে্‌ তা আবার লো হয়ে যায়। এই হাই-টু-লো সিগন্যাল SC পিনে যায় যেটা কিনা কনভার্সন শুরুর শর্ত।
  • CLK পিনে যে ক্লক পালস্‌ লাগে সেটা 555 টাইমার আইসি অ্যাস্টেবাল মোডে ব্যবহার করে দেয়া যায়।

ধরা যাক, আমরা প্রথম চ্যানেল দিয়েই সিগন্যাল রিড করাবো। তাহলে সার্কিটটি দেখতে নিচের মত হবে।



এখান থেকে আমরা  Proteus7.6 ডাউনলোড করে নিতে পারি। এবং সিমুলেশন ফাইলটি এখান থেকে ডাউনলোড করে নিতে পারি।

এবারে মাইক্রোকন্ট্রোলারের সাথে উক্ত আইসির ইন্টারফেস দেখা যাক। ADC আইসির আউটপুট পিন মাইক্রোকন্ট্রোলারের কোন একটি পোর্টের আটটি পিনের মাধ্যমে রিড করব এবং সেই ভ্যালু LCD এর স্ক্রিনে দেখাব।
LCD ইন্টারফেস সম্পর্কে এই পোস্টটি থেকে দেখে নিব যদি সমস্যা থাকে। যদি ADC0808 আইসি টির সব পিনের ফাংশন এবার কোডের মাধ্যমে ইমপ্লিমেন্ট করতে হবে।



 #include<reg52.h>             //header file for at89252  
 #include<intrins.h>           //header file for _nop_() function  
 #include<string.h>            //header file for string operation  
 #include<stdio.h>  
 
 #define LCD_register P2       //make Port 2 the lcd data register  
 #define ADC_data P1           //make port 1 the adc data read pin  
 
 sbit _A = P3^0;               //this pin act as output pin of 8051  
 sbit _B = P3^1;               //this pin act as output pin of 8051  
 sbit _C = P3^2;               //this pin act as output pin of 8051  
 sbit ALE = P3^3;              //this pin act as output pin of 8051 (active-low,HIGH-T0-LOW pulse is needed to confirm the channel of ADC0808)  
 sbit OE = P3^6;               //this pin act as output pin of 8051 (active-low,HIGH-TO-LOW pulse is needed to activate the output pin of ADC0808)  
 sbit CLK = P3^4;              //this pin act as output pin of 8051 (pulse is generated by this pin using timer0 interrupt)  
 sbit SC = P3^5;               //this pin act as output pin of 8051 (active-low pin,HIGH-TO-LOW pulse is needed to activate func. of ADC0808)  
 sbit EOC = P3^7;              //this pin act as input pin of 8051 (after completing each conversion,goes from low to high)  
 sbit EN = P0^0;               //enable pin of LCD,this pin act as output pin of 8051  
 sbit RS = P0^1;               //register select pin of LCD,this pin act as output pin of 8051  
 
 void delay_uS(unsigned int t)  
 {  
      while((t--) > 0)  
      {  
           _nop_();                     // this built-in function of keil uVision do nothing one instruction cycle  
      }  
 }  
 void send_cmd(unsigned char cmd)  
 {  
      LCD_register = cmd;                //keep the argument of this function in LCD_register  
      RS = 0;                            //register select bit = 0 , for sending command  
      EN = 1;                            //make EN pin high  
      delay_uS(10);                      //wait 10 microseconds to settle down everything  
      EN = 0;                            //make EN pin low  
 }  
 void send_data(unsigned char dt)  
 {  
      LCD_register = dt;                 //keep the argument of this function in LCD_register  
      RS = 1;                            //register select bit = 0 , for sending data  
      EN = 1;                            //make EN pin high  
      delay_uS(10);                      //wait 10 microseconds to settle down everything  
      EN = 0;                            //make EN pin low  
 }  
 void init_LCD()  
 {  
       //EN = RS = 0;                            
       send_cmd(0x38);                   //use 8bit,two lines & 5x7 matrix  
       delay_uS(1000);                   //wait 1 millisecond  
       send_cmd(0x0C);                   //Display on,Cursor Off  
       delay_uS(1000);                   //wait 1 millisecond  
       send_cmd(0x01);                   //clearing the screen  
       delay_uS(1000);                   //wait 1 millisecond  
       send_cmd(0x80);                   //cursor return at home  
       delay_uS(1000);                   //wait 1 millisecond  
 }  
 void send_string(const char *s)         //this function takes string as parameter  
 {       
      while(*s)  
           send_data(*s++);              //just increasing the position of character  
 }  
 void adc_init()  
 {  
      EOC = 1;                           //declare EOC pin as input for 8051  
      ALE = SC = OE = CLK = 0;           //declare ALE,SC and OE pin as ouput for 8051  
      ADC_data = 0xFF;                   //declare adc data read port as input  
 }  
 void init_timer0()                      //this function is used for 500khz frequency for adc conversion  
 {  
      TMOD = 0x10;                       //enable TIMER0 auto-reload mode  
      TH0 = 0xFD;                        //count from 253 to 255, take 2 uS time, that means 1/2us = 500 KHz  
      IE = 0x82;                         //set EA bit and ET0 bit in IE register   
      TR0 = 1;                           //run TIMER0   
 }  
 //interrupt subroutine of timer0  
 void timer0() interrupt 1  
 {  
      CLK = ~CLK;                          //toggle CLK pin to give pulse at 500khz  
 }  
 //this function reads adc value of i number pin, where i = 0 to 7.  
 unsigned char adc_read(unsigned char i)  
 {  
      unsigned char adc_data;  
      switch(i)  
      {  
           case 0:  
                _A=0;  
                _B=0;  
                _C=0;  
                break;  
           case 1:  
                _A=1;  
                _B=0;  
                _C=0;  
                break;  
           case 2:  
                _A=0;  
                _B=1;  
                _C=0;  
                break;  
           case 3:  
                _A=1;  
                _B=1;  
                _C=0;  
                break;  
           case 4:  
                _A=0;  
                _B=0;  
                _C=1;  
                break;  
           case 5:  
                _A=1;  
                _B=0;  
                _C=1;  
                break;  
           case 6:  
                _A=0;  
                _B=1;  
                _C=1;  
                break;  
           case 7:  
                _A=1;  
                _B=1;  
                _C=1;  
                break;  
      }  
      ALE = 1;                   //latch channel selection address  
      SC = 1;                    //keep high SC pin  
      delay_uS(10);              //delay 10 microseconds to settel down the above operation of pin  
      ALE = 0;                   //low ALE pin to select desired channel  
      SC = 0;                    //low SC pin to start conversion  
      delay_uS(10);              //delay 10 microseconds to settel down the above operation of pin  
      
      //wait for end of conversion  
      while(EOC == 1);  
      while(EOC == 0);  
      OE = 1;                                 //high output enable pin  
      adc_data = ADC_data;                    //read adc_data ports  
      delay_uS(20);                           //delay 20 uS to read data in PORT 1;  
      OE = 0;                                 //low output enable pin  
      return (adc_data);            
 }  
 void main()  
 {       
      int adc,result[3];                      //data for holding the adc value  
      init_LCD();                             //initialize lcd  
      adc_init();                             //initialize adc  
      init_timer0();                          //initialize timer0 for giving clock signal into adc0808  
      send_string("ADC:");                    //show this string in lcd   
      while(1)  
      {  
           send_cmd(0x84);                    //keep the cursor at the line 1, position 4  
           adc = adc_read(7);                 //reading adc from channel 7  
           sprintf(result, "%d", adc);        //keep the adc value in buffer to show in lcd  
           send_string(result);               //pass the adc value in send_string() function  
      }  
 }  


উপরের কোডে জাস্ট ADC0808 আইসির পিন কনফিগারেশন অনুযায়ী মাইক্রোকন্ট্রোলারের পিনকে হাই আর লো করা হয়েছে। প্রত্যেক লাইনের পাশের কমেন্টেই সব বর্ণনা দেয়া আছে। সার্কিটটি দেখতে নিচের মত হবে।



কোড এবং সিমেলশন ফাইল নিচে সংযোগ করে দেয়া হল।

code_and_circuit


মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি