কোনও মাইক্রোকন্ট্রোলারের পৃথক পোর্টের পৃথক পিনগুলি কোনও নিবন্ধকে ম্যাপ করা যায় এবং নিবন্ধের মান পরিবর্তন করার সাথে সাথে তাদের মানগুলি পরিবর্তন করা যেতে পারে?


12

প্রশ্ন: কোনও মাইক্রো-কন্ট্রোলারের পৃথক পোর্টের পৃথক পিনগুলি কোনও নিবন্ধকে ম্যাপ করা যায় এবং নিবন্ধের মান পরিবর্তন করার সময় তাদের মানগুলি পরিবর্তন করা যেতে পারে?

পরিস্থিতি: আমি মাইক্রো-কন্ট্রোলারের প্রতিটি বন্দর (8-বিট) থেকে কিছু পিন ব্যবহার করেছি। এখন আমি এমন একটি ডিভাইসটি ইন্টারফেস করতে চাই যার জন্য একটি 8-বিট বাসের প্রয়োজন (ধরুন D0 থেকে D7 সিকোয়েন্সে) বলতে হবে যে কন্ট্রোলারের কাছ থেকে আমার 8 টি পিন প্রয়োজন যাতে আমি এগুলিকে এক থেকে এক ফ্যাশনে সংযুক্ত করতে পারি

portx0  -> D0 // x is the name of port followed by bit location on that port
portx1  -> D1
...
portx7  -> D7

তবে আমার কাছে 8 টি পিনের পুরো বন্দর নেই যা আমি এই ডিভাইসের সাথে সংযোগ করতে পারি, বরং আমার কাছে পোর্টেক্স থেকে কিছু পিন রয়েছে, কিছু পোর্টি থেকে এবং কিছু পোর্ট পোর্টজ থেকে। নতুন সংযোগের দৃশ্যটি হ'ল (যথাক্রমে মাইক্রো-কন্ট্রোলার থেকে ডিভাইসে সংযোগ)

portx0  -> D0
portx1  -> D1
portx2  -> D2
porty4  -> D3
porty5  -> D4
porty6  -> D5
porty7  -> D6
portz1  -> D7

এই অবস্থায় আমি যদি একটি মান বলতে পাঠাতে চাই

unsigned char dataReg = 0xFA;

নিয়ন্ত্রক থেকে আমার ডিভাইসে আমাকে পাঠাতে হবে এমন মান সম্পর্কে কিছুটা বুদ্ধিমান ক্রিয়াকলাপ করতে হবে এবং প্রতিটি পিন পৃথকভাবে রেজিস্ট্রারে মূল্য অনুসারে সেট করতে হবে। উদাহরণ স্বরূপ

portx0 = ((dataReg & 0x01) >> 0 );  // Masking and shifting as bit position
portx1 = ((dataReg & 0x02) >> 1 );
portx2 = ((dataReg & 0x04) >> 2 );
porty4 = ((dataReg & 0x08) >> 3 );
porty5 = ((dataReg & 0x10) >> 4 );
porty6 = ((dataReg & 0x20) >> 5 );
porty7 = ((dataReg & 0x40) >> 6 );
portz1 = ((dataReg & 0x80) >> 7 );

এখন, মূল প্রশ্নে, প্রতিটি বন্দরে পৃথক পৃথক পৃথক গণনাগুলি এড়াতে, কোনও মাইক্রো-কন্ট্রোলারের পৃথক পোর্টের পৃথক পিনগুলি কোনও রেজিস্টারে ম্যাপ করা যায় এবং নিবন্ধের মান পরিবর্তনের সময় তাদের মানগুলি পরিবর্তন করা যায়?


1
আমি কিছুক্ষণ আগে একই ধারণা ছিল। পিআইসিসহ, এটি সম্ভব নয়: মাইক্রোচিপ. com/forums/tm.aspx?high=&m=696277 - আমি মনে করি না যে কোনও মাইক্রো দিয়ে এটি সম্ভব, তবে আপনার ডিভাইসটির তালিকা সহায়ক হবে।

উত্তর:


6

আপনার প্রশ্নটি ফার্মওয়্যারটিতে একটি 8 বিটের মান থাকার বিষয়ে আসে এবং পোর্ট পিনের একটি স্বেচ্ছাসেবী সংগ্রহ থেকে এবং এটি পড়তে এবং লিখতে চায় বলে মনে হয়।

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

এটি করার আরও ভাল উপায়, বিশেষত যদি আপনি শারীরিক বন্দরের কয়েকটি সামান্য অংশে বিটগুলি গ্রুপ করতে পারেন তবে হ'ল মাস্কিং, শিফটিং এবং ওরিং ব্যবহার করা use উদাহরণস্বরূপ, যদি অভ্যন্তরীণ বাইটের নীচের তিনটি বিট কোনও বন্দরের <6-6-4> বিটগুলিতে থাকে তবে সেই বন্দরটির মানটি 4 দ্বারা ডান স্থানান্তর করুন এবং those বিটগুলি তাদের চূড়ান্ত অবস্থানে আনার জন্য এটি 7 দিয়ে। অন্যান্য বন্দর থেকে শিফট এবং মাস্ক (বা মাস্ক এবং শিফট) বিটগুলি স্থানে রাখুন এবং ফলাফলগুলিকে ORing করে চূড়ান্ত 8 বিট বাইট একত্রিত করুন।

এই জাতীয় নিম্ন স্তরের বিট টুইডলিং সি এর চেয়ে এসেম্বলারের মধ্যে করা সহজ I'd আমি সম্ভবত বাইটটি পড়তে এবং লিখতে রুটিনগুলিকে একটি একত্রিতকারী মডিউলে রেখে দিতাম এবং ইন্টারফেসটি সি থেকে কল করতে সক্ষম করেছিলাম make


6
আমার উত্তরটি আপনার কাছে প্রায় একই রকম হবে, আমি সমাবেশটি মোটেও ব্যবহার করব না তা বাদ দিয়ে; বিট ম্যানিপুলেশনগুলি সি তে তুচ্ছ I সংকলকটির উপর নির্ভর করে এবং জিনিসগুলি কীভাবে কঠিন করে তোলে। :-)
অ্যাকোহলস্মিথ

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

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

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

2
আমি বেশ কয়েকটি মাইক্রোকন্ট্রোলার / মাইক্রোপ্রসেসরগুলিতে অ্যাসেম্বলি ভাষায় পারদর্শী। আমি একমত না যে এটি একটি প্রস্তুত সরঞ্জাম হওয়া উচিত; এটি খুব অল্প মাত্রায় আরম্ভ করার সময়, সময়কাল- বা আকার-সমালোচনামূলক কোডের জন্য বা আরও সাধারণ ক্ষেত্রে, আপনি ইতিমধ্যে বাধা হিসাবে নির্ধারিত কোনও অঞ্চলের অনুকূলকরণের জন্য অল্প পরিমাণে এবং শুধুমাত্র প্রয়োজনে ব্যবহার করা উচিত। আমি দেখতে পাচ্ছি যে প্রকল্পগুলিতে লেখকরা সেখানে সমাবেশে ঝাঁপিয়ে পড়ে কারণ এটি প্রায়শই কম স্পষ্ট কোড লেখেন বা অ্যালগরিদম যখন ভুলভাবে প্রয়োগ করা হচ্ছে তখন তা স্বীকার করেন না। আমি বিশেষভাবে বলছি না যে এটি আপনি, বরং আরও সাধারণ ক্ষেত্রে।
akohlsmith

4

সাধারণভাবে এটি সম্ভব নয়। আমি যতদূর জানি, পিকস দ্বারা এটি সম্ভব নয়।

আমি কেবলমাত্র একটি মাইক্রোকন্ট্রোলার জানি যা এটি করতে পারে, সাইপ্রাস পিএসওসি । এটি চিপে একটি অত্যন্ত কনফিগারযোগ্য সিস্টেম। এটি আপনাকে অনুমতি দেয় এমন অনেকগুলিগুলির মধ্যে হ'ল আক্ষরিকভাবে আপনার নিজের রেজিস্টার (1-8 বিট) সংজ্ঞায়িত করা এবং এটি আপনার পছন্দসই কোনও পিনের সাথে বা এমনকি অভ্যন্তরীণ সার্কিটের সাথে সংযুক্ত করা হয়।

পিএসওসি তারের

উদাহরণস্বরূপ, এখানে আমি একটি 6-বিট নিয়ন্ত্রণ রেজিস্টার তৈরি করেছি। বিটগুলির মধ্যে 5 সরাসরি পিনগুলিতে যায়, যখন 6th ষ্ঠ বিটটি আমি OR ম পিন থেকে ইনপুট দিয়ে এক্সওআর ব্যবহার করছি।

পিএসওসি পিনস

চিপে, আমি উপলব্ধ জিপিআইও পিনগুলির মধ্যে এই পিনগুলি বরাদ্দ করতে পছন্দ করতে পারি। (এটি ধূসর রঙের চিত্রগুলির মধ্যে একটি)


1
LPC800 এছাড়াও এটি করতে সক্ষম হওয়া উচিত, কারণ পিনগুলিতে ফাংশন অবাধে নির্ধারিত করা যেতে পারে।
তারাব্লু

-1

আপনি নিম্নলিখিত চেষ্টা করতে পারেন। আপনার নিজস্ব একটি কাঠামো লিখুন যা 2 টি বন্দর সম্পর্কিত পিনগুলিতে মানচিত্র (যা ব্যবহার করা হবে) এখন এই রেজিস্টারটিতে মান আপডেট করার সাথে সাথে 2 পোর্টের পিন সেট / রিসেট করা হবে। চেষ্টা করুন এবং আমাদের কাজ করে যদি তা জানান!

আমি নিশ্চিত যে এটি কাজ করা উচিত।


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

-1

যদি আমি প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে এটি সি তে যথেষ্ট সহজ:

জেনেরিক ধরণের ঘোষণা, যে কোনও রেজিস্ট্রারের জন্য পুনরায় ব্যবহার করা যেতে পারে:

typedef union    // Generic 8-bit register Type
{
  uint8 reg; // Whole register
  struct
  {
    unsigned  bit7     : 1;  // Bit 7 
    unsigned  bit6     : 1;  // Bit 6 
    unsigned  bit5     : 1;  // Bit 5 
    unsigned  bit4     : 1;  // Bit 4 
    unsigned  bit3     : 1;  // Bit 3 
    unsigned  bit2     : 1;  // Bit 2 
    unsigned  bit1     : 1;  // Bit 1 
    unsigned  bit0     : 1;  // Bit 0 
  } bit;
} typ_GENERIC_REG8;

সুতরাং, একটি পোর্ট সংজ্ঞা দিতে আমরা ঠিকানা করতে চাই:

#define MCU_GPO_PORTx   (*(volatile typ_GENERIC_REG8 *)(0x12345678)) // Number is address

এবং সেই বন্দরে সরাসরি একটি পিন টলিউড করতে:

#define MCU_PORTx_PINn  (MCU_GPO_PORTx.bit.bit0)

কোডে:

MCU_PORTx_PINn = 1; // Set pin high

সম্পূর্ণ রেজিস্টার:

MCU_GPO_PORTx.reg = 0xF; // All pins high

স্ট্রাক্ট, ইউনিয়ন, টাইপিডেফ এবং এনামগুলিতে পড়া ভাল - এগুলি সমস্ত এম্বেড এবং সাধারণভাবে জীবনকে এত সুন্দর করে তোলে!


ওপি বিভিন্ন বন্দর থেকে কয়েকটি বিটকে 'এক বাইটে' একত্রিত করতে চায়। আমি দেখছি না এটি কীভাবে এটি করবে? কেন সম্ভব হচ্ছে না অলিন ল্যাথ্রপ ব্যাখ্যা করেছেন

এটি আসলে সমস্যার সমাধান করে না এবং আপনার সংকলকটি কীভাবে "স্মার্ট" হয় তার উপর নির্ভর করে ডিবাগের জন্য সম্পূর্ণ নতুন সেট তৈরি করতে পারে।
akohlsmith
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.