সুচিপত্র:

AVR Assembler টিউটোরিয়াল 9: 7 ধাপ
AVR Assembler টিউটোরিয়াল 9: 7 ধাপ

ভিডিও: AVR Assembler টিউটোরিয়াল 9: 7 ধাপ

ভিডিও: AVR Assembler টিউটোরিয়াল 9: 7 ধাপ
ভিডিও: 7. Assembly Language Programming Jmp Concept | Bangla Tutorial 2024, জুলাই
Anonim
AVR Assembler Tutorial 9
AVR Assembler Tutorial 9

টিউটোরিয়াল 9 এ স্বাগতম।

আজ আমরা দেখাবো কিভাবে আমাদের ATmega328P এবং AVR অ্যাসেম্বলি ল্যাঙ্গুয়েজ কোড ব্যবহার করে 7-সেগমেন্ট ডিসপ্লে এবং 4-ডিজিট ডিসপ্লে উভয়ই নিয়ন্ত্রণ করতে হয়। এটি করার সময় আমাদের স্ট্যাকটি কীভাবে ব্যবহার করতে হবে সে সম্পর্কে আমাদের ডাইভার্সন নিতে হবে যাতে আমাদের নিবন্ধনের সংখ্যা হ্রাস করতে পারে। আমরা আমাদের কীপ্যাডে শব্দ কমাতে চেষ্টা করার জন্য কয়েকটি ক্যাপাসিটার (লো-পাস ফিল্টার) যুক্ত করব। আমরা কয়েকটি ট্রানজিস্টর থেকে একটি ভোল্টেজ এম্প্লিফায়ার তৈরি করব যাতে আমাদের INT0 ইন্টারাপ্ট সুইচ কীপ্যাডের নিচের সারির নিচের ভোল্টেজ বোতামের জন্য ভালো কাজ করে। এবং আমরা সঠিক প্রতিরোধক পেতে চেষ্টা করে দেওয়ালের সাথে আমাদের মাথা ঠেকিয়ে দেব যাতে জিনিসটি সঠিকভাবে কাজ করে।

আমরা টিউটোরিয়াল 7 থেকে আমাদের কীপ্যাড ব্যবহার করব

এই টিউটোরিয়ালটি করতে, স্ট্যান্ডার্ড স্টাফ ছাড়াও, আপনার প্রয়োজন হবে:

  1. একটি 7-সেগমেন্ট ডিসপ্লে

    www.sparkfun.com/products/8546

  2. একটি 4-অঙ্কের ডিসপ্লে

    www.sparkfun.com/products/11407

  3. একটি পুশবাটন

    www.sparkfun.com/products/97

  4. প্রদর্শনের জন্য ডেটশীট যা উপরের লিঙ্ক করা নিজ নিজ পৃষ্ঠা থেকে ডাউনলোড করা যাবে।
  5. একটি 68 পিএফ সিরামিক ক্যাপাসিটর, 104 ক্যাপাসিটরের একটি দম্পতি, একগুচ্ছ প্রতিরোধক, দুটি 2N3904 এনপিএন ট্রানজিস্টর।

এখানে আমার AVR অ্যাসেম্বলার টিউটোরিয়ালগুলির সম্পূর্ণ সংগ্রহের একটি লিঙ্ক:

ধাপ 1: 7-সেগ ডিসপ্লে ওয়্যারিং

7-সেগ ডিসপ্লে ওয়্যারিং
7-সেগ ডিসপ্লে ওয়্যারিং
7-সেগ ডিসপ্লে ওয়্যারিং
7-সেগ ডিসপ্লে ওয়্যারিং
7-সেগ ডিসপ্লে ওয়্যারিং
7-সেগ ডিসপ্লে ওয়্যারিং

আমরা 7-সেগমেন্ট ডিসপ্লে নিয়ন্ত্রণ করতে কীপ্যাডের জন্য টিউটোরিয়াল 7 এ যে কোডটি ব্যবহার করেছি সেই একই কোড ব্যবহার করতে যাচ্ছি। সুতরাং আপনাকে এর একটি অনুলিপি তৈরি করতে হবে এবং আমরা এটি সংশোধন করব।

আমরা নিম্নরূপ আমাদের মাইক্রোকন্ট্রোলারের পিনগুলিতে বিভাগগুলি ম্যাপ করব:

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

যেখানে পিনআউট সহ সাধারণ 5V এবং ডিসপ্লের নিচের ডানদিকে দশমিক বিন্দু (ডিপি) সহ প্রতিটি এলইডি সেগমেন্টের সাথে সেগমেন্টগুলির অক্ষরগুলি ছবিতে দেখানো হয়েছে। এর কারণ হল যাতে আমরা একটি একক রেজিস্টারে সম্পূর্ণ সংখ্যা ইনপুট করতে পারি এবং সেগমেন্টগুলিকে আলোকিত করার জন্য B এবং D পোর্টে নিবন্ধিত আউটপুট। আপনি দেখতে পাচ্ছেন বিটগুলি ক্রমানুসারে 0 থেকে 7 পর্যন্ত সংখ্যাযুক্ত এবং তাই তারা পৃথক বিট সেট এবং সাফ না করে সঠিক পিনগুলিতে ম্যাপ করবে।

পরবর্তী ধাপে আমরা যে কোডটি সংযুক্ত করেছি তা আপনি দেখতে পাচ্ছেন, আমরা আমাদের ডিসপ্লে রুটিনকে একটি ম্যাক্রোতে স্থানান্তরিত করেছি এবং আমরা পরবর্তী টিউটোরিয়ালে ভবিষ্যতে ব্যবহারের জন্য এসডিএ এবং এসসিএল পিনগুলি মুক্ত করেছি।

আমার যোগ করা উচিত যে আপনাকে প্রদর্শন এবং 5V রেলের সাধারণ অ্যানোডের মধ্যে একটি প্রতিরোধক স্থাপন করতে হবে। আমি যথারীতি একটি 30০ ওহম প্রতিরোধক বেছে নিলাম কিন্তু যদি আপনি চান তবে ডিসপ্লে থেকে ভাজা ছাড়াই সর্বাধিক উজ্জ্বলতা পেতে প্রয়োজনীয় সর্বনিম্ন প্রতিরোধের হিসাব করতে পারেন। এটি কীভাবে করা যায় তা এখানে:

