SAM3X8E (আরডুইনো ডিউ) পিন আইও নিবন্ধভুক্ত


9

আরডুইনো ডিউয়ের আইও নিবন্ধগুলি কীভাবে কাজ করে? যাও Arduino Uno মাত্র সেটে DDRx, তারপর PINxপড়তে, PORTxলিখতে, আমি একটি Arduino দরুন সঙ্গে একই জিনিস করে করতে চাই, কিন্তু এটা যেমন আরো অনেক রেজিস্টার রয়েছে PIO_OWER, PIO_OSER, PIO_CODR, PIO_SODR, ইত্যাদি আমি Arduino Uno এবং মধ্যে কোন সাদৃশ্য খুঁজে আরডুইনো ডিউ রেজিস্টারস।

এছাড়া কিছু দরকারী ফাংশন যেমন হয় pio_clear, pio_set, pio_get, এবং অন্যদের, সব এখানে ব্যাখ্যা করেছিলেন:

http://asf.atmel.com/docs/3.19.0/sam3x/html/group__sam__drivers__pio__group.html

এখন, আমি মনে করি যে আমি তিনটি উল্লিখিত ফাংশনগুলি কী তা বুঝতে পেরেছি, তবে অন্যগুলি নয়, উদাহরণস্বরূপ:

pio_configure (Pio *p_pio, const pio_type_t ul_type, const uint32_t ul_mask, const uint32_t ul_attribute)

আমি বুঝতে পারি না কি ul_attributeএবং ul_typeকি।


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

উত্তর:


7

আপনার কাছে যদি এখান থেকে ডেটাশিটের ৩১ অনুচ্ছেদটি পড়ে থাকে তবে আপনার জন্য বিষয়গুলি আরও পরিষ্কার হতে পারে।

আমি যা জানি তার একটি সংক্ষিপ্তসার এখানে:

পিআইও সমান্তরাল ইনপুট / আউটপুট বোঝায় এবং একসাথে একাধিক রেজিস্টার পোর্টগুলি পড়তে এবং লিখতে কার্যকারিতা সরবরাহ করে। যেখানে ডেটাশিটে একটি রেজিস্টার উল্লেখ করা হয়েছে, উদাহরণস্বরূপ PIO_OWER, আরডুইনো লাইব্রেরিতে REG_PIO এই ফর্ম্যাটে তাদের অ্যাক্সেসের জন্য ম্যাক্রোগুলি রয়েছে? _OWER কোথায়? উপলব্ধ বিভিন্ন বন্দরগুলির জন্য হয় এ, বি, সি বা ডি হয়।

আমি এখনও পিনগুলিতে ইনপুট / আউটপুট সেট করতে ধীর আরডুইনো পিনমোড () ফাংশনটি ব্যবহার করতে চাইছি কারণ এটি সংক্ষিপ্ত আকার ভিত্তিক রেজিস্ট্রি কলগুলির চেয়ে বেশি পাঠযোগ্য করে তোলে যেমন REG_PIOC_OWER = 0xdeadbeef, তবে তারপরে পিনগুলি সেট করতে সরাসরি রেজিস্টারগুলি ব্যবহার করে কর্মক্ষমতা / সিঙ্ক্রোনাইজেশন। এখনও, আমি ইনপুট দিয়ে কিছুই করি নি, তাই আমার উদাহরণগুলি সমস্ত আউটপুট ভিত্তিক।

বেসিক ব্যবহারের জন্য, আপনি আউটপুট লাইনগুলি উচ্চতর সেট করতে REG_PIO? __SODR এবং REG_PIO? _CODR সেগুলি কম সেট করতে ব্যবহার করবেন? উদাহরণস্বরূপ REG_PIOC_SODR = 0x00000002 PORTC এ বিট 1 নির্ধারণ করবে (শূন্য থেকে সংখ্যাযুক্ত) (এটি ডিউজড পিনের কারণে 33) উচ্চ। পিওআরটিসি-র অন্যান্য সমস্ত পিন অপরিবর্তিত রয়েছে। REG_POIC_CODR = 0x00000002 PORTC কমতে বিট 1 সেট করবে। আবার অন্য সমস্ত পিন অপরিবর্তিত থাকবে।

যেহেতু এটি এখনও অনুকূল নয়, বা আপনি যদি সমান্তরাল ডেটা নিয়ে কাজ করছেন তবে সিঙ্ক্রোনাইজড রয়েছে, এমন একটি রেজিস্টার রয়েছে যা আপনাকে একটি কলের সাথে একটি পোর্টের সমস্ত 32 বিট লিখতে দেয়। এগুলি REG_PIO? _ODSR, সুতরাং REG_PIOC_ODSR = 0x00000002 এখন পিওআরটিসি উচ্চে বিট 1 নির্ধারণ করবে এবং পিওআরটিসি-তে সমস্ত অন্যান্য বিটগুলি একক সিপিইউ নির্দেশে তাত্ক্ষণিকভাবে কম সেট হবে।

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

সুতরাং, এখন আমরা যদি REG_PIOC_OWER = 0x00000002 (এটি OWSR এর বিট 1 সেট করে) এবং REG_PIOC_OWDR = 0xffffffdd (এটি OWSR এর বিট 1 বাদে সমস্ত বিট সাফ করে) এবং তারপরে আবার REG_PIOC_ODSR = 0x00000002 কল করি তবে এবার কেবল বিট পরিবর্তন হবে পিওরটিসি এর 1 এবং অন্যান্য সমস্ত বিট অপরিবর্তিত রয়েছে। সত্য যে দিতে মনোযোগ Ower সম্ভব কোনো বিট 1 সেট করা হয় মান আপনি লিখতে এবং OWDR নিষ্ক্রিয় কোনো বিট 1 সেট করা হয় মান আপনি লিখতে হবে। যদিও আমি এটি পড়ার সময় এটি বুঝতে পেরেছি, তবুও আমি আমার প্রথম পরীক্ষার কোডটি লিখতে গিয়ে একটি কোড ভুল করতে সক্ষম হয়েছি যে ভেবেছিলাম যে ওডব্লিউডিআর বিটগুলি অক্ষম করে ফেলেছে যা আমার লেখা মানকে 1-এ সেট করা হয়নি

আমি আশা করি এটি আপনাকে কমপক্ষে ডিউড সিপিইউয়ের পিআইও বোঝার জন্য কিছুটা শুরু করে দিয়েছে। একটি পঠন এবং একটি নাটক আছে এবং আপনার যদি আরও কিছু প্রশ্ন থাকে, আমি তাদের উত্তর দেওয়ার চেষ্টা করব।

সম্পাদনা: আরও একটি জিনিস ...

আপনি কীভাবে জানবেন যে পোর্টগুলির কোন বিটগুলি বকেয়া ডিজিটাল লাইনের সাথে সামঞ্জস্য করে? এটি পরীক্ষা করে দেখুন: যথাযথ পিনআউট


3

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

const unsigned int imThePin = 10; //e.g. digital Pin 10

#ifdef _LIB_SAM_

    //First lets get the pin and bit mask - this can be done once at the start and then used later in the code (as long as the variables are in scope
    Pio* imThePort = g_APinDescription[imThePin].pPort; 
    unsigned int imTheMask = g_APinDescription[imThePin].ulPin; 

    //Lets set the pin high
    imThePort->PIO_SODR = imTheMask;
    //And then low
    imThePort->PIO_CODR = imTheMask;

#else

    //First lets get the pin and bit mask - this can be done once at the start and then used later in the code (as long as the variables are in scope
    volatile unsigned char* imThePort = portOutputRegister(digitalPinToPort(imThePin)); 
    unsigned char imTheMask = digitalPinToBitMask(imThePin);

    //Lets set the pin high
    *imThePort |= imTheMask;
    //Now low
    *imThePort &= ~imTheMask;

#endif

এটি করার জন্য প্রয়োজনীয় সমস্ত কিছু ডিফল্টরূপে অন্তর্ভুক্ত করা উচিত - এবং যদি না হয় তবে #include <Arduino.h>এটি সেখানে পাওয়ার পক্ষে যথেষ্ট হবে।

Pioসেটিং / ক্লিয়ারিং / পুলআপ রেজিস্টার / ইত্যাদি করার পয়েন্টার থাকলে একবারে উপলব্ধ ফাংশনগুলি পাওয়া যায় । সামান্য ক্লিনার খুঁজছেন ফাংশন কল ব্যবহার করে। একটি সম্পূর্ণ তালিকা পাওয়া যাবে শিরোনাম ফাইল।


0

এটি একটি কোডের উদাহরণ যা পিন 33 এ নেতৃত্বে জ্বলজ্বল করে। বন্দরগুলিতে দ্রুত অ্যাক্সেস। আমি মনে করি আমার কোডটি সঠিক আছে - বিশেষত লাইনটি পিনটি কম সেট করে। নেতৃত্বে আনন্দের সাথে ঝলকানি হয়।

void setup() 
{
  pinMode(33, OUTPUT); 
  REG_PIOC_OWER = 0x00000002; 
  REG_PIOC_OWDR = 0xfffffffd; 
}

void loop() 
{
  REG_PIOC_ODSR = 0x00000002; 
  delay(1000);             
  REG_PIOC_ODSR = 0x00000000;    
  delay(1000);   
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.