টাইমার সেটআপ করার জন্য কেউ কি এই অদ্ভুত চেহারা কোডটি ব্যাখ্যা করতে পারে?


10

স্কেচগুলি দেখার সময় অন্য লোকেরা লিখেছেন, আমি মাঝে মধ্যে এমন কোডটি উপস্থিত করি যা দেখতে কিছুটা এমন দেখা যায়:

TCCR1A = 0;
TCCR1B = 0;

TCNT1 = 34286;
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << TOIE1);

আমি কেবল জানি এটির সাথে টাইমিং / টাইমারগুলির কিছু আছে (আমার মনে হয়)। আমি কীভাবে এইরকম ডিসিফার করব এবং এই জাতীয় কোড তৈরি করব? কি কি TCCR1A, TCCR1B, TCNT1, CS12, TIMSK1, এবং TOIE1?


: উত্তর দিতে কিন্তু যথেষ্ট জানি না electronics.stackexchange.com/questions/92350/... , forum.arduino.cc/index.php?topic=134602.0 এবং stackoverflow.com/questions/9475482/... । আপনি এগুলি ইতিমধ্যে দেখেছেন কিনা জানেন না।
বেনামে পেঙ্গুইন

1
আতেল ওয়েবসাইট থেকে আপনার ডিভাইসের জন্য "সম্পূর্ণ" ডাটাশিটটি ডাউনলোড করুন এবং টাইমার সম্পর্কিত অধ্যায়গুলি পড়ুন। ডেটাশিটটি আমার মতে পড়তে অবাক করা ভাল।
জিপ্পি

উত্তর:


15

এটি দেখতে অদ্ভুত নয়। এটি সাধারণ এমসিইউ কোডের মতো দেখতে।

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

মূলত, মেমরির কয়েকটি ব্যাঙ্কে আক্ষরিক অর্থে এসআরএএম সেল থেকে হার্ডওয়্যারে সামান্য তারের চলমান থাকে। আপনি যদি এই বিটটিতে একটি "1" লিখে থাকেন তবে এটি এই এসআরাম সেলটি একটি লজিকাল হাইতে সেট করে, যা পরে হার্ডওয়্যারটির কিছু অংশ চালু করে।

আপনি যদি এমসইউ-র শিরোনামগুলি লক্ষ্য করেন তবে কী-ওয়ার্ডের বড় বড় টেবিল রয়েছে <-> ঠিকানা ম্যাপিং। TCCR1Bসংকলনের সময় এভাবেই ... ইত্যাদি জিনিসগুলি সমাধান করা হয়।

এই মেমরি-ম্যাপিং প্রক্রিয়াটি এমসিইউগুলিতে অত্যন্ত বিস্তৃতভাবে ব্যবহৃত হয়। আরডুইনোর এটিমেগা এমসিইউ এটি ব্যবহার করে, যেমন পিক, এআরএম, এমএসপি 430, এসটিএম 32 এবং এসটিএম 8 এমসিইউ সিরিজ, পাশাপাশি প্রচুর এমসিইউগুলির সাথে আমি তাত্ক্ষণিকভাবে পরিচিত নই।


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

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

উপরে লিঙ্ক করা ডেটাশিট থেকে অংশগুলি নির্বাচন করুন:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

সুতরাং, উদাহরণস্বরূপ, TIMSK1 |= (1 << TOIE1);বিট সেট করে TOIE1TIMSK1। বাইনারি 1 ( 0b00000001) TOIE1বিট দ্বারা বামে স্থানান্তরিত করে এটি অর্জন করা হয় , TOIE10 হিসাবে শিরোলেখ ফাইলটিতে সংজ্ঞায়িত করা হয় এটি এর পরে বিটওয়াইডের বর্তমান মান হিসাবে অর্ড করা হয় TIMSK1, যা কার্যকরভাবে এই এক বিটকে উচ্চতর করে দেয়।

বিট 0 এর জন্য ডকুমেন্টেশনের দিকে তাকানো TIMSK1, আমরা দেখতে পাচ্ছি এটি হিসাবে বর্ণিত হয়েছে

এই বিটটি যখন কোনওটিতে লেখা হয়, এবং স্থিতি রেজিস্ট্রে আই-পতাকা সেট করা হয় (বিশ্বব্যাপী সক্ষম হওয়া বাধাগ্রস্ত হয়), টাইমার / কাউন্টার 1 ওভারফ্লো বাধা সক্ষম হয়। টিআইএফআর 1 এ অবস্থিত টিওভি 1 ফ্ল্যাগটি সেট করা হলে সংশ্লিষ্ট ইন্টারপেন ভেক্টর (57 পৃষ্ঠায় "বাধা" দেখুন) কার্যকর করা হয়।

অন্যান্য সমস্ত লাইন একই পদ্ধতিতে ব্যাখ্যা করা উচিত।


কিছু নোট:

আপনি দেখতে পছন্দ করতে পারেন TIMSK1 |= _BV(TOIE1);। মূলত AVR libc বাস্তবায়ন থেকে ব্যবহৃত_BV() একটি সাধারণ ব্যবহৃত ম্যাক্রো । আরও ভাল পাঠযোগ্যতার সুবিধার সাথে কার্যত অভিন্ন ident_BV(TOIE1)(1 << TOIE1)

এছাড়াও, আপনি লাইনগুলি যেমন দেখতে পারেন: TIMSK1 &= ~(1 << TOIE1);বা TIMSK1 &= ~_BV(TOIE1);। এই বিপরীত ফাংশন আছে TIMSK1 |= _BV(TOIE1);যে এটা unsets বিট TOIE1মধ্যে TIMSK1। এটি উত্পাদিত বিট-মাস্ক গ্রহণ করে _BV(TOIE1), এতে বিটওয়াইস নট অপারেশন ( ~) চালিয়ে এবং এরপরে TIMSK1এই নোটযুক্ত মানটি (যা 0 বি 11111110) দ্বারা অ্যান্ডিং করে অর্জন করা হয়।

মনে রাখবেন যে এই সমস্ত ক্ষেত্রে, কম্পাইল করার সময়(1 << TOIE1) বা _BV(TOIE1)তার মতো সামগ্রীর মান পুরোপুরি সমাধান করা হয় , তাই এগুলি কার্যকরীভাবে একটি সাধারণ ধ্রুবককে হ্রাস করে এবং তাই রানটাইমের সময় গণনা করতে কোনও কার্যকর সময় নেয় না।


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

uint8_t transactByteADC(uint8_t outByte)
{
    // Transfers one byte to the ADC, and receives one byte at the same time
    // does nothing with the chip-select
    // MSB first, data clocked on the rising edge

    uint8_t loopCnt;
    uint8_t retDat = 0;

    for (loopCnt = 0; loopCnt < 8; loopCnt++)
    {
        if (outByte & 0x80)         // if current bit is high
            PORTC |= _BV(ADC_MOSI);     // set data line
        else
            PORTC &= ~(_BV(ADC_MOSI));  // else unset it

        outByte <<= 1;              // and shift the output data over for the next iteration
        retDat <<= 1;               // shift over the data read back

        PORTC |= _BV(ADC_SCK);          // Set the clock high

        if (PINC & _BV(ADC_MISO))       // sample the input line
            retDat |= 0x01;         // and set the bit in the retval if the input is high

        PORTC &= ~(_BV(ADC_SCK));       // set clock low
    }
    return retDat;
}

PORTCএটি নিবন্ধ যা PORTCএটিমেগ 328 পি এর মধ্যে আউটপুট পিনের মান নিয়ন্ত্রণ করে । PINCনিবন্ধটি যেখানে ইনপুট মানগুলি PORTCউপলব্ধ। মৌলিকভাবে, এর মতো জিনিসগুলি হ'ল অভ্যন্তরীণভাবে ঘটে যখন আপনি ব্যবহার করেন digitalWriteবা digitalReadফাংশন ব্যবহার করেন । যাইহোক, একটি চেহারা অপারেশন রয়েছে যা আরডুইনো "পিন নম্বরগুলি" কে সত্যিকারের হার্ডওয়্যার পিন সংখ্যায় রূপান্তর করে যা 50 ঘড়ির চক্রের রাজ্যে কোথাও নিয়ে যায়। আপনি সম্ভবত অনুমান করতে পারেন, আপনি যদি দ্রুত এগিয়ে যাওয়ার চেষ্টা করছেন, তবে অপারেশনে 50 টি ঘড়ির চক্র নষ্ট করা কেবলমাত্র 1 টির হাস্যকর।

উপরের ফাংশনটি সম্ভবত 8 টি বিট স্থানান্তর করতে 100-200 ঘড়ির চক্রের অঞ্চলে লাগে somewhere এটিতে 24 টি পিন-রাইটস এবং 8 টি পড়ার দরকার রয়েছে। এটি digital{stuff}ফাংশনগুলি ব্যবহার করে অনেকগুলি অনেক বেশি দ্রুত faster


নোট করুন যে এই কোডটি এটিমেগা 32 ইউ 4 (লিওনার্দোতে ব্যবহৃত) এর সাথেও কাজ করা উচিত কারণ এতে এটিমেগা 328 পি এর চেয়ে বেশি টাইমার রয়েছে।
jfpoil ব্যাখ্যা

1
@ রিকার্ডো - সম্ভবত ছোট-এমসিইউ এম্বেডেড কোডের 90% + সরাসরি রেজিস্টার হেরফের ব্যবহার করে। অপ্রত্যক্ষ ইউটিলিটি ফাংশন দিয়ে জিনিসগুলি করা IO / পেরিফেরিয়ালগুলি পরিচালনা করার সাধারণ পদ্ধতি নয়। হার্ডওয়্যার নিয়ন্ত্রণ দূরে রাখার জন্য কিছু টুলকিট রয়েছে (উদাহরণস্বরূপ, এটি অ্যাটেল এএসএফ), তবে এটি সাধারণত রানটাইম ওভারহেড হ্রাস করার জন্য যথাসম্ভব কমপ্লাই করে লেখার জন্য রচিত এবং প্রায় অবিস্মৃতভাবে ডেটাসিটগুলি পড়ে পেরিফেরিয়ালগুলি বোঝার প্রয়োজন হয়।
কনার ওল্ফ

1
মূলত, আরডুইনো স্টাফগুলি "এখানে এক্সগুলি করে এমন ফাংশনগুলি" বলে সত্যই সত্যিকারের ডকুমেন্টেশনের রেফারেন্স দেওয়ার জন্য বিরক্ত না করে বা হার্ডওয়্যার কীভাবে এটি কাজ করে তা খুব স্বাভাবিক নয়। আমি বুঝতে পারি এটি একটি প্রাথমিক ভূমিকা হিসাবে মান, তবে দ্রুত প্রোটোটাইপিং বাদে এটি প্রকৃত পেশাদার পরিবেশে সত্যই কখনও হয়নি।
কনার ওল্ফ

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

1
মনে রাখবেন যে আমি এখানে কিছুটা কৌতুকপূর্ণ হতে পারি তবে আর্দুইনো সম্প্রদায়ের মধ্যে আমি যে আচরণগুলি দেখছি সেগুলি অ্যান্টি-প্যাটার্নগুলি প্রোগ্রাম করছে। আমি প্রচুর "কপি-পেস্ট" প্রোগ্রামিং, লাইব্রেরিগুলিকে ব্ল্যাক-বাক্স হিসাবে চিকিত্সা করা এবং সম্প্রদায়টিতে সাধারণভাবে দুর্বল নকশার অভ্যাসগুলি দেখতে পাচ্ছি। অবশ্যই, আমি EE.stackexchange এ মোটামুটি সক্রিয়, তাই আমার কিছুটা তির্যক দৃষ্টিভঙ্গি থাকতে পারে, যেহেতু আমার কাছে কিছু সংযোজনকারী সরঞ্জাম রয়েছে এবং এর ফলে অনেকগুলি বন্ধ প্রশ্ন রয়েছে। সেখানে আমি যে অর্ডিনো প্রশ্নগুলি দেখেছি সেখানে অবশ্যই অবশ্যই একটি পক্ষপাত আছে যা "আমাকে কী করতে হবে সিএন্ডপি বলুন", তারপরে "কেন এটি কাজ করছে না"।
কনার ওল্ফ

3

TCCR1A টাইমার / কাউন্টার 1 নিয়ন্ত্রণ রেজিস্টার এ

TCCR1B টাইমার / কাউন্টার 1 নিয়ন্ত্রণ রেজিস্ট্রার বি

TCNT1 টাইমার / কাউন্টার 1 এর পাল্টা মান

CS12 টাইমার / কাউন্টার 1 এর জন্য 3 য় ঘড়ি নির্বাচন বিট

TIMSK1 টাইমার / কাউন্টার 1 এর বিঘ্নিত মাস্ক রেজিস্টার

TOIE1 টাইমার / কাউন্টার 1 ওভারফ্লো বাধা সক্ষম

সুতরাং, কোডটি টাইমর / কাউন্টারটিকে 62.5 কেএজেডজে সক্ষম করে এবং মানটি 34286 এ সেট করে Then ISR(timer0_overflow_vect)


1

টিসিসিআর 1 বি রেজিস্ট্রারের বিট 2 উপস্থাপন করার কারণে সিএস 12 এর মান 2 রয়েছে।

(1 << CS12) মান 1 (0b00000001) নেয় এবং এটি (0b00000100) পেতে 2 বার ছেড়ে যায়। ক্রমের ক্রম নির্দেশ করে যে জিনিসগুলি () এর মধ্যে প্রথমে ঘটে থাকে, সুতরাং "| =" মূল্যায়ন করার আগে এটি করা হয়।

(1 << CS10) মান 1 (0b00000001) নেয় এবং (0b00000001) পেতে 0 বার ছেড়ে যায়। ক্রমের ক্রম নির্দেশ করে যে জিনিসগুলি () এর মধ্যে প্রথমে ঘটে থাকে, সুতরাং "| =" মূল্যায়ন করার আগে এটি করা হয়।

সুতরাং এখন আমরা টিসিসিআর 1 বি পেয়েছি | = 0b00000101, যা টিসিসিআর 1 বি = টিসিসিআর 1 বি এর সমান | 0b00000101।

যেহেতু "|" "ওআর", টিসিসিআর 1 বি এর সিএস 12 ব্যতীত সমস্ত বিটগুলি প্রভাবিত নয়।

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