প্রথমে ডাটা শীটটি দেখুন এবং লক্ষ্য করুন যে প্রথম পৃষ্ঠায় এটি প্রদর্শনের বিভিন্ন বৈশিষ্ট্য দেয়। গুরুত্বপূর্ণ পরিমাণ হল "ফরওয়ার্ড কারেন্ট" (I_f = 20mA) এবং "ফরওয়ার্ড ভোল্টেজ" (V_f = 2.2V)। এইগুলি আপনাকে বলে যে ডিসপ্লে জুড়ে ভোল্টেজ ড্রপ হবে যদি কারেন্ট ফরোয়ার্ড কারেন্টের সমান হয়। এটি সর্বাধিক বর্তমান যা ডিসপ্লে ভাজা ছাড়াই গ্রহণ করবে। এটি ফলস্বরূপ সর্বাধিক উজ্জ্বলতা যা আপনি বিভাগগুলি থেকে বের করতে পারেন।

সুতরাং আসুন ওহমের আইন এবং কিরচফের লুপ নিয়মটি ব্যবহার করি যাতে সর্বাধিক উজ্জ্বলতা পেতে ডিসপ্লের সাথে সিরিজের মধ্যে আমাদের ন্যূনতম প্রতিরোধের প্রয়োজন হয়। Kirchoff এর নিয়ম বলে যে একটি সার্কিটে একটি বদ্ধ লুপের চারপাশে ভোল্টেজ পরিবর্তনের যোগফল শূন্যের সমান এবং ওহমের আইন বলে যে প্রতিরোধ R এর একটি প্রতিরোধক জুড়ে ভোল্টেজ ড্রপ হল: V = I R যেখানে আমি প্রতিরোধকের মধ্য দিয়ে প্রবাহিত কারেন্ট।

সুতরাং V এর একটি উৎস ভোল্টেজ দেওয়া হয়েছে এবং আমাদের সার্কিটের চারপাশে যাচ্ছি:

V - V_f - I R = 0

যার মানে (V - V_f)/I = R. সুতরাং সর্বাধিক উজ্জ্বলতা (এবং সম্ভবত সেগমেন্টগুলি ভাজা) পেতে প্রতিরোধের প্রয়োজন হবে:

R = (V - V_f)/I_f = (5.0V - 2.2V) /0.02A = 140 ohms

সুতরাং আপনি যদি চান আপনি দুশ্চিন্তা ছাড়াই আনন্দের সাথে 150 ওহম ব্যবহার করতে পারেন। যাইহোক, আমি মনে করি 140 ohms এটা আমার পছন্দ জন্য খুব উজ্জ্বল করে তোলে এবং তাই আমি 330 ohms ব্যবহার (যা LEDs জন্য আমার ব্যক্তিগত Goldilocks প্রতিরোধের সাজানোর)

ধাপ 2: অ্যাসেম্বলি কোড এবং ভিডিও

আমি ডিসপ্লের সাথে অ্যাসেম্বলি কোড এবং একটি ভিডিও সংযুক্ত করেছি যা কীপ্যাডের কাজ দেখায়। আপনি দেখতে পাচ্ছেন যে আমরা কেবল "r" তে Redial কী, "F" এর ফ্ল্যাশ কী, "A" এর তারকা এবং "H" এ হ্যাশ চিহ্নটি ম্যাপ করেছি। এগুলি ব্যাকস্পেস, এন্টার, এবং কি-না, যদি আপনি এলসিডি ডিসপ্লে বা 4 ডিজিটের ডিসপ্লেতে নম্বর টাইপ করার জন্য কীপ্যাড ব্যবহার করতে চান তবে বিভিন্ন অপারেশনে ম্যাপ করা যেতে পারে। আমি এইবার লাইন লাইন বাই লাইনের মধ্য দিয়ে যাব না কারণ এটি আগের টিউটোরিয়ালে আমরা যা করেছি তার অনুরূপ। পার্থক্যগুলি মূলত একই জিনিসগুলির মধ্যে আরও বেশি যা আমরা ইতিমধ্যে জানি কিভাবে কীভাবে বাধা এবং সন্ধানের টেবিলগুলি করতে হয়। আপনার কেবল কোডটি দেখতে হবে এবং আমরা যে নতুন জিনিসগুলি যুক্ত করেছি এবং যে জিনিসগুলি আমরা পরিবর্তন করেছি সেগুলি দেখুন এবং সেখান থেকে এটি বের করুন। আমরা পরবর্তী টিউটোরিয়ালে লাইন-বাই-লাইন বিশ্লেষণে ফিরে যাব যখন আমরা AVR মাইক্রোকন্ট্রোলারগুলিতে অ্যাসেম্বলি ল্যাঙ্গুয়েজ কোডিংয়ের নতুন দিকগুলি চালু করব।

আসুন এখন 4-সংখ্যার ডিসপ্লে দেখি।

ধাপ 3: 4-সংখ্যার ডিসপ্লে ওয়্যারিং

ওয়্যারিং 4-সংখ্যার ডিসপ্লে
ওয়্যারিং 4-সংখ্যার ডিসপ্লে
ওয়্যারিং 4-সংখ্যার ডিসপ্লে
ওয়্যারিং 4-সংখ্যার ডিসপ্লে

ডেটশীট অনুসারে, 4-সংখ্যার ডিসপ্লেতে 60 mA এর ফরওয়ার্ড কারেন্ট এবং 2.2 ভোল্টের ফরওয়ার্ড ভোল্টেজ রয়েছে। সুতরাং, আগের মতো একই গণনা দ্বারা, আমি চাইলে 47 ওহম প্রতিরোধক ব্যবহার করতে পারি। পরিবর্তে আমি একটি… hrm ব্যবহার করতে যাচ্ছি.. আমাকে দেখতে দিন… কিভাবে 330 ওহম

যেভাবে 4-সংখ্যার ডিসপ্লেটি তারযুক্ত করা হয় তা হল 4 টি অ্যানোড রয়েছে, প্রতিটি সংখ্যার জন্য একটি, এবং অন্য পিনগুলি নিয়ন্ত্রণ করে যে প্রতিটি বিভাগে কোনটি আসে। আপনি একই সাথে 4 টি সংখ্যা প্রদর্শন করতে পারেন কারণ সেগুলি মাল্টিপ্লেক্সেড। অন্য কথায়, ঠিক যেমন আমরা পাশা জোড়াটির জন্য করেছি, আমরা কেবলমাত্র প্রতিটি এনোডের মধ্য দিয়ে বিদ্যুৎ চক্র করি এবং এটি তাদের একের পর এক জ্বলজ্বল করবে। এটি এত দ্রুত কাজ করবে যে আমাদের চোখ জ্বলজ্বল করবে না এবং মনে হবে চারটি সংখ্যা চালু আছে। যাইহোক, শুধু নিশ্চিত হওয়ার জন্য, আমরা যেভাবে কোড করব তা হল চারটি সংখ্যা সেট করা, তারপর সেট, মুভ, সেট, মুভ, ইত্যাদি এর পরিবর্তে অ্যানোডগুলিকে সাইকেল করুন। এভাবে আমরা প্রতিটি ডিজিট জ্বালানোর মধ্যে একটি সুনির্দিষ্ট সময় পেতে পারি ।

আপাতত, পরীক্ষা করা যাক যে বিভাগগুলি সব কাজ করে।

আপনার ব্রেডবোর্ডের ইতিবাচক রেল এবং ডিসপ্লেতে প্রথম অ্যানোডের মধ্যে আপনার 330 ওহম প্রতিরোধক রাখুন। ডেটশীট আমাদের বলে যে পিনের সংখ্যা 1 থেকে 16 পর্যন্ত ঘড়ির কাঁটার নীচে বাম দিক থেকে শুরু হয় (যখন আপনি সাধারণত ডিসপ্লের দিকে তাকান.. নিচের দিকের দশমিক বিন্দু সহ) এবং এটি বলে যে অ্যানোডগুলি পিন নম্বর 6, 8, 9, এবং 12।

সুতরাং আমরা পিন 6 থেকে 5V সংযোগ করি এবং তারপর আপনার GND রেল থেকে একটি নেতিবাচক সীসা গ্রহণ করি এবং এটিকে অন্যান্য সমস্ত পিনগুলিতে keুকিয়ে দেখি এবং দেখুন যে সমস্ত বিভাগগুলি সেই সংখ্যার উপর আলোকপাত করে (যা আসলে দ্বিতীয় সংখ্যা থেকে অধিকার). নিশ্চিত করুন যে আপনি সমস্ত 7 টি সেগমেন্ট এবং দশমিক বিন্দুটি আলোতে পেয়েছেন।

এখন আপনার জিএনডি তারের একটি পিনের মধ্যে আটকে রাখুন একটি সেগমেন্টকে আলোকিত করতে এবং এই সময় রোধকারীকে অন্য 3 টি অ্যানোডের দিকে সরান এবং দেখুন যে একই সেগমেন্ট অন্য প্রতিটি অঙ্কে জ্বলছে।

অস্বাভাবিক কিছু?

দেখা যাচ্ছে যে ডেটশীটে পিনআউট ভুল। কারণ এটি একটি 12-পিন, 4-অঙ্কের প্রদর্শনের জন্য ডেটশীট এবং পিনআউট। I.e. যার কোন কোলন বা উপরের দশমিক বিন্দু নেই। অর্ডার করার সময় আমি যে ডিসপ্লেটি পেয়েছিলাম সেটি হল একটি 16 পিন, 4-ডিজিটের ডিসপ্লে। আসলে, আমার উপর, সেগমেন্ট অ্যানোডগুলি পিন 1, 2, 6 এবং 8 এ থাকে।

অনুশীলন 1: ডিসপ্লেতে কোন পিনটি কোন সেগমেন্ট এবং দশমিক বিন্দুর সাথে মিলে যায় তা ম্যাপ করার জন্য আপনার রেসিস্টর এবং গ্রাউন্ড ওয়্যার ব্যবহার করুন যাতে কোড করার সময় আমরা সঠিক সেগমেন্টগুলিকে আলোকিত করি।

যেভাবে আমরা সেগমেন্ট ম্যাপকে কোড করতে চাই ঠিক সেভাবেই আমরা উপরের একক অঙ্কের 7-সেগমেন্ট ডিসপ্লের সাথে করেছি-কোডে আমাদের কোন কিছু পরিবর্তন করতে হবে না, কেবলমাত্র আমরা পরিবর্তন করি তারগুলি কিভাবে সংযুক্ত থাকে বোর্ডের উপর. মাইক্রোকন্ট্রোলারে সঠিক পোর্ট পিনটি 4-ডিজিটের ডিসপ্লেতে সংশ্লিষ্ট পিনে প্লাগ করুন যাতে, উদাহরণস্বরূপ, PB0 এখনও সেগমেন্ট a এর সাথে সংশ্লিষ্ট পিনে যায়, PB1 সেগমেন্ট B তে যায়, ইত্যাদি।

পার্থক্য শুধু এই যে এখন আমাদের 4 টি অতিরিক্ত পিনের প্রয়োজন এনোডের জন্য যেহেতু আমরা আর 5V রেল এ যেতে পারব না। কোন অঙ্কের রস পাওয়া যায় তা নির্ধারণ করার জন্য আমাদের মাইক্রোকন্ট্রোলার দরকার।

সুতরাং আমরা 4 ডিজিটের অ্যানোডগুলি নিয়ন্ত্রণ করতে PC1, PC2, PC3, এবং PD4 ব্যবহার করব।

আপনি পাশাপাশি এগিয়ে যেতে পারেন এবং তারের মধ্যে প্লাগ। (এনোড তারের 330 ওহম প্রতিরোধক ভুলবেন না!)

ধাপ 4: 4-সংখ্যার প্রদর্শন কোডিং

4-সংখ্যার ডিসপ্লে কোডিং
4-সংখ্যার ডিসপ্লে কোডিং

আসুন আমরা এই ডিসপ্লে কে কিভাবে কোড করতে চাই সে সম্পর্কে চিন্তা করি।

আমরা চাই যে ব্যবহারকারী কীপ্যাড বোতামগুলি ধাক্কা দেয় এবং সংখ্যাগুলি ক্রমানুসারে প্রদর্শিত হয় যাতে তারা প্রতিটি বোতাম ধাক্কা দেয়। তাই যদি আমি 1 টিকে 2 এর পরে ধাক্কা দিই তবে এটি 12 হিসাবে প্রদর্শিত হবে। আপাতত আমি কেবল একটি নতুন ম্যাক্রো লিখতে চাই যা আপনার কীপ্রেসগুলি নেয় এবং সেগুলি প্রদর্শন করে। যাইহোক, যেহেতু আমাদের মাত্র 4 টি সংখ্যা আছে তাই আমি নিশ্চিত করতে চাই যে এটি আপনাকে কেবল চারটি সংখ্যা টাইপ করতে দেয়।

আরেকটি সমস্যা হল যে মাল্টিপ্লেক্সেড 4-ডিজিটের ডিসপ্লেটি যেভাবে কাজ করে তা হল অ্যানোডগুলি সাইক্লিং করে যাতে প্রতিটি ডিজিট শুধুমাত্র একটি সেকেন্ড সেকেন্ডের জন্য চালু থাকে যাতে এটি পরবর্তী এবং তারপর পরবর্তী এবং শেষ পর্যন্ত আবার প্রথমটিতে ফিরে আসে ইত্যাদি। এই কোড করার একটি উপায় প্রয়োজন।

আমরা এটাও চাই যে এটি "কার্সার" কে ডানদিকে একটি স্থান থেকে সরিয়ে দিবে যখন আমরা পরবর্তী অঙ্কটি টাইপ করব। যাতে যদি আমি 1234 টাইপ করতে চাই উদাহরণস্বরূপ, আমি 1 টাইপ করার পর, কার্সারটি সরানো হবে যাতে আমি টাইপ করা পরবর্তী অঙ্কটি পরবর্তী 7-সেগমেন্ট ডিসপ্লেতে প্রদর্শিত হবে এবং তাই। যখন এটি ঘটছে তখনও আমি যা টাইপ করেছি তা দেখতে সক্ষম হতে চাই তাই এটি এখনও অঙ্কের মাধ্যমে সাইক্লিং এবং তাদের প্রদর্শন করতে হবে।

একটি লম্বা আদেশ মত শব্দ?

জিনিসগুলি আসলে আরও খারাপ। আমাদের আরও 4 টি সাধারণ উদ্দেশ্য রেজিস্টার দরকার যা আমরা যে 4 ডিজিটের বর্তমান মানগুলি প্রদর্শন করতে চাই তা সংরক্ষণ করতে ব্যবহার করতে পারি (যদি আমরা তাদের মাধ্যমে চক্র করতে যাচ্ছি তবে সেগুলিকে কোথাও সংরক্ষণ করতে হবে) এবং এর সাথে সমস্যা হল আমাদের সাধারণ উদ্দেশ্য রেজিস্টারগুলো পাগলের মত ব্যবহার করা হচ্ছে এবং যদি আমরা সতর্ক না থাকি তাহলে আমাদের কোন অবশিষ্ট থাকবে না। তাই সম্ভবত সেই সমস্যাটি পরে না করে তাড়াতাড়ি মোকাবেলা করা এবং স্ট্যাক ব্যবহার করে নিবন্ধনগুলি কীভাবে মুক্ত করবেন তা দেখানো সম্ভবত একটি ভাল ধারণা।

সুতরাং আসুন শুরু করা যাক বিষয়গুলিকে একটু সরল করে, স্ট্যাক ব্যবহার করুন, এবং কিছু নিবন্ধক মুক্ত করুন এবং তারপরে আমরা 4-সংখ্যার ডিসপ্লেতে আমাদের সংখ্যাগুলি পড়ার এবং প্রদর্শন করার কাজটি সম্পন্ন করার চেষ্টা করব।

ধাপ 5: পুশ 'এন পপ

পুশ 'এন পপ
পুশ 'এন পপ

এখানে মাত্র কয়েকটি "সাধারণ উদ্দেশ্য নিবন্ধন" আছে যা আমাদের কাছে আছে এবং একবার সেগুলি ব্যবহার হয়ে গেলে আর নেই। সুতরাং এটি কেবলমাত্র কয়েকটি ভেরিয়েবলের জন্য ব্যবহার করা ভাল প্রোগ্রামিং অনুশীলন যা অস্থায়ী স্টোরেজ হিসাবে ব্যবহার করা হয় যা থেকে আপনার পড়া, এবং লেখার জন্য, পোর্ট এবং SRAM এর সাথে প্রয়োজন হয়, অথবা অন্য যেগুলি আপনার সাবরুটিনে সর্বত্র প্রয়োজন হবে এবং তাই আপনি তাদের নাম. তাই আমি যা করেছি, এখন যখন আমরা শুরু করেছি এবং স্ট্যাক ব্যবহার করতে শিখছি, কোডের মধ্য দিয়ে যেতে হবে এবং নামযুক্ত সাধারণ উদ্দেশ্য রেজিস্টারগুলি খুঁজে বের করতে হবে যা শুধুমাত্র একটি সাবরুটিনের ভিতরে ব্যবহার করা হয় বা বাধা দেয় এবং কোডে অন্য কোথাও নেই এবং প্রতিস্থাপন করুন আমাদের একটি টেম্প রেজিস্টার এবং একটি ধাক্কা এবং স্ট্যাকের সাথে পপ। প্রকৃতপক্ষে, যদি আপনি ছোট মাইক্রোকন্ট্রোলারদের জন্য লিখিত কোডটি দেখেন, অথবা যদি আপনি সমস্ত চিপস ছোট হওয়ার সময় ফিরে যান, তাহলে আপনি কেবলমাত্র কয়েকটি সাধারণ উদ্দেশ্য রেজিস্টার দেখতে পাবেন যা সবকিছুর জন্য ব্যবহার করতে হয়েছিল, তাই আপনি পারেন নি শুধু সেখানে একটি মান সঞ্চয় করুন এবং এটি একা ছেড়ে দিন যেহেতু আপনি নিশ্চিত ছিলেন যে অন্যান্য জিনিসের জন্য এই নিবন্ধনের প্রয়োজন। সুতরাং আপনি কোডের সমস্ত জায়গায় পুশিন এবং একটি পপিন দেখতে পাবেন। হয়তো আমার অতীতের সাধারণ উদ্দেশ্য রেজিস্টার AX এবং BX কে সেই সম্মানিত কুদস হিসেবে গত দিনগুলোর নাম দেওয়া উচিত ছিল।

একটি উদাহরণ এটিকে আরো স্পষ্ট করতে সাহায্য করবে।

লক্ষ্য করুন যে আমাদের এনালগ থেকে ডিজিটাল রূপান্তর সম্পূর্ণ বিরতি ADC_int আমরা একটি সাধারণ উদ্দেশ্য রেজিস্টার ব্যবহার করি যার নাম আমরা buttonH দিয়েছিলাম যা আমরা ADCH এর মান লোড করতে এবং এটিকে আমাদের এনালগের সারণী টেবিলের সাথে বোতাম প্রেস রূপান্তরগুলির সাথে তুলনা করি। আমরা শুধুমাত্র ADC_int সাবরুটিনের মধ্যে এই বাটন H রেজিস্টারটি ব্যবহার করি এবং অন্য কোথাও নেই। সুতরাং পরিবর্তে আমরা আমাদের পরিবর্তনশীল temp2 ব্যবহার করব যা আমরা একটি অস্থায়ী পরিবর্তনশীল হিসাবে ব্যবহার করি যা আমরা যে কোন সাবরুটিনের মধ্যে ব্যবহার করতে পারি এবং এর মান সেই সাবরুটিনের বাইরে কোন কিছুকে প্রভাবিত করবে না (অর্থাৎ ADC_int এ আমরা যে মানটি দেব তা কোথাও ব্যবহার করা হবে না অন্য)।

আরেকটি উদাহরণ হল আমাদের বিলম্ব ম্যাক্রোতে। আমাদের একটি রেজিস্টার আছে যার নাম "মিলিসেকেন্ড" যার মধ্যে মিলিসেকেন্ডে আমাদের বিলম্বের সময় রয়েছে। এই ক্ষেত্রে এটি একটি ম্যাক্রোতে এবং আমরা স্মরণ করি যে ম্যাক্রোর কাজটি হল যে অ্যাসেম্বলার সমগ্র ম্যাক্রো কোডটিকে সেই প্রোগ্রামের জায়গায় রাখে যেখানে এটি বলা হয়। এই ক্ষেত্রে আমরা "মিলিসেকেন্ড" ভেরিয়েবল থেকে মুক্তি পেতে চাই এবং এটিকে আমাদের একটি অস্থায়ী ভেরিয়েবলের সাথে প্রতিস্থাপন করতে চাই। এই ক্ষেত্রে আমি একটু ভিন্নভাবে আপনাকে দেখাব যে কিভাবে ভেরিয়েবলের মান অন্য কোথাও প্রয়োজন হতে চলেছে তবুও আমরা স্ট্যাক ব্যবহার করে এটি ব্যবহার করতে পারি। তাই মিলিসেকেন্ডের পরিবর্তে আমরা "টেম্প" ব্যবহার করি এবং যাতে আমরা টেম্পের মান ব্যবহার করে এমন অন্যান্য জিনিসগুলিকে স্ক্রু না করি আমরা কেবল স্ট্যাকের উপর "ধাক্কা" দিয়ে "বিলম্ব" ম্যাক্রো শুরু করি, তারপর আমরা এটি ব্যবহার করি মিলিসেকেন্ডের পরিবর্তে, এবং তারপর ম্যাক্রোর শেষে আমরা তার আগের মানটি স্ট্যাক থেকে "পপ" করি।

নিট ফলাফল হল যে আমরা সাময়িক ব্যবহারের জন্য temp এবং temp2 "ধার" করেছি এবং তারপর সেগুলি তাদের পূর্বের মানগুলিতে পুনরুদ্ধার করেছি।

এই পরিবর্তন করার পরে এখানে ADC_int বাধা রুটিন রয়েছে:

ADC_int:

ধাক্কা তাপমাত্রা; টেম্প সংরক্ষণ করুন যেহেতু আমরা এটিকে এখানে সংশোধন করি টেম্প 2 চাপুন; temp2 lds temp2, ADCH সংরক্ষণ করুন; লোড কীপ্রেস ldi ZH, উচ্চ (2*সংখ্যা) ldi ZL, নিম্ন (2*সংখ্যা) cpi temp2, 0 ব্রেক রিটার্ন; যদি নয়েজ ট্রিগারগুলি 7segnumber setkey পরিবর্তন না করে: lpm temp, Z+; টেবিল থেকে লোড এবং পোস্ট ইনক্রিমেন্ট clc cp temp2, temp; টেবিল brlo PC+4 এর সাথে কীপ্রেস তুলনা করুন; যদি ADCH কম হয়, আবার চেষ্টা করুন lpm 7segnumber, Z; অন্যথায় keyvalue টেবিল ইনক ডিজিট লোড করুন; অঙ্ক সংখ্যা বৃদ্ধি rjmp রিটার্ন; এবং Adiw ZH ফেরত: ZL, 1; ইনক্রিমেন্ট জেড আরজেএমপি সেটকি; এবং শীর্ষ রিটার্ন ফিরে যান: পপ temp2; temp2 পপ তাপমাত্রা পুনরুদ্ধার করুন; তাপমাত্রা পুনরুদ্ধার করুন

লক্ষ্য করুন যে স্ট্যাকটি যেভাবে কাজ করে তা হল প্রথমটি শেষ বন্ধ। ঠিক যেন কাগজের স্তূপ। আপনি দেখতে পাচ্ছেন যে আমাদের প্রথম দুটি লাইনে আমরা স্ট্যাম্পে টেম্পের মান চাপিয়ে দিই, তারপর আমরা temp2 কে স্ট্যাকের দিকে ধাক্কা দেই, তারপর আমরা সেগুলিকে সাবরুটিনে অন্যান্য জিনিসের জন্য ব্যবহার করি, এবং অবশেষে আমরা আবার তাদের আগের মানগুলিতে পুনরুদ্ধার করি প্রথম পপিং temp2 বন্ধ (যেহেতু এটি শেষের দিকে ধাক্কা দেওয়া হয়েছিল স্ট্যাকের শীর্ষে এবং প্রথমটি আমরা পপ ব্যাক অফ করব) এবং তারপর টেম্পিং পপিং।

তাই এখন থেকে আমরা সবসময় এই পদ্ধতি ব্যবহার করব। একমাত্র সময় যখন আমরা প্রকৃতপক্ষে একটি টেম্প ভেরিয়েবল ছাড়া অন্য কিছুর জন্য একটি রেজিস্টার মনোনীত করব, যখন আমাদের সর্বত্র এটির প্রয়োজন হবে। উদাহরণস্বরূপ, "ওভারফ্লো" নামে একটি রেজিস্টার যা আমরা প্রোগ্রামে বিভিন্ন জায়গায় ব্যবহার করি এবং তাই আমরা এটির একটি নাম দিতে চাই। অবশ্যই আমরা এখনও এটি ব্যবহার করতে পারি যেভাবে আমরা temp এবং temp2 দিয়ে করেছি কারণ আমরা সম্পন্ন করার পর আমরা এর মান পুনরুদ্ধার করব। কিন্তু এটি জিনিসগুলিকে খুব বেশি স্প্যাগেটিফাই করবে। তারা একটি কারণে নামকরণ করা হয়েছে এবং আমরা ইতিমধ্যে temp এবং temp2 যে কাজের জন্য মনোনীত করা হয়েছে।

ধাপ 6: কম পাস ফিল্টার এবং ভোল্টেজ পরিবর্ধক

কম পাস ফিল্টার এবং ভোল্টেজ পরিবর্ধক
কম পাস ফিল্টার এবং ভোল্টেজ পরিবর্ধক
কম পাস ফিল্টার এবং ভোল্টেজ পরিবর্ধক
কম পাস ফিল্টার এবং ভোল্টেজ পরিবর্ধক

গোলমাল কিছুটা পরিষ্কার করতে এবং আমাদের কীপ্যাডকে আরও ভাল করতে আমরা কয়েকটি কম পাস ফিল্টার যুক্ত করতে চাই। এইগুলি উচ্চ ফ্রিকোয়েন্সি শব্দকে ফিল্টার করে এবং কম ফ্রিকোয়েন্সি সংকেতটি অতিক্রম করতে দেয়। মূলত এটি করার উপায় হল আমাদের এনালগ ইনপুট এবং গ্রাউন্ডের মধ্যে 68 পিএফ ক্যাপাসিটর এবং আমাদের PD4 (INT0) ইন্টারাপ্ট এবং গ্রাউন্ডের মধ্যে 0.1 মাইক্রোফার্ড (যেমন 104) ক্যাপাসিটর যুক্ত করা। যদি আপনি কীপ্যাডে বোতামগুলি চাপানোর সময় এগুলি নিয়ে খেলেন তবে আপনি দেখতে পাবেন যে তারা কী করে।

পরবর্তী আমরা একটি ভোল্টেজ পরিবর্ধক করতে চাই। এটি দেখা যাচ্ছে যে কীপ্যাডের নীচের সারিগুলি (সেইসাথে রেডিয়াল কী) INT0 বিঘ্ন ভ্রমণের জন্য খুব কম ভোল্টেজ নিচ্ছে। এই চাবিগুলি থেকে কম ভোল্টেজ পড়ার জন্য এনালগ পোর্ট যথেষ্ট সংবেদনশীল কিন্তু আমাদের বাধা পিন যখন আমরা সেই চাবিগুলিকে ধাক্কা দিই তখন বাধাগ্রস্ত হওয়ার জন্য যথেষ্ট উত্তম প্রান্ত পাচ্ছে না। অতএব আমরা নিশ্চিত করার কিছু উপায় চাই যে একটি চমৎকার ভোল্টেজ ক্রমবর্ধমান প্রান্ত PD4 আঘাত করে কিন্তু একই কম ভোল্টেজ ADC0 আঘাত করে। এটি একটি বেশ লম্বা অর্ডার যেহেতু উভয় সিগন্যাল আমাদের কীপ্যাডের একই আউটপুট তার থেকে আসছে। এটি করার জন্য অনেকগুলি অত্যাধুনিক উপায় রয়েছে, তবে আমরা এই টিউটোরিয়ালের পরে আর আমাদের কীপ্যাড ব্যবহার করতে যাচ্ছি না তাই আসুন আমরা একসাথে একটি পদ্ধতি ব্যবহার করি যা (সবে) কাজ করে।

আপনার প্রথমে INT0 ইন্টারাপ্ট প্রতিস্থাপন করার জন্য একটি বহিরাগত বোতাম লাগানো উচিত এবং কীপ্যাডে একটি কী ধরে এবং বোতামটি ক্লিক করে ডিসপ্লে নিয়ন্ত্রণ করা উচিত। এতে কম কীপ্যাড সমস্যা রয়েছে এবং আপনি আত্মবিশ্বাসী হতে পারবেন যে আপনার ভোল্টেজগুলি কীপ্যাড লুক-আপ টেবিলে সঠিকভাবে সেট করা আছে। একবার আপনি জানেন যে কীপ্যাডটি সঠিকভাবে ওয়্যার্ড করা আছে তারপরে বোতামটি পরিত্রাণ পান এবং INT0 ইন্টারাপ্ট ফিরে রাখুন। এইভাবে কীপ্যাড নিয়ন্ত্রণ করার জন্য কিছু গুরুতর শব্দ এবং ভোল্টেজ সমস্যা রয়েছে তাই এটি জেনে রাখা ভাল যে সবকিছু কাজ করে যাতে ভবিষ্যতের সমস্যাগুলি INT0 কী থেকে আলাদা করা যায়।

যখন আপনি আপনার কীপ্যাড এবং আপনার ভোল্টেজ পরিবর্ধককে সংযুক্ত করেন, তখন খুব সম্ভবত যে একই প্রতিরোধক মানগুলি আমি ব্যবহার করেছি তা কাজ করবে না। তাই আপনার জন্য কাজ করে এমন মানগুলি পেতে আপনাকে কিছু পরীক্ষা -নিরীক্ষা করতে হবে।

যদি আপনি এই ধাপের সাথে যে ডায়াগ্রামটি সংযুক্ত করেছেন তা দেখলে আপনি দেখতে পাবেন কিভাবে ভোল্টেজ এম্প্লিফায়ার কাজ করতে চলেছে। আমরা কিছু প্রতিরোধক এবং দুটি ট্রানজিস্টর ব্যবহার করি। ট্রানজিস্টর যেভাবে কাজ করে (ডেটা শীট দেখুন!) সেখানে একটি ন্যূনতম ভোল্টেজ আছে যা আপনাকে ট্রানজিস্টার (মাঝের পিন) এর বেস পিনে ইনপুট করতে হবে যা এটিকে পরিপূর্ণ করবে এবং কালেক্টর পিন এবং ইমিটারের মধ্যে কারেন্ট প্রবাহিত করতে দেবে পিন 2N3904 ট্রানজিস্টরের ক্ষেত্রে যা আমরা এখানে ব্যবহার করছি ভোল্টেজ 0.65V। এখন আমরা কিপ্যাড থেকে আমাদের আউটপুট থেকে সেই ভোল্টেজ নিচ্ছি এবং আমরা সেই আউটপুট পরিবর্তন করতে চাই না তাই আমরা কীপ্যাড থেকে আউটপুট এবং প্রথম ট্রানজিস্টরের বেসের মধ্যে একটি বড় রোধক রাখব (আমি 1Mohm ব্যবহার করেছি)। আমি এটিকে ডায়াগ্রামে R_1 হিসাবে লেবেল করেছি। তারপরে আমরা একটি ভোল্টেজ ডিভাইডার স্থাপন করতে চাই যাতে ট্রানজিস্টরের বেস ইতিমধ্যেই 0.65 ভোল্টে "প্রায়" থাকে এবং শুধুমাত্র একটি অল্প বয়স্ক ভিনিয়েট এটিকে উপরের দিকে ধাক্কা দেবে এবং এটি পরিপূর্ণ করবে। যখন আমরা একটি বোতাম ধাক্কা দিই তখন কিপ্যাডের আউটপুট থেকে সেই কিশোরী উইনি বিট আসবে। যেহেতু কীপ্যাডের নিচের চাবিগুলি কেবল একটি ক্ষুদ্র ভোল্টেজ নিচ্ছে, সেগুলি যথেষ্ট হওয়ার জন্য আমাদের ইতিমধ্যেই স্যাচুরেশনের খুব কাছাকাছি থাকা দরকার। ভোল্টেজ ডিভাইডার রেজিস্টারগুলিকে ডায়াগ্রামে R_a এবং R_b লেবেল করা হয়। আমি R_a = 1Mohm এবং R_b = 560Kohm ব্যবহার করেছি কিন্তু এটা প্রায় নিশ্চিত যে আপনার সেটআপের জন্য এটি সঠিকভাবে পেতে আপনাকে এই সংখ্যাগুলির সাথে খেলতে হবে।আপনার মাথা ঠেকানোর জন্য আপনি কাছাকাছি একটি প্রাচীর রাখতে চাইতে পারেন এবং হাতে দুই বা তিন গ্লাস স্কচ (আমি লাফ্রোইগের সুপারিশ করব - ব্যয়বহুল, কিন্তু আপনি যদি ধূমপান পছন্দ করেন তবে মূল্যবান। যদি জিনিসগুলি সত্যিই উন্মাদ হয়ে যায় তবে কেবল একটি জগ পান BV এর এবং রাতের জন্য বসতি স্থাপন)

এখন আসুন দেখি কিভাবে ট্রানজিস্টরগুলি আমাদের INT0 কী -এ প্রবেশ করে একটি সুন্দর উদীয়মান প্রান্ত পেতে যাচ্ছে এবং আমাদের কী -প্রেস বিঘ্ন সৃষ্টি করে। প্রথমে আসুন দেখি কী হয় যখন আমি কী চাপছি না। সেক্ষেত্রে প্রথম ট্রানজিস্টর (ডায়াগ্রামে T1 লেবেলযুক্ত) বন্ধ। সুতরাং কালেক্টর এবং এমিটার পিনের মধ্যে কোন স্রোত প্রবাহিত হচ্ছে না। এভাবে অন্য ট্রানজিস্টরের (T2 লেবেলযুক্ত) ভিত্তি উঁচু করা হবে এবং এইভাবে এটি তার পিনের মধ্যে কারেন্ট প্রবাহিত করার জন্য পরিপূর্ণ হবে। এর মানে হল যে T2 এর নির্গমনকারীকে কম টেনে আনা হবে কারণ এটি সংগ্রাহকের সাথে সংযুক্ত যা নিজেই মাটির সাথে সংযুক্ত। সুতরাং, আমাদের INT0 কীপ্রেস ইন্টারাপ্ট পিন (PD4) এ যে আউটপুট যাবে তা কম হবে এবং কোন বাধা থাকবে না।

এখন কি হবে যখন আমি একটি চাবি ধাক্কা? আচ্ছা তাহলে T1 এর ভিত্তি 0.65V এর উপরে চলে যায় (নিম্ন চাবিগুলির ক্ষেত্রে এটি কেবলমাত্র উপরে যায়!) এবং তারপরে বর্তমানকে প্রবাহের অনুমতি দেওয়া হবে যা T2 এর ভিত্তিকে কম ভোল্টেজে টানবে এবং এটি T2 বন্ধ করবে। কিন্তু আমরা দেখি যে যখন T2 বন্ধ থাকে, তখন আউটপুটটি উচ্চতর টানা হয় এবং তাই আমরা আমাদের INT0 পিনে 5V সংকেত পাব এবং এটি একটি বাধা সৃষ্টি করবে।

লক্ষ্য করুন নেট ফলাফল এখানে কি। যদি আমরা 1 টি কী ধাক্কা দিই, আমরা ADC0 এ যাওয়ার আউটপুট উল্লেখযোগ্যভাবে পরিবর্তন না করে PD4 তে 5V পেতে পারি, এবং আরো গুরুত্বপূর্ণ, আমরা যদি Asterisk, 0, Hash, বা Redial ধাক্কা দিই, আমরা INT0 এ গিয়ে 5V সিগন্যালও পাই বাধা সৃষ্টি করে! এটি গুরুত্বপূর্ণ কারণ যদি আমরা কেবল কীপ্যাড আউটপুট থেকে সরাসরি INT0 পিনে চলে যাই, সেই কীগুলি প্রায় কোনও ভোল্টেজ তৈরি করে না এবং সেগুলি বাধা পিন ট্রিগার করার জন্য যথেষ্ট হবে না। আমাদের ভোল্টেজ পরিবর্ধক এই সমস্যার সমাধান করেছে।

ধাপ 7: 4-সংখ্যার ডিসপ্লে কোড এবং ভিডিও

টিউটোরিয়াল 9 এর জন্য এটি সব! আমি কোড এবং একটি ভিডিও সংযুক্ত করেছি যা অপারেশন দেখায়।

এই শেষবার আমরা এনালগ কীপ্যাড ব্যবহার করব (thankশ্বরকে ধন্যবাদ)। এটি ব্যবহার করা কঠিন ছিল, কিন্তু এনালগ-টু-ডিজিটাল রূপান্তর, এনালগ পোর্ট, ইন্টারাপ্ট, মাল্টিপ্লেক্সিং, নয়েজ ফিল্টার, ভোল্টেজ এম্প্লিফায়ার এবং লুকআপ টেবিল থেকে টাইমার/কাউন্টার পর্যন্ত সমাবেশ কোডিংয়ের অনেক দিক সম্পর্কে জানতে আমাদের সাহায্য করার জন্য এটি খুব দরকারী ছিল, ইত্যাদি। তাই আমরা এটি ব্যবহার করার সিদ্ধান্ত নিয়েছি। (প্লাস এটা জিনিস scavenge মজা)।

এখন আমরা আবার যোগাযোগের দিকে নজর দিতে যাচ্ছি এবং আমাদের 7-সেগমেন্ট এবং আমাদের 4-অঙ্কের ডিসপ্লেগুলি আমাদের পাশা রোলার থেকে আমাদের পাশের রোলগুলি পড়তে যেভাবে আমরা আমাদের রেজিস্টার বিশ্লেষকের সাথে করেছি তা পেতে যাচ্ছি। এবার আমরা আমাদের হ্যাক করা একসাথে মোর্স কোড পদ্ধতির পরিবর্তে দুই-তারের ইন্টারফেস ব্যবহার করব।

একবার আমাদের যোগাযোগের কাজ হয়ে গেলে এবং ডিসপ্লেতে প্রদর্শিত রোলগুলি শেষ পর্যন্ত আমরা আমাদের চূড়ান্ত পণ্যের প্রথম অংশ তৈরি করতে পারি। আপনি লক্ষ্য করবেন যে সমস্ত এনালগ পোর্ট স্টাফ ছাড়া আমাদের কোড উল্লেখযোগ্যভাবে সংক্ষিপ্ত এবং সম্ভবত পড়তে সহজ হবে।

আপনারা যারা উচ্চাকাঙ্ক্ষী তাদের জন্য। এখানে একটি "প্রকল্প" যা আপনি চেষ্টা করতে পারেন যে আপনি যদি এই বিন্দুতে এই সমস্ত টিউটোরিয়ালের মধ্য দিয়ে গিয়ে থাকেন তবে এই মুহুর্তে আপনার অবশ্যই জ্ঞান আছে:

প্রকল্প: একটি ক্যালকুলেটর তৈরি করুন! আমাদের 4-সংখ্যার প্রদর্শন এবং আমাদের কীপ্যাড ব্যবহার করুন এবং একটি বহিরাগত বোতাম ধাক্কা যোগ করুন যা একটি "এন্টার" কী এর মত কাজ করবে। তারকাচিহ্নকে "বার" ম্যাপ করুন, হ্যাশকে "প্লাস" এবং ফ্ল্যাশকে "মাইনাস" এ ভাগ করুন এবং একটি ক্যালকুলেটর রুটিন লিখুন যা পুরানো এইচপি "রিভার্স পোলিশ" ক্যালকুলেটরের মতো কাজ করে যা সমস্ত ইঞ্জিনিয়ারদের ছিল দিনে ফিরে। I.e. তারা যেভাবে কাজ করে তা হল আপনি একটি নম্বর লিখুন এবং "এন্টার" টিপুন। এটি সেই সংখ্যাটিকে স্ট্যাকের দিকে ঠেলে দেয়, তারপর আপনি একটি দ্বিতীয় সংখ্যা লিখুন এবং "এন্টার" চাপুন, যা দ্বিতীয় নম্বরটিকে স্ট্যাকের দিকে ঠেলে দেয়। অবশেষে আপনি X, /, + অথবা - এর মতো একটি অপারেশন টিপুন এবং এটি সেই অপারেশনটি স্ট্যাকের উপরের দুটি নম্বরে প্রয়োগ করবে, ফলাফল প্রদর্শন করবে এবং ফলাফলটিকে স্ট্যাকের উপর চাপ দেবে যাতে আপনি যদি এটি ব্যবহার করতে পারেন মত উদাহরণস্বরূপ 2+3 যোগ করার জন্য আপনি করবেন: 2, "এন্টার", 3, "এন্টার", "+" এবং ডিসপ্লে তখন 5 পড়বে। আপনি জানেন কিভাবে স্ট্যাক, ডিসপ্লে, কীপ্যাড ব্যবহার করতে হয় এবং আপনি ইতিমধ্যে বেশিরভাগ ব্যাকগ্রাউন্ড কোড লেখা আছে। শুধু ক্যালকুলেটরের জন্য প্রয়োজনীয় এন্টার কী এবং সাবরুটিন যোগ করুন। আপনি প্রথমে ভাবার চেয়ে এটি কিছুটা জটিল, তবে এটি মজাদার এবং করতে সক্ষম।

পরে আবার দেখা হবে!

প্রস্তাবিত: