সুচিপত্র:

AVR Assembler টিউটোরিয়াল 2: 4 ধাপ
AVR Assembler টিউটোরিয়াল 2: 4 ধাপ

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

ভিডিও: AVR Assembler টিউটোরিয়াল 2: 4 ধাপ
ভিডিও: 2. Registers (data,pointer,index registers ) in assembly language programming in bangla 2024, জুলাই
Anonim
AVR Assembler Tutorial 2
AVR Assembler Tutorial 2

এই টিউটোরিয়ালটি "AVR Assembler Tutorial 1" এর ধারাবাহিকতা

আপনি যদি টিউটোরিয়াল 1 দিয়ে না যান তবে আপনার এখনই থামতে হবে এবং প্রথমে এটি করা উচিত।

এই টিউটোরিয়ালে আমরা Arduino- এ ব্যবহৃত atmega328p এর অ্যাসেম্বলি ল্যাঙ্গুয়েজ প্রোগ্রামিং নিয়ে আমাদের গবেষণা চালিয়ে যাব।

আপনার প্রয়োজন হবে:

  1. টিউটোরিয়াল 1 এর মতো একটি রুটিবোর্ড আরডুইনো বা একটি সাধারণ আরডুইনো
  2. একটি LED
  3. একটি 220 ওহম প্রতিরোধক
  4. একটি ধাক্কা বোতাম
  5. আপনার রুটিবোর্ডে সার্কিট তৈরির জন্য তারের সংযোগ
  6. ইন্সটাকশন সেট ম্যানুয়াল: www.atmel.com/images/atmel-0856-avr-instruction-s…
  7. ডেটশীট: www.atmel.com/images/Atmel-8271-8-bit-AVR-Microco…

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

ধাপ 1: সার্কিট নির্মাণ

সার্কিট নির্মাণ
সার্কিট নির্মাণ

প্রথমে আপনাকে এই সার্কিটটি তৈরি করতে হবে যা আমরা এই টিউটোরিয়ালে পড়ব।

এটি সংযুক্ত করার উপায় এখানে:

PB0 (ডিজিটাল পিন 8) - LED - R (220 ohm) - 5V

PD0 (ডিজিটাল পিন 0) - pushbutton - GND

PB0 এর পরিবর্তে GND এর সাথে সংযোগ করে আপনার LED ঠিকমতো আছে কিনা তা পরীক্ষা করতে পারেন। যদি কিছু না ঘটে তাহলে ওরিয়েন্টেশনকে উল্টে দিন এবং আলো আসা উচিত। তারপরে এটি PB0 তে পুনরায় সংযুক্ত করুন এবং চালিয়ে যান। ছবিটি দেখায় কিভাবে আমার ব্রেডবোর্ড আরডুইনো সংযুক্ত।

ধাপ 2: অ্যাসেম্বলি কোড লেখা

অ্যাসেম্বলি কোড লেখা
অ্যাসেম্বলি কোড লেখা

Pushbutton.asm নামক একটি টেক্সট ফাইলে নিচের কোডটি লিখুন এবং টিউটোরিয়াল ১ -এর মতো এটিকে অভ্র দিয়ে কম্পাইল করুন।

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

;************************************

; লিখেছেন: 1o_o7; তারিখ: অক্টোবর 23, 2014; **************************************

.nolist

"m328Pdef.inc".list.def temp = r16 অন্তর্ভুক্ত করুন। ওয়ার্কিং রেজিস্টার r16 কে টেম্পার rjmp Init হিসাবে মনোনীত করুন; প্রথম লাইন কার্যকর করা হয়েছে

এটা:

ser temp; সমস্ত বিট টেম্পারে 1 এর জন্য সেট করুন। DDRB, temp; ডেটা দিকনির্দেশ I/O তে 1 হিসাবে কিছুটা সেট করা; পোর্টবি এর জন্য নিবন্ধন করুন, যা ডিডিআরবি, সেট করে যে; আউটপুট হিসাবে পিন, একটি 0 ইনপুট হিসাবে যে পিন সেট করবে; তাই এখানে, সমস্ত পোর্টবি পিন আউটপুট (1 এ সেট) ldi temp, 0b11111110; টেম্প রেজিস্টারে 'অবিলম্বে' নম্বর লোড করুন; যদি এটি শুধু ld হয় তাহলে দ্বিতীয় যুক্তি; DDRD, temp এর পরিবর্তে একটি মেমরি লোকেশন হতে হবে; mv temp থেকে DDRD, ফলাফল হল PD0 ইনপুট; এবং বাকি আউটপুট clr temp; টেম্পের সমস্ত বিট 0 এর আউট পোর্টবি, টেম্পে সেট করা আছে; পোর্টবি -তে 0V ldi temp, 0b00000001 এ সমস্ত বিট (যেমন পিন) সেট করুন; পোর্টডি, টেম্প আউট করার জন্য অবিলম্বে নম্বর লোড করুন; পোর্টডি তে তাপমাত্রা সরান। PD0 একটি টান আপ প্রতিরোধক আছে; (যেমন 5V সেট) যেহেতু এটি একটি 1 বিট আছে; বাকি 0 0 থেকে 0V।

