সুচিপত্র:

AVR মাইক্রোকন্ট্রোলার। একটি পুশ বাটন সুইচ ব্যবহার করে LED গুলি টগল করুন। পুশ বাটন ডিবাউন্সিং ।: 4 ধাপ
AVR মাইক্রোকন্ট্রোলার। একটি পুশ বাটন সুইচ ব্যবহার করে LED গুলি টগল করুন। পুশ বাটন ডিবাউন্সিং ।: 4 ধাপ

ভিডিও: AVR মাইক্রোকন্ট্রোলার। একটি পুশ বাটন সুইচ ব্যবহার করে LED গুলি টগল করুন। পুশ বাটন ডিবাউন্সিং ।: 4 ধাপ

ভিডিও: AVR মাইক্রোকন্ট্রোলার। একটি পুশ বাটন সুইচ ব্যবহার করে LED গুলি টগল করুন। পুশ বাটন ডিবাউন্সিং ।: 4 ধাপ
ভিডিও: LDmicro 10: Incubator Temperature Regulator (Microcontroller PLC Ladder Programming with LDmicro) 2024, জুলাই
Anonim
Image
Image

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

ধাপ 1: ইটিগ্রেটেড ডেভেলপমেন্ট প্ল্যাটফর্ম এটমেল স্টুডিও 7 ব্যবহার করে সি কোডে AVR মাইক্রোকন্ট্রোলার অ্যাপ্লিকেশন লেখা এবং নির্মাণ করা

ইটিগ্রেটেড ডেভেলপমেন্ট প্ল্যাটফর্ম এটমেল স্টুডিও 7 ব্যবহার করে সি কোডে AVR মাইক্রোকন্ট্রোলার অ্যাপ্লিকেশন লেখা এবং নির্মাণ করা
ইটিগ্রেটেড ডেভেলপমেন্ট প্ল্যাটফর্ম এটমেল স্টুডিও 7 ব্যবহার করে সি কোডে AVR মাইক্রোকন্ট্রোলার অ্যাপ্লিকেশন লেখা এবং নির্মাণ করা
ইটিগ্রেটেড ডেভেলপমেন্ট প্ল্যাটফর্ম এটমেল স্টুডিও 7 ব্যবহার করে সি কোডে AVR মাইক্রোকন্ট্রোলার অ্যাপ্লিকেশন লেখা এবং নির্মাণ করা
ইটিগ্রেটেড ডেভেলপমেন্ট প্ল্যাটফর্ম এটমেল স্টুডিও 7 ব্যবহার করে সি কোডে AVR মাইক্রোকন্ট্রোলার অ্যাপ্লিকেশন লেখা এবং নির্মাণ করা
ইটিগ্রেটেড ডেভেলপমেন্ট প্ল্যাটফর্ম এটমেল স্টুডিও 7 ব্যবহার করে সি কোডে AVR মাইক্রোকন্ট্রোলার অ্যাপ্লিকেশন লেখা এবং নির্মাণ করা
ইটিগ্রেটেড ডেভেলপমেন্ট প্ল্যাটফর্ম এটমেল স্টুডিও 7 ব্যবহার করে সি কোডে AVR মাইক্রোকন্ট্রোলার অ্যাপ্লিকেশন লেখা এবং নির্মাণ করা

আপনার যদি অ্যাটমেল স্টুডিও না থাকে তবে আপনার এটি ডাউনলোড এবং ইনস্টল করা উচিত।

www.microchip.com/mplab/avr-support/atmel-studio-7

প্রথম কয়েকটি লাইন আমাদের কিছু কম্পাইলার সংজ্ঞায়িত করে।

F_CPU হার্টজে ঘড়ির ফ্রিকোয়েন্সি সংজ্ঞায়িত করে এবং avr-libc লাইব্রেরি ব্যবহার করে প্রোগ্রামগুলিতে সাধারণ। এই ক্ষেত্রে এটি বিলম্ব রুটিন দ্বারা ব্যবহৃত হয় কিভাবে সময় বিলম্ব গণনা করা যায়।

#ifndef F_CPU

#ডিফাইন F_CPU 16000000UL // কন্ট্রোলার ক্রিস্টাল ফ্রিকোয়েন্সি বলছে (16 MHz AVR ATMega328P) #endif

#অন্তর্ভুক্ত // হেডার পিনের উপর তথ্য প্রবাহ নিয়ন্ত্রণ সক্ষম করতে। পিন, পোর্ট ইত্যাদি সংজ্ঞায়িত করে।

প্রথম অন্তর্ভুক্ত ফাইলটি avr-libc এর অংশ এবং আপনি যে কোন AVR প্রজেক্টে কাজ করেন তা ব্যবহার করা হবে। io.h আপনি যে CPU ব্যবহার করছেন তা নির্ধারণ করবে (যে কারণে কম্পাইল করার সময় আপনি অংশটি নির্দিষ্ট করেন) এবং পরিবর্তে আমরা যে চিপটি ব্যবহার করছি তার জন্য উপযুক্ত IO সংজ্ঞা শিরোনাম অন্তর্ভুক্ত করুন। এটি কেবল আপনার সমস্ত পিন, পোর্ট, বিশেষ রেজিস্টার ইত্যাদির জন্য ধ্রুবক সংজ্ঞায়িত করে।

#অন্তর্ভুক্ত // হেডার প্রোগ্রামে বিলম্ব ফাংশন সক্ষম করতে

লাইব্রেরির ইউটিলিটি/বিলম্ব।এতে অল্প বিলম্বের জন্য কিছু রুটিন রয়েছে। আমরা যে ফাংশনটি ব্যবহার করব তা হল _delay_ms ()।

আমরা আমাদের বোতাম এবং LED এর পোর্ট এবং পিন ঘোষণা করতে সংজ্ঞায়িত ব্যবহার করি। এইরকম সংজ্ঞায়িত বিবৃতি ব্যবহার করলে আমাদের কেবলমাত্র 3 টি সহজ-সন্ধানযোগ্য লাইন পরিবর্তন করতে হবে যদি আমরা LED কে ভিন্ন I/O পিনে নিয়ে যাই বা ভিন্ন AVR ব্যবহার করি।

#ডিফাইন বাটন 1 1 // বোতাম সুইচ পোর্ট বি পিন 1 এর সাথে সংযুক্ত

#ডিফাইন LED1 0 // Led1 পোর্ট B পিনের সাথে সংযুক্ত 0 #LEDfin LED2 1 // Led2 পোর্ট সি পিন 1 এর সাথে সংযুক্ত #ডিফাইন LED3 2 // Led3 পোর্ট D পিন 2 এর সাথে সংযুক্ত

চূড়ান্ত দুটি বিবৃতি সেটআপের সময় নির্ধারণ করে, মিলিসেকেন্ডে, সুইচটি ডিবাউন্স করার জন্য এবং বোতামের আরেকটি প্রেস করার আগে অপেক্ষা করার সময়। ডিবাউন্স টাইমকে সব সময় বাউন্স করার পর ডিজিটাল হাই থেকে ডিজিটাল লোতে যাওয়ার জন্য সুইচ লাগে এমন সময়ের সাথে সমন্বয় করা প্রয়োজন। বাউন্স আচরণ সুইচ থেকে সুইচ ভিন্ন হবে, কিন্তু 20-30 মিলিসেকেন্ড সাধারণত যথেষ্ট যথেষ্ট।

#ডিফাইন DEBOUNCE_TIME 25 // "ডি-বাউন্সিং" বোতামের সময় অপেক্ষা করার সময়

#সংজ্ঞায়িত LOCK_INPUT_TIME 300 // একটি বাটন চাপার পর অপেক্ষা করার সময়

অকার্যকর init_ports_mcu ()

{

আমাদের প্রোগ্রামের শুরুতে এই ফাংশনটিকে একবার বলা হয় ইনপুট আউটপুট পিনগুলি যা আমরা ব্যবহার করব।

বোতামের জন্য, আমরা লেখা এবং পড়ার জন্য পোর্ট এবং পিন রেজিস্টার ব্যবহার করব। AVR এর সাথে, আমরা তার PINx রেজিস্টার ব্যবহার করে একটি পিন পড়ি এবং আমরা এটি PORTx রেজিস্টার ব্যবহার করে একটি পিনে লিখি। পুল-আপগুলি সক্ষম করতে আমাদের বোতাম নিবন্ধনে লিখতে হবে।

LED এর জন্য আমাদের শুধুমাত্র PORT রেজিস্টার লিখতে হবে, তবে আমাদের ডেটা ডাইরেকশন রেজিস্টার (DDR) এরও প্রয়োজন কারণ I/O পিনগুলি ডিফল্টরূপে ইনপুট হিসাবে সেটআপ করা আছে।

প্রথমত, আমরা LED এর I/O পিনগুলিকে আউটপুট হিসেবে সেট করছি এর ডেটা ডাইরেকশন রেজিস্টার ব্যবহার করে।

DDRB = 0xFFu; // PORTB এর সমস্ত পিন আউটপুট হিসাবে সেট করুন।

পরবর্তী, স্পষ্টভাবে একটি ইনপুট হিসাবে বোতাম পিন সেট করুন।

DDRB & = ~ (1 <

পরবর্তী, PORTB পিনগুলি এটি চালু করতে উচ্চ (+5 ভোল্ট) সেট করা আছে। আউটপুট পিন প্রাথমিকভাবে উচ্চ, এবং যেহেতু আমাদের LED সক্রিয়-উচ্চ তারযুক্ত, এটি চালু করা হবে যদি না আমরা স্পষ্টভাবে এটি বন্ধ করি।

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

PORTB = 0xFF; // PORTB এর সমস্ত পিনগুলি উচ্চ হিসাবে সেট করুন। নেতৃত্ব চালু আছে, // প্রথম পিন PORTB এর অভ্যন্তরীণ পুল আপ প্রতিরোধকও সক্ষম। DDRC = 0xFFu; // PORTC এর সকল পিন আউটপুট হিসেবে সেট করুন। PORTC = 0x00u; // PORTC এর সমস্ত পিন কম সেট করুন যা এটি বন্ধ করে দেয়। DDRD = 0xFFu; // PORTD এর সমস্ত পিন আউটপুট হিসাবে সেট করুন। PORTD = 0x00u; // PORTD এর সমস্ত পিন কম সেট করুন যা এটি বন্ধ করে দেয়। }

স্বাক্ষর না করা চর button_state ()

{

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

এখন, মনে রাখবেন যখন আমরা সুইচ টিপি, ইনপুট আউটপুট পিন মাটিতে টানা হয়। সুতরাং, আমরা পিন কম যাওয়ার জন্য অপেক্ষা করছি।

/ * বাটন চাপলে বাটন 1 বিট পরিষ্কার হয় */

যদি (! (PINB এবং (1 <

বিট পরিষ্কার কিনা তা যাচাই করে আমরা তা করি। যদি বিটটি পরিষ্কার হয়, যা নির্দেশ করে যে বোতামটি বিষণ্ন, আমরা প্রথমে DEBOUNCE_TIME দ্বারা নির্ধারিত সময়ের পরিমাণের জন্য বিলম্ব করি যা 25ms এবং তারপরে আবার বোতামের অবস্থা পরীক্ষা করুন। যদি 25ms এর পরে বোতামটি হতাশ হয় তবে সুইচটি বাতিল বলে মনে করা হয় এবং একটি ইভেন্ট ট্রিগার করার জন্য প্রস্তুত এবং তাই আমরা আমাদের কলিং রুটিনে 1 ফিরে আসি। যদি বোতামটি বিষণ্ন না হয়, আমরা আমাদের কলিং রুটিনে 0 ফিরে আসি।

_delay_ms (DEBOUNCE_TIME);

যদি (! (PINB এবং (1 <

int প্রধান (শূন্য)

{

আমাদের প্রধান রুটিন। প্রধান ফাংশনটি অনন্য এবং অন্যান্য সমস্ত ফাংশন থেকে আলাদা। প্রতিটি সি প্রোগ্রামে অবশ্যই একটি প্রধান () ফাংশন থাকতে হবে। প্রধান হল যেখানে AVR আপনার কোড চালানো শুরু করে যখন বিদ্যুৎ প্রথম চালু হয়, তাই এটি প্রোগ্রামের এন্ট্রি পয়েন্ট।

স্বাক্ষরবিহীন চার n_led = 1; // প্রাথমিকভাবে LED নম্বর এখন চালু আছে

I/O পিন ব্যবহার করার জন্য ফাংশনের কল:

init_ports_mcu ();

অসীম লুপ যেখানে আমাদের প্রোগ্রাম চলে:

যখন (1)

{

যখন button_state রিটার্ন করে একটি ইঙ্গিত করে যে বোতাম টিপানো হয়েছে এবং ডিবাউন্স করা হয়েছে, তখন n_led প্যারামিটার অনুযায়ী LED এর বর্তমান অবস্থা টগল করা।

যদি (button_state)

{সুইচ (n_led) {কেস 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); বিরতি;

এই বিবৃতিগুলি সি বিটওয়াইজ অপারেটর ব্যবহার করে। এবার এটি একচেটিয়া বা অপারেটর ব্যবহার করছে। যখন আপনি পোর্টটি বিট এর বিট ভ্যালু দিয়ে টগল করতে চান, তখন সেই বিট অন্য বিটগুলিকে প্রভাবিত না করে পরিবর্তন করা হয়।

কেস 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); বিরতি; কেস 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // রিসেট এলইডি নম্বর ব্রেক; } n_led ++; // পরবর্তী LED _delay_ms (LOCK_INPUT_TIME) চালু হয়; }} ফেরত (0); }

তাই এখন, যখন আপনি এই প্রোগ্রামটি চালাবেন, তখন আপনি LED- এর টগলিং-এ পুশ-বোতাম টিপতে সক্ষম হবেন। LOCK_INPUT_TIME দ্বারা সংজ্ঞায়িত আমাদের বিলম্বের কারণে, আপনি বোতাম টিপতে এবং ধরে রাখতে পারেন যার ফলে LED গুলি বন্ধ হয়ে যাবে এবং সামঞ্জস্যপূর্ণ হারে (প্রতি 275ms এর চেয়ে একটু বেশি)।

প্রোগ্রামিং সম্পূর্ণ।

পরবর্তী ধাপ হল প্রকল্প নির্মাণ করা এবং এভ্রুডুড প্রোগ্রাম ব্যবহার করে মাইক্রোকন্ট্রোলারে হেক্স ফাইল প্রোগ্রাম করা।

আপনি সি কোডে প্রোগ্রামের সাথে main.c ফাইলটি ডাউনলোড করতে পারেন:

পদক্ষেপ 2: চিপের ফ্ল্যাশ মেমরিতে প্রোগ্রামের HEX ফাইল স্থানান্তর করা

চিপের ফ্ল্যাশ মেমরিতে প্রোগ্রামের HEX ফাইল স্থানান্তর করা
চিপের ফ্ল্যাশ মেমরিতে প্রোগ্রামের HEX ফাইল স্থানান্তর করা
চিপের ফ্ল্যাশ মেমরিতে প্রোগ্রামের HEX ফাইল স্থানান্তর করা
চিপের ফ্ল্যাশ মেমরিতে প্রোগ্রামের HEX ফাইল স্থানান্তর করা

AVRDUDE ডাউনলোড এবং ইনস্টল করুন। সর্বশেষ সংস্করণটি উপলব্ধ 6.3: জিপ ফাইলটি ডাউনলোড করুন

প্রথমে, প্রোগ্রামের হেক্স ফাইলটি AVRDUDE ডিরেক্টরিতে অনুলিপি করুন। আমার ক্ষেত্রে এটি ButtonAVR.hex

তারপরে, ডস প্রম্পট উইন্ডোতে কমান্ডটি টাইপ করুন: avrdude –c [প্রোগ্রামারের নাম] mp m328p –u –U ফ্ল্যাশ: w: [আপনার হেক্স ফাইলের নাম]।

আমার ক্ষেত্রে এটি হল: avrdude –c ISPProgv1 –p m328p –u –U ফ্ল্যাশ: w: ButtonAVR.hex

এই কমান্ডটি মাইক্রোকন্ট্রোলারের স্মৃতিতে হেক্স ফাইল লিখে।

মাইক্রোকন্ট্রোলার ফ্ল্যাশ মেমরি বার্নের বিস্তারিত বিবরণ সহ ভিডিওটি দেখুন:

মাইক্রোকন্ট্রোলার ফ্ল্যাশ মেমরি জ্বলছে …

ঠিক আছে! এখন, মাইক্রোকন্ট্রোলার আমাদের প্রোগ্রামের নির্দেশনা অনুযায়ী কাজ করে। আসুন এটি পরীক্ষা করে দেখি!

ধাপ 3: হার্ডওয়্যার সুইচ ডিবাউন্সিং

হার্ডওয়্যার সুইচ ডিবাউন্সিং
হার্ডওয়্যার সুইচ ডিবাউন্সিং

সফটওয়্যার সুইচ ডিবাউন্সিং ছাড়াও আমরা হার্ডওয়্যার সুইচ ডিবাউন্সিং টেকনিক ব্যবহার করতে পারি। সুইচ সিগন্যালে দ্রুত পরিবর্তন ফিল্টার করার জন্য ক্যাপাসিটর ব্যবহার করা এই ধরনের কৌশলটির পিছনে মূল ধারণা।

কোন মান ক্যাপাসিটর নির্বাচন করা উচিত? এই চূড়ান্তভাবে এই বিশেষ সমস্যা সম্পর্কিত বাটন কতটা খারাপভাবে কাজ করে তার উপর নির্ভর করবে। কিছু বোতাম একটি অসাধারণ বাউন্সিং আচরণ প্রদর্শন করতে পারে, তবুও অন্যদের খুব কম হবে। 1.0 ন্যানোফারাদের মতো কম ক্যাপাসিটরের মান খুব দ্রুত প্রতিক্রিয়া দেখাবে, বাউন্সিংয়ের উপর সামান্য বা কোন প্রভাব ফেলবে না। বিপরীতভাবে, একটি উচ্চতর ক্যাপাসিটরের মান যেমন 220 ন্যানোফারাড (যা ক্যাপাসিটরের ক্ষেত্রে এখনও বেশ ছোট) শুরু থেকে শেষ ভোল্টেজ (5 ভোল্ট থেকে 0 ভোল্ট) পর্যন্ত ধীর গতির প্রদান করবে। একটি 220 nanofarads ধারণক্ষমতা সঙ্গে দেখা পরিবর্তন এখনও বাস্তব বিশ্বের অর্থে বেশ দ্রুত যদিও, এবং এইভাবে খারাপভাবে সঞ্চালিত বোতাম ব্যবহার করা যেতে পারে।

ধাপ 4: বৈদ্যুতিক সার্কিট

বৈদ্যুতিক বর্তনী
বৈদ্যুতিক বর্তনী
বৈদ্যুতিক বর্তনী
বৈদ্যুতিক বর্তনী
বৈদ্যুতিক বর্তনী
বৈদ্যুতিক বর্তনী

পরিকল্পিত ডায়াগ্রাম অনুসারে উপাদানগুলি সংযুক্ত করুন।

প্রস্তাবিত: