AVR (attiny45) সঙ্গে একটি সিঙ্ক্রোনাইজেশন সংকেত কিভাবে বাস্তবায়ন করবেন?

সিউডোডক্সে আমি নিম্নলিখিত কাজ করতে চাই:

i = 0
state = 0

while (1):

  compareState = readDigitalIn()
  if state == compareState:
    i = i+1
  else:
    i = 0
    state = compareState

  writeDigitalOut(dataVector[i])

ইংরেজিতে, আমি প্রতিবার i প্রতিবার digitalIn -pin- এর অবস্থা পরিবর্তন করতে চাই।

উপরে এই একটি ভাল উপায়? Attiny ইভেন্ট শ্রোতা বা অনুরূপ আছে?

চূড়ান্ত লক্ষ্য বিভিন্ন চিপস মধ্যে একাধিক PWM কন্ট্রোলার একত্রিত করা হয় (writeDigitalOut AdjustPwmFrequency পরিবর্তন করা হয় ...)

Edit: Can I use interrupts for this? How? Can create an interrupt that fires when digitalIn-pin is changed?

2
যদি রাষ্ট্র দ্রুত পরিবর্তন না করে, তাহলে i বড় হয়ে উঠতে এবং dataVector [] এর সীমার বাইরে যাবার জন্য কি করতে হবে? আপনি লিখুন ডিজিটালআউট() এর ভিতরে চেক করতে সীমিত করেছেন? যদি না হয়, তাহলে এটি একটি খুব খারাপ পরিস্থিতি হবে যা আপনি এড়িয়ে যেতে চান আপনার প্রশ্নের সংক্ষিপ্ত উত্তর হ্যাঁ হয়, এবং আমি শীঘ্রই আরও পুঙ্খানুপুঙ্খ উত্তর লিখতে হবে, কিন্তু আমি শুধু আপনার মনোযোগ এই আনা চেয়েছিলেন।
যোগ লেখক kender, উৎস
যে pseucode Python মত এত দেখায় ...
যোগ লেখক Durga Swaroop, উৎস
@ ডিভয়তপন্দিয়া অনুমান আমার প্রিয় প্রোগ্রামিং ভাষা কি;)। খুব খারাপ আপনি Python সঙ্গে AVRs প্রোগ্রাম করতে পারে না
যোগ লেখক user7406, উৎস

1 উত্তর

হ্যাঁ, এই জন্য ইন্টারাপ্ট ব্যবহার করার জন্য এটি একটি চমত্কার ভাল অ্যাপ্লিকেশন।

আপনি আগ্রহী কি বাইরের ইন্টারাপ্ট, কিন্তু আসুন প্রথম একটি বিরতি সাধারণ কাঠামো ভাঙ্গা যাক।

যদি আপনি আপনার সিস্টেমে কোন নির্দিষ্ট ইন্টারাপ্ট সক্ষম করেন তবে, যে ইন্টারাপ্টের প্রকারটি ঘটে, সেই বিশেষ ইভেন্টটি পরিবেশন করার জন্য প্রসেসরটি ফাঁক বা পরিষেবা রুটিন খুঁজে বের করতে একটি টেবিলের দিকে নজর রাখবে।

এই ফাংশনটি একটি ইন্টারপ্রেট পরিষেবা রুটিন বা সংক্ষিপ্ত জন্য ISR বলা হয়। এটি একটি পদ্ধতি যা আপনাকে অবশ্যই লিখতে হবে।

সুতরাং আসুন আমরা চিহ্নিত করি যে আপনি কোন ইন্টারাপ্ট চান এবং কোন আইএসআর লিখতে চান। এটি করার জন্য, আমরা ডেটাসিটের সাথে পরামর্শ করতে হবে। যে ইন্টারাপ্টটি আপনি আগ্রহী তা টাইপ করে <�ইয়ার> বাইরের ইন্টারাপ্ট নামক ইন্টারাপ্টের পরিবারে থাকে। ATiny45 ডেটসেট থেকে একটি উদ্ধৃতাংশ:

9.2 বাহ্যিক বিঘ্ন

     

বহিরাগত বিঘ্নগুলি INT0 পিন বা PCINT [5: 0] পিনের দ্বারা প্রবাহিত হয়। মান্য করা   যে, যদি সক্ষম করা থাকে, তবে INT0 বা PCINT [5: 0] পিনগুলি কনফিগার করা থাকলেও ইন্টারাপ্টগুলি ট্রিগার হবে   আউটপুট। এই বৈশিষ্ট্যটি একটি সফ্টওয়্যার ইন্টারাপ্ট তৈরির একটি উপায় প্রদান করে। পিন পরিবর্তন ইন্টারাপ্ট   PCI টি সক্ষম হলে PCINT সক্ষম হবে [5: 0] পিন টগলস। পিসিএমএসকে নিবন্ধন নিয়ন্ত্রণ করে যা পিনের   পিন পরিবর্তন ইন্টারাপ্ট অবদান। PCINT [5: 0] এ পিন পরিবর্তন ইন্টারাপ্টগুলি অ্যাসিঙ্ক্রোনাস সনাক্ত করা হয়। এই বোঝায় যে এই ইন্টারাপ্ট অংশ ঘুম থেকে ঘুম থেকেও ব্যবহার করা যেতে পারে   অলস মোড ছাড়াও মোড।

     

INT0 ইন্টারাপ্ট একটি পতিত বা প্রান্তের প্রান্ত বা নিম্ন স্তরের দ্বারা প্রবাহিত হতে পারে। এই হিসাবে সেট আপ করা হয়   এমসিইউ কনট্রোলার রেজিষ্টারের জন্য স্পেসিফিকেশনে নির্দেশিত - MCUCR যখন INT0 বিঘ্ন হয়   সক্রিয় এবং স্তরের ট্রিগার হিসাবে কনফিগার করা হয়, পিন রাখা হয় যতক্ষণ অন্তর্বর্তী ট্রিগার হবে   কম। উল্লেখ্য যে INT0 উপর পতিত বা ক্রম প্রান্ত বিঘ্ন স্বীকৃতি একটি উপস্থিতি উপস্থিতি প্রয়োজন   আই/ও ঘড়ি, পৃষ্ঠা ২3 এ "ক্লক সিস্টেম এবং তাদের বিতরণ" এ বর্ণিত।

So they've mentioned some registers of interest here: PCMSK and MCUCR

PCMSK controls which pins can trigger the interrupt - so you want to wire up your toggling signal to whichever pin(s) you specify here, and MCUCR defines how the pins must change in order to trigger the interrupt. In this case, you would probably be interested in configuring your interrupt for Any logical change on INT0 generates an interrupt request. As outlined in table 9-2 in the document. Continue reading what the registers do in the external interrupt section, they are as follows: MCUCR, GIMSK, GIFR, PCMSK. The information you want to get out of this is

  1. ইন্টারাপ্ট (<�কোড> PCMSK এবং MCUCR ) কনফিগার করার পদ্ধতি
  2. ইন্টারাপ্ট ( GIMSK )
  3. সক্রিয় বা নিষ্ক্রিয় করুন
  4. কিভাবে তার বর্তমান অবস্থা (<�কোড> GIFR ) চেক করতে হয়

এখন আসল কোডিং এ। কাঠামো এই মত কিছু দেখতে হবে (ছদ্ম কোড):

volatile int i;//volatile because this gets changed in the ISR, so the compiler will know to NOT optimize this when used in loops

int main(void)
{
     /* set-up your registers here ... */
     /* enable global interrupts */

     i = 0;
     while (1) {
          boundsSafeVectorPrinter(i);
          i++;
     }
}

ISR(PCINT0_ISR)
{
     i = 0;
}

এখন যখন আপনি নির্দিষ্ট কোন পিনে একটি পিন পরিবর্তন ঘটে (যেটি আপনি ঠিকভাবে সেট আপ করেছেন), ISR (PCINT0_ISR) রুটিন কার্যকর করা হবে।

তাই আমি কিভাবে আইএসআর (PCINT0_ISR) ব্যবহার করতে জানি? আপনি যদি আপনার জন্য PCINT0_ISR ম্যাপিং প্রদান করেছেন কিনা তা দেখতে আপনার যে কোনও সংজ্ঞা ফাইল ব্যবহার করতে হবে, যদি না হয়, তবে ডেটসেটটি আবার পর্যালোচনা করুন এবং বিভাগটি দেখুন 9.1 ATtiny25/45/8 এ অন্তর্বর্তী ভেক্টরগুলি এবং এটি নিজেকে সংজ্ঞায়িত করুন। আপনি যদি avr-gcc ব্যবহার করেন তবে ISR() ম্যাক্রোটি এখানে

আমি মনে করি এটি খুব বেশি কোড ছাড়াই মূল বিষয়গুলি জুড়েছে। গুড লাক এবং মজা আছে!

2
যোগ
বাহ, চমৎকার উত্তর। এই ঠিক কি আমি জানতে চেয়েছিলেন।
যোগ লেখক user7406, উৎস