প্রধান:

তাপমাত্রায়, PinD; পিনডি পোর্টডি অবস্থায় রয়েছে, এটিকে টেম্পারে কপি করুন; যদি বাটনটি PD0 এর সাথে সংযুক্ত থাকে তবে এটি হবে; 0 যখন বোতামটি ধাক্কা দেওয়া হয়, 1 অন্যথায়; PD0 একটি পুল আপ প্রতিরোধক এটি সাধারণত 5V আউট পোর্টবি, তাপমাত্রা; 0 এবং 1 এর উপরে পাঠানো পোর্টবিতে পাঠায়; এর মানে হল আমরা PB0 তে LED সংযুক্ত চাই, যখন PD0 কম হয়, এটি PB0 কে LOW তে সেট করে এবং চালু করে; LED তে (যেহেতু LED এর অন্য দিকে; 5V এর সাথে সংযুক্ত এবং এটি PB0 থেকে 0V সেট করবে; কারেন্ট প্রবাহিত হবে) rjmp Main; মূল শুরুতে ফিরে যান

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

আপনি উপরের কোডটি কম্পাইল করার পরে আপনাকে এটি মাইক্রোকন্ট্রোলারে লোড করতে হবে এবং দেখতে হবে যে এটি কাজ করে। আপনি যখন বোতাম টিপছেন তখন LED চালু হওয়া উচিত এবং তারপর যখন আপনি ছেড়ে দেবেন তখন আবার বন্ধ করুন। আমি ছবিতে দেখিয়েছি এটি কেমন দেখাচ্ছে।

ধাপ 3: কোডের লাইন বাই লাইন বিশ্লেষণ

আমি যে লাইনগুলিকে নিছক মন্তব্য বলে এড়িয়ে যাচ্ছি কারণ তাদের উদ্দেশ্য স্ব-স্পষ্ট।

.nolist

"m328Pdef.inc".list অন্তর্ভুক্ত করুন

এই তিনটি লাইনে আমরা যে প্রোগ্রামিং করছি তার ATmega328P- এর রেজিস্টার এবং বিট সংজ্ঞা সম্বলিত ফাইল অন্তর্ভুক্ত।. Nolist কমান্ড অ্যাসেম্বলারকে বলে যে এই ফাইলটি pushbutton.lst ফাইলে অন্তর্ভুক্ত করবেন না যখন এটি একত্রিত করে। এটি তালিকা বিকল্প বন্ধ করে দেয়। ফাইল অন্তর্ভুক্ত করার পর আমরা.list কমান্ড দিয়ে তালিকাভুক্তি বিকল্পটি চালু করি। আমরা এটি করার কারণ হল m328Pdef.inc ফাইলটি বেশ লম্বা এবং আমাদের তালিকা ফাইলে এটি দেখার দরকার নেই। আমাদের অ্যাসেম্বলার, অভ্র, স্বয়ংক্রিয়ভাবে একটি তালিকা ফাইল তৈরি করে না এবং যদি আমরা একটি চাই তবে আমরা নিম্নলিখিত কমান্ডটি ব্যবহার করে একত্রিত করব:

avra -l pushbutton.lst pushbutton.asm

আপনি যদি এটি করেন তবে এটি pushbutton.lst নামে একটি ফাইল তৈরি করবে এবং আপনি যদি এই ফাইলটি পরীক্ষা করেন তবে আপনি দেখতে পাবেন যে এটি অতিরিক্ত তথ্য সহ আপনার প্রোগ্রাম কোড দেখায়। যদি আপনি অতিরিক্ত তথ্যের দিকে তাকান তাহলে আপনি দেখতে পাবেন যে লাইনগুলি একটি C দিয়ে শুরু হয়: এর পরে হেক্সে আপেক্ষিক ঠিকানা যেখানে কোডটি মেমরিতে রাখা হয়েছে। মূলত এটি প্রথম কমান্ড দিয়ে 000000 এ শুরু হয় এবং প্রতিটি পরবর্তী কমান্ডের সাথে সেখান থেকে বৃদ্ধি পায়। মেমরিতে আপেক্ষিক স্থানের পরে দ্বিতীয় কলাম হল কমান্ডের হেক্স কোড এবং কমান্ডের যুক্তির জন্য হেক্স কোড। আমরা ভবিষ্যতে টিউটোরিয়ালগুলিতে তালিকা ফাইলগুলি নিয়ে আরও আলোচনা করব।

.def temp = r16; ওয়ার্কিং রেজিস্টার r16 কে টেম্পার হিসেবে মনোনীত করুন

এই লাইনে আমরা অ্যাসেম্বলার নির্দেশিকা ".def" ব্যবহার করি ভেরিয়েবল "টেম্প" কে r16 "ওয়ার্কিং রেজিস্টার" এর সমান হিসাবে নির্ধারণ করতে। আমরা রেজিস্টার r16 ব্যবহার করবো যেটি আমরা বিভিন্ন পোর্ট এবং রেজিস্টারে কপি করতে চাই এমন সংখ্যা সংরক্ষণ করে (যা সরাসরি লেখা যায় না)।

অনুশীলন 1: একটি বাইনারি নম্বর সরাসরি একটি পোর্টে বা DDRB এর মতো বিশেষ রেজিস্টারে অনুলিপি করার চেষ্টা করুন এবং দেখুন যখন আপনি কোডটি একত্রিত করার চেষ্টা করেন তখন কী হয়।

একটি রেজিস্টারে একটি বাইট (b বিট) তথ্য থাকে। মূলত এটি সাধারণত এসআর-ল্যাচগুলির একটি সংগ্রহ যা প্রত্যেকটি একটি "বিট" এবং এতে 1 বা 0. থাকে। আপনি হয়তো ভাবছেন "ওয়ার্কিং রেজিস্টার" কি এবং কেন আমরা r16 বেছে নিলাম। আমরা ভবিষ্যতের টিউটোরিয়ালে আলোচনা করব যখন আমরা চিপের অভ্যন্তরীণ অংশের চূড়ায় ডুব দেব। আপাতত আমি চাই আপনি কিভাবে লিখবেন কোড এবং প্রোগ্রাম ফিজিক্যাল হার্ডওয়্যারের মত কাজ করবেন। তারপরে আপনার সেই অভিজ্ঞতা থেকে রেফারেন্সের একটি ফ্রেম থাকবে যা মাইক্রোকন্ট্রোলারের স্মৃতি এবং নিবন্ধন বৈশিষ্ট্যগুলি বোঝা সহজ করে তুলবে। আমি বুঝতে পারি যে বেশিরভাগ প্রারম্ভিক পাঠ্যপুস্তক এবং আলোচনাগুলি অন্যভাবে এটি করে কিন্তু আমি দেখেছি যে নির্দেশিকা ম্যানুয়াল পড়ার আগে একটি বৈশ্বিক দৃষ্টিভঙ্গি পেতে প্রথমে কিছুক্ষণের জন্য একটি ভিডিও গেম খেলা ম্যানুয়ালটি পড়ার চেয়ে অনেক সহজ।

rjmp Init; প্রথম লাইন কার্যকর করা হয়েছে

এই লাইনটি "Init" লেবেলের একটি "আপেক্ষিক লাফ" এবং এখানে সত্যিই প্রয়োজনীয় নয় কারণ পরবর্তী কমান্ডটি ইতিমধ্যেই Init এ আছে কিন্তু আমরা এটি ভবিষ্যতের ব্যবহারের জন্য অন্তর্ভুক্ত করেছি।

এটা:

ser temp; সমস্ত বিট টেম্পারে 1 এর জন্য সেট করুন।

ইনিট লেবেলের পরে আমরা একটি "সেট রেজিস্টার" কমান্ড চালাই। এটি রেজিস্টার "টেম্প" (যা আপনি r16 মনে করেন) এর 8 টি বিটের সবগুলিকে 1 এর মধ্যে সেট করে। তাই টেম্পে এখন 0b11111111 রয়েছে।

DDRB, temp; ডেটা দিকনির্দেশ I/O রেজিস্টারে 1 হিসাবে কিছুটা সেট করা

; পোর্টবি, যা ডিডিআরবি, সেই পিনটিকে আউটপুট হিসেবে সেট করে; একটি 0 ইনপুট হিসাবে যে পিন সেট করবে; তাই এখানে, সব পোর্টবি পিন আউটপুট (1 সেট)

রেজিস্টার ডিডিআরবি (পোর্টবি -র জন্য ডেটা ডাইরেকশন রেজিস্টার) বলে যে পোর্টবি -তে কোন পিনগুলি (যেমন PB0 থেকে PB7) ইনপুট হিসেবে মনোনীত এবং কোনটি আউটপুট হিসেবে মনোনীত। যেহেতু আমাদের LED এর সাথে পিন PB0 সংযুক্ত আছে এবং বাকিগুলি কোন কিছুর সাথে সংযুক্ত নয় তাই আমরা সমস্ত বিটকে 1 এ সেট করব যার অর্থ হল তারা সব আউটপুট।

ldi temp, 0b11111110; টেম্প রেজিস্টারে 'অবিলম্বে' নম্বরটি লোড করুন

; যদি এটি শুধু ld হয় তাহলে দ্বিতীয় যুক্তি হবে; একটি মেমরি লোকেশন হতে হবে

এই লাইনটি বাইনারি নম্বর 0b11111110 টেম্প রেজিস্টারে লোড করে।

DDRD আউট, temp; DDRD থেকে mv temp, ফলাফল হল PD0 ইনপুট এবং

; বাকিগুলি আউটপুট

এখন আমরা টেম্প থেকে পোর্টডি এর জন্য ডেটা ডাইরেকশন রেজিস্টার সেট করি, যেহেতু টেম্পে এখনও 0b11111110 থাকে আমরা দেখি যে PD0 একটি ইনপুট পিন হিসাবে মনোনীত হবে (যেহেতু ডানদিকে 0 আছে) এবং বাকিগুলিকে আউটপুট হিসাবে মনোনীত করা হয়েছে যেহেতু সেই দাগগুলোতে 1

clr তাপমাত্রা; তাপমাত্রায় সমস্ত বিট 0 এর জন্য সেট করা হয়

পোর্টবি আউট, তাপমাত্রা; পোর্টবিতে সমস্ত বিট (যেমন পিন) 0V এ সেট করুন

প্রথমে আমরা রেজিস্টার টেম্পার "ক্লিয়ার" করি যার অর্থ সব বিটকে শূন্যে সেট করা। তারপরে আমরা এটি পোর্টবি রেজিস্টারে অনুলিপি করি যা সেই সমস্ত পিনগুলিতে 0V সেট করে। একটি পোর্টবি বিটে একটি শূন্য মানে হল যে প্রসেসরটি সেই পিনটি 0V এ রাখবে, একটি একটি বিট সেই পিনটিকে 5V এ সেট করবে।

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

ldi temp, 0b00000001; তাপমাত্রায় অবিলম্বে নম্বর লোড করুন

পোর্টডি, টেম্প; পোর্টডি তে তাপমাত্রা সরান। PD0 5V (একটি pullup প্রতিরোধক আছে); যেহেতু এটিতে 1 বিট আছে বাকি 0V। অনুশীলন 4: আপনার কোড থেকে উপরের দুটি লাইন সরান। প্রোগ্রামটি কি এখনও সঠিকভাবে চলছে? কেন? (এটি উপরের ব্যায়াম 3 থেকে আলাদা। পিন আউট ডায়াগ্রাম দেখুন। PD0 এর জন্য ডিফল্ট DDRD সেটিং কি?

প্রথমে আমরা 0b00000001 নম্বরটি টেম্পারে "অবিলম্বে লোড করি"। "অবিলম্বে" অংশটি রয়েছে কারণ আমরা লোড করার জন্য একটি মেমরি লোকেশনে পয়েন্টার এর পরিবর্তে টেম্পে একটি সরাসরি আপ নম্বর লোড করছি। সেক্ষেত্রে আমরা "ldi" এর পরিবর্তে "ld" ব্যবহার করব। তারপরে আমরা এই নম্বরটি পোর্টডিতে পাঠাই যা PD0 থেকে 5V এবং বাকিগুলি 0V এ সেট করে।

এখন আমরা পিনগুলিকে ইনপুট বা আউটপুট হিসাবে সেট করেছি এবং আমরা তাদের প্রাথমিক অবস্থাগুলি 0V বা 5V (LOW বা HIGH) হিসাবে সেট করেছি এবং তাই আমরা এখন আমাদের প্রোগ্রাম "লুপ" এ প্রবেশ করি।

প্রধান: তাপমাত্রায়, PinD; পিনডি পোর্টডি অবস্থায় রয়েছে, এটিকে টেম্পারে কপি করুন

; যদি বাটন PD0 এর সাথে সংযুক্ত থাকে তাহলে এটি হবে; a 0 যখন বোতামটি ধাক্কা দেওয়া হয়, 1 অন্যথায়; PD0 একটি পুল আপ প্রতিরোধক এটি সাধারণত 5V হয়

পিনডি রেজিস্টারে পোর্টডি পিনের বর্তমান অবস্থা রয়েছে। উদাহরণস্বরূপ, যদি আপনি PD3- এর সাথে 5V তার যুক্ত করেন, তাহলে পরবর্তী ঘড়ির চক্রে (যা প্রতি সেকেন্ডে 16 মিলিয়ন বার ঘটে যেহেতু আমাদের মাইক্রোকন্ট্রোলার 16MHz ঘড়ির সংকেত পর্যন্ত সংযুক্ত থাকে) PinD3 বিট (PD3 এর বর্তমান অবস্থা থেকে) 0. এর পরিবর্তে 1 হয়ে যাবে। তাই এই লাইনে আমরা পিনের বর্তমান অবস্থা টেম্পারে কপি করি।

পোর্টবি আউট, তাপমাত্রা; 0 এবং 1 এর উপরে পাঠানো পোর্টবিতে পাঠায়

; এর মানে হল যে আমরা LED কে PB0 এর সাথে সংযুক্ত করতে চাই, তাই; যখন PD0 কম হয়, এটি PB0 কে LOW এ সেট করবে এবং চালু করবে; এলইডিতে (এলইডি -র অন্য দিক সংযুক্ত; 5V এর সাথে এবং এটি PB0 থেকে 0V সেট করবে তাই বর্তমান প্রবাহ)

এখন আমরা পিনডিতে পিনের অবস্থা পোর্টবি আউটপুটে পাঠাই। কার্যকরীভাবে, এর মানে হল যে PD0 একটি 1 PortD0 তে পাঠাবে যতক্ষণ না বোতামটি চাপানো হয়। সেই ক্ষেত্রে যেহেতু বোতামটি মাটির সাথে সংযুক্ত করা হয়েছে সেই পিনটি 0V এ থাকবে এবং এটি 0 কে PortB0 এ পাঠাবে। এখন, যদি আপনি সার্কিট ডায়াগ্রামটি দেখেন, PB0 তে 0V মানে LED জ্বলবে কারণ এর অন্য দিক 5V এ রয়েছে। যদি আমরা বোতাম টিপে না থাকি, যাতে 1 টি PB0 তে পাঠানো হয়, তার মানে আমাদের PB0 তে 5V এবং LED এর অন্য পাশে 5V আছে এবং তাই কোন সম্ভাব্য পার্থক্য নেই এবং কোন কারেন্ট প্রবাহিত হবে না এবং তাই LED জ্বলে না

rjmp প্রধান; শুরুতে ফিরে যান

এই আপেক্ষিক লাফ আমাদের মূল: লেবেলে ফিরে আসে এবং আমরা আবার পিনডি চেক করি এবং তাই। প্রতি সেকেন্ডের 16 মিলিয়ন ভাগ পরীক্ষা করা হচ্ছে বাটনটি ধাক্কা দেওয়া হচ্ছে কিনা এবং সে অনুযায়ী PB0 সেট করা হচ্ছে কিনা।

অনুশীলন 5: আপনার কোডটি সংশোধন করুন যাতে আপনার LED PB0 এর পরিবর্তে PB3 এর সাথে সংযুক্ত থাকে এবং দেখুন যে এটি কাজ করে।

ধাপ 4: উপসংহার

এই টিউটোরিয়ালে আমরা ATmega328p এর জন্য অ্যাসেম্বলি ল্যাঙ্গুয়েজ নিয়ে আরও তদন্ত করেছি এবং একটি পুশবাটন দিয়ে LED কে কিভাবে নিয়ন্ত্রণ করতে হয় তা শিখেছি। বিশেষ করে আমরা নিম্নলিখিত কমান্ড শিখেছি:

ser রেজিস্টার একটি রেজিস্টারের সমস্ত বিট 1 এর মধ্যে সেট করে

clr register একটি রেজিস্টারের সমস্ত বিট 0 এর মধ্যে সেট করে

রেজিস্টারে, i/o রেজিস্টার একটি i/o রেজিস্টার থেকে একটি ওয়ার্কিং রেজিস্টারে নম্বর কপি করে

পরবর্তী টিউটোরিয়ালে আমরা ATmega328p এর গঠন এবং তার মধ্যে থাকা বিভিন্ন রেজিস্টার, অপারেশন এবং সম্পদ পরীক্ষা করব।

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

প্রস্তাবিত: