সুচিপত্র:

AVR Assembler টিউটোরিয়াল 6: 3 ধাপ
AVR Assembler টিউটোরিয়াল 6: 3 ধাপ

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

ভিডিও: AVR Assembler টিউটোরিয়াল 6: 3 ধাপ
ভিডিও: The Easy Way to Wire RJ45 Ethernet Plugs with Speedy 2024, জুলাই
Anonim
AVR Assembler Tutorial 6
AVR Assembler Tutorial 6

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

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

এই টিউটোরিয়ালে আপনার প্রয়োজন হবে:

  1. আপনার প্রোটোটাইপিং বোর্ড
  2. টিউটোরিয়াল 4 থেকে আপনার ডাইস রোলার
  3. টিউটোরিয়াল 5 থেকে আপনার নিবন্ধন বিশ্লেষক
  4. দুটি সংযোগকারী তার
  5. সম্পূর্ণ ডেটা শীটের একটি অনুলিপি (2014 সংশোধন):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. নির্দেশনা সেট ম্যানুয়ালের একটি অনুলিপি (2014 সংশোধন):

    www.atmel.com/images/atmel-0856-avr-instruc…

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

ধাপ 1: কিভাবে আমরা দুটি মাইক্রোকন্ট্রোলার একে অপরের সাথে কথা বলতে পারি?

কিভাবে আমরা দুটি মাইক্রোকন্ট্রোলার পেতে পারি একে অপরের সাথে কথা বলার জন্য?
কিভাবে আমরা দুটি মাইক্রোকন্ট্রোলার পেতে পারি একে অপরের সাথে কথা বলার জন্য?

যেহেতু আমরা আমাদের প্রকল্পটি সম্প্রসারিত করতে শুরু করছি যাতে আমাদের একক শেষ পণ্যটি ছোট অংশগুলির একটি সংগ্রহ থেকে তৈরি হয়, আমরা একটি একক Atmega328P প্রদান করতে পারে তার চেয়ে বেশি পিনের প্রয়োজন হবে। অতএব আমরা সামগ্রিক প্রকল্পের প্রতিটি অংশ আলাদা মাইক্রোকন্ট্রোলারে করতে যাচ্ছি এবং তারপরে তাদের মধ্যে ডেটা ভাগ করে নেব। সুতরাং আমাদের যে সমস্যাটি সমাধান করতে হবে তা হল কিভাবে আমরা নিয়ন্ত্রকদের একে অপরের সাথে কথা বলার এবং তাদের মধ্যে তথ্য স্থানান্তর করার জন্য একটি সহজ পদ্ধতি নিয়ে আসতে পারি? আচ্ছা, এই কন্ট্রোলারদের সম্পর্কে একটি বিষয় হল যে তারা প্রত্যেকে প্রতি সেকেন্ডে 16 মিলিয়ন নির্দেশনা কার্যকর করে। এটি খুব সুনির্দিষ্ট সময়সীমা এবং তাই আমরা ডেটা স্থানান্তরের জন্য এই সময়টি ব্যবহার করতে পারি। যদি আমরা ডেটা গঠনের জন্য মিলিসেকেন্ড বিলম্ব ব্যবহার করি তাহলে আমাদের আসলে এতটা সুনির্দিষ্ট হতে হবে না যেহেতু সিপিইউ একক মিলিসেকেন্ডে 16, 000 নির্দেশনা কার্যকর করছে। অন্য কথায়, একটি মিলিসেকেন্ড হল CPU এর জন্য একটি অনন্তকাল। তাই আসুন ডাইস রোল দিয়ে চেষ্টা করি। আমি পাশা বেলন চিপ থেকে বিশ্লেষক চিপে একটি ডাইস রোল ফলাফল প্রেরণ করতে চাই। ধরুন আপনি রাস্তার ওপারে দাঁড়িয়ে ছিলেন এবং আমি আপনাকে আমার একজোড়া ডাইসের রোল এর ফলাফল সংকেত দিতে চেয়েছিলাম। আমি একটা কাজ করতে পারি, যদি আমাদের দুজনের ঘড়ি থাকত, তাহলে আমি ফ্ল্যাশলাইট চালু করতে পারতাম, তারপর যখন আপনি আমার ডেটা পাওয়ার জন্য প্রস্তুত থাকবেন তখন আপনি আপনার ফ্ল্যাশলাইট চালু করবেন এবং আমরা দুজনেই আমাদের ঘড়ি শুরু করব। তারপর আমি ডাইস রোল হিসাবে মিলিসেকেন্ডের সঠিক সংখ্যার জন্য আমার টর্চলাইটটি রাখি এবং তারপর এটি বন্ধ করি। তাই যদি আমি একটি 12 ঘূর্ণিত আমি 12 মিলিসেকেন্ডের জন্য আমার আলো রাখা হবে এখন উপরের সমস্যাটি হল যে, আপনার এবং আমার জন্য, কোন উপায় নেই যে আমরা 5 মিলিসেকেন্ড এবং 12 এর মধ্যে পার্থক্য করার জন্য সঠিকভাবে সময় দিতে সক্ষম হব মিলিসেকেন্ড কিন্তু এই সম্পর্কে কি: ধরুন আমরা সিদ্ধান্ত নিলাম যে আমি পাশার প্রতিটি সংখ্যার জন্য এক বছরের জন্য আমার আলো জ্বালিয়ে রাখব? তারপর যদি আমি একটি 12 রোল করি তবে আমি 12 বছর ধরে আপনার উপর আলো জ্বালাবো এবং আমি মনে করি আপনি সম্মত হবেন যে কোন সম্ভাবনা নেই যে আপনি সঠিক সংখ্যাটি বের করতে ভুল করবেন? আপনি একটি বিশ্রাম নিতে এবং বেসবল খেলতে যেতে পারেন, আপনি এমনকি 6 মাসের জন্য ভেগাসে ক্রেপ খেলতে যেতে পারেন, যতক্ষণ না বছরের কোন সময় রাস্তা জুড়ে তাকিয়ে দেখতে পারেন যে আলো জ্বলছে কিনা আপনি একটি গণনা মিস করবেন না। আচ্ছা মাইক্রোকন্ট্রোলারদের জন্য আমরা ঠিক তাই করছি! CPU- র জন্য একক মিলিসেকেন্ড একটি বছরের মত। তাই যদি আমি 12 মিলিসেকেন্ডের জন্য সিগন্যালটি চালু করি তবে প্রায় অন্য কোন মাইক্রোকন্ট্রোলার 10 বা 11 এর জন্য বিভ্রান্ত করবে এমন কোন সম্ভাবনা নেই যে যাই হোক না কেন বাধা এবং এর মধ্যে কি ঘটবে না। মাইক্রোকন্ট্রোলারদের জন্য, একটি মিলিসেকেন্ড হল একটি অনন্তকাল তাই আমরা এখানে কি করব প্রথমে আমরা আমাদের যোগাযোগের পোর্ট হতে কন্ট্রোলারে দুটি পোর্ট বেছে নেব। আমি ডাটা পাওয়ার জন্য PD6 ব্যবহার করবো (আমরা চাইলে Rx বলতে পারি) এবং আমি তথ্য প্রেরণের জন্য PD7 বেছে নেব (আমরা চাইলে Tx বলতে পারি)। বিশ্লেষক চিপটি পর্যায়ক্রমে এটির Rx পিন পরীক্ষা করবে এবং যদি এটি একটি সংকেত দেখতে পায় তবে এটি একটি "যোগাযোগ সাবরুটিন" এ নেমে যাবে এবং তারপর ডাইস রোলারে একটি রিটার্ন সিগন্যাল প্রেরণ করে যে এটি গ্রহণের জন্য প্রস্তুত। তারা উভয়ই সময় শুরু করবে এবং পাশা বেলন পাশার প্রতি মিলিসেকেন্ডের জন্য একটি সংকেত (যেমন 5V) প্রেরণ করবে। সুতরাং যদি রোলটি ডাবল ছক্কা বা 12 ছিল, তাহলে পাশা বেলনটি PD7 থেকে 5V 12 মিলিসেকেন্ডের জন্য সেট করবে এবং তারপর 0V তে সেট করবে। বিশ্লেষক তার PD6 পিন প্রতি মিলিসেকেন্ডে পরীক্ষা করবে, প্রতিবার গণনা করবে, এবং যখন এটি 0V তে ফিরে যাবে তখন এটি বিশ্লেষক প্রদর্শনের ফলে প্রাপ্ত সংখ্যাটি আউটপুট করবে, LED এর বাইনারিতে বারোটি দেখাবে। তাই সেই পরিকল্পনা। দেখা যাক আমরা তা বাস্তবায়ন করতে পারি কিনা।

পদক্ষেপ 2: যোগাযোগ সাবরুটিন

আমাদের প্রথমে যা করতে হবে তা হল দুটি নিয়ামককে সংযুক্ত করা। সুতরাং PD6 থেকে একটি তারের নিন এবং অন্যটি PD7 এর সাথে সংযুক্ত করুন, এবং বিপরীতভাবে। তারপরে উভয়কে PD7 থেকে OUTPUT এবং PD6 থেকে INPUT উভয়তে সেট করে তাদের আরম্ভ করুন। অবশেষে তাদের সবাইকে 0V এ সেট করুন। বিশেষ করে, প্রতিটি মাইক্রোকন্ট্রোলারে কোডের Init, অথবা Reset বিভাগে নিম্নলিখিত যোগ করুন:

sbi DDRD, 7; PD7 আউটপুট সেট

সিবিআই পোর্ট ডি, 7; PD7 প্রাথমিকভাবে 0V cbi DDRD, 6; PD6 ইনপুট cbi PortD, 6; PD6 প্রাথমিকভাবে 0V clr মোট; প্রাথমিকভাবে ডাইসে মোট 0

এখন ডাইস-রোলার চিপে কমিউনিকেশন সাবরুটিন সেট আপ করা যাক। প্রথমে "টোটাল" নামে একটি নতুন ভেরিয়েবল সংজ্ঞায়িত করুন যা ডাইসের জোড়ায় ঘূর্ণিত মোট সংখ্যাটি সংরক্ষণ করবে এবং এটি শূন্যে শুরু করবে।

তারপর বিশ্লেষকের সাথে যোগাযোগ করার জন্য একটি সাবরুটিন লিখুন:

যোগাযোগ করুন:

cbi PortD, 7 sbi PortD, 7; প্রস্তুত সিগন্যাল অপেক্ষা পাঠান: sbic PinD, 6; PinD পড়ুন এবং এড়িয়ে যান যদি 0V rjmp বিলম্ব 8 অপেক্ষা করে; সিঙ্ক্রোনাইজ করতে বিলম্ব (এটি পরীক্ষামূলকভাবে পাওয়া গেছে) পাঠান: ডিসেম্বর মোট বিলম্ব 2; প্রতিটি ডাই কাউন্টের জন্য বিলম্ব cpi মোট, 0; 0 এখানে মানে "মোট" সংখ্যা বিলম্ব পাঠানো হয়েছে breq PC+2 rjmp পাঠান cbi PortD, 7; PD7 থেকে 0V clr মোট; পাশা মোট 0 ret

বিশ্লেষকের মধ্যে আমরা প্রধান রুটিন থেকে যোগাযোগের সাবরুটিনে একটি rcall যোগ করি:

clr বিশ্লেষক; নতুন সংখ্যার জন্য প্রস্তুতি নিন

sbic PinD, 6; একটি 5V সংকেত rcall যোগাযোগের জন্য PD6 চেক করুন; যদি 5V mov বিশ্লেষক যোগাযোগ করতে যান, মোট; বিশ্লেষক প্রদর্শন rcall বিশ্লেষক প্রদর্শন

এবং তারপর নিম্নরূপ যোগাযোগ সাবরুটিন লিখুন:

যোগাযোগ করুন:

clr মোট; মোট বিলম্ব 0 0 বিলম্ব 10; বাউন্স পরিত্রাণ পেতে বিলম্ব sbi PortD, 7; প্রস্তুত প্রাপ্তির সংকেত দিতে PB7 থেকে 5V সেট করুন: বিলম্ব 2; পরবর্তী সংখ্যা সহ মোট অপেক্ষা করুন; বৃদ্ধি মোট sbic PinD, 6; যদি PD6 0V এ ফিরে যায় তাহলে আমরা rjmp রিসিভ করেছি; অন্যথায় আরো তথ্য জন্য লুপ ব্যাক আপ cbi PortD, 7; পুনরায় সম্পন্ন হলে PD7 পুনরায় সেট করুন

এই নাও! এখন প্রতিটি মাইক্রোকন্ট্রোলার ডাইস রোল এর ফলাফল জানাতে এবং তারপর বিশ্লেষকের উপর প্রদর্শন করার জন্য সেট আপ করা হয়।

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

অনুশীলন 1: দেখুন আপনি আরও ভাল পদ্ধতি প্রয়োগ করতে পারেন এবং 8-বিট বাইনারি সংখ্যা হিসাবে পাশা রোল স্থানান্তর করতে এটি ব্যবহার করতে পারেন।

আমি একটি ভিডিও সংযুক্ত করব যা আমার কাজ দেখায়।

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

উপসংহার
উপসংহার

আমি আপনার রেফারেন্সের জন্য সম্পূর্ণ কোড সংযুক্ত করেছি। এটি যতটা পরিষ্কার এবং পরিপাটি আমি চাই ততটা নয়, তবে ভবিষ্যতের টিউটোরিয়ালে এটিকে প্রসারিত করার সময় আমি এটি পরিষ্কার করব।

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

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

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

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

ভবিষ্যতে যখন আমরা আরও নিয়ন্ত্রক যোগ করব তখন আমরা এই আরও পরিশীলিত কৌশলগুলি ব্যবহার করব।

আমরা আমাদের বিশ্লেষক দিয়ে যা করেছি তা হল মোট ডাইস রোল গ্রহণ করা এবং তারপর LEDs ব্যবহার করে বাইনারিতে এটি মুদ্রণ করা গুরুত্বপূর্ণ নয়। আসল বিষয়টি হ'ল এখন আমাদের বিশ্লেষক "জানে" ডাইস রোল কী এবং সে অনুযায়ী এটি ব্যবহার করতে পারে।

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

পরবর্তী সময় পর্যন্ত…

প্রস্তাবিত: