এটিএমগা 328 এভিআর টাইমার স্পিডআপ


9

এটিএমগা 328 এ 64-এর ক্লক প্রেস্কেলারে চলাকালীন, আমার টাইমারগুলির মধ্যে একটি মৃত্যুদন্ড কার্যকর করার সময় একটি নির্দিষ্ট সময়ে অজানা কারণে গতি বাড়ায়।

TLC5940 দ্বারা প্রয়োজনীয় ক্লকিং তৈরি করতে আমি ATmega328 এ দুটি টাইমার ব্যবহার করছি (কেন এটি নীচে দেখুন; এটি প্রশ্নের অনিবার্য )। TIMER0দ্রুত পিডব্লিউএম ব্যবহার করে একটি ঘড়ি সংকেত উত্পন্ন করে OC0Bএবং নীচে সেট আপ করা হয়:

TCCR0A = 0
    |(0<<COM0A1)    // Bits 7:6 – COM0A1:0: Compare Match Output A Mode
    |(0<<COM0A0)    // 
    |(1<<COM0B1)    // Bits 5:4 – COM0B1:0: Compare Match Output B Mode
    |(0<<COM0B0)
    |(1<<WGM01)     // Bits 1:0 – WGM01:0: Waveform Generation Mode
    |(1<<WGM00)
    ;
TCCR0B = 0
    |(0<<FOC0A)     // Force Output Compare A
    |(0<<FOC0B)     // Force Output Compare B
    |(1<<WGM02)     // Bit 3 – WGM02: Waveform Generation Mode
    |(0<<CS02)      // Bits 2:0 – CS02:0: Clock Select
    |(1<<CS01)
    |(0<<CS00)      // 010 = clock/8
    ;
OCR0A = 8;
OCR0B = 4;
TIMSK0 = 0;

TIMER2প্রতি 256 TIMER0চক্রে একটি ফাঁকা নাড়ি তৈরি করতে ডেটা লাইনটি পাকস্থল করে এবং নীচে সেট আপ করা হয়:

ASSR = 0;
TCCR2A = 0
    |(0<<COM2A1)    // Bits 7:6 – COM0A1:0: Compare Match Output A Mode
    |(0<<COM2A0)    // 
    |(0<<COM2B1)    // Bits 5:4 – COM0B1:0: Compare Match Output B Mode
    |(0<<COM2B0)
    |(0<<WGM21)     // Bits 1:0 – WGM01:0: Waveform Generation Mode
    |(0<<WGM20)
    ;
TCCR2B = 0
    |(0<<FOC2A)     // Force Output Compare A
    |(0<<FOC2B)     // Force Output Compare B
    |(0<<WGM22)     // Bit 3 – WGM02: Waveform Generation Mode
    |(1<<CS22)      // Bits 2:0 – CS02:0: Clock Select
    |(0<<CS21)
    |(0<<CS20)      // 100 = 64
    ;
OCR2A = 255;
OCR2B = 255;
TIMSK2 = 0
    |(1<<TOIE2);    // Timer/Counter0 Overflow Interrupt Enable

TIMER2ওভারফ্লোতে একটি আইএসআর কল করে (প্রতি 256 চক্র)। আইএসআর ম্যানুয়ালি একটি ফাঁকা ডাল তৈরি করে এবং প্রয়োজনে একটি লেচিং নাড়ি তৈরি করে:

volatile uint8_t fLatch;

ISR(TIMER2_OVF_vect) {
    if (fLatch) {
        fLatch = 0;
        TLC5940_XLAT_PORT |=  (1<<TLC5940_XLAT_BIT);        // XLAT -> high
        for (int i=0;i<10;i++)
            nop();
        TLC5940_XLAT_PORT &= ~(1<<TLC5940_XLAT_BIT);        // XLAT -> high
    }
    // Blank
    TLC5940_BLANK_PORT |= (1<<TLC5940_BLANK_BIT);
    for (int i=0;i<10;i++)
        nop();
    TLC5940_BLANK_PORT &= ~(1<<TLC5940_BLANK_BIT);
}

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

for (;;) {
    if (!fLatch) {
        sendSerial();
        fLatch = 1;
        _delay_ms(1);
    }
    nop();
}

sendSerial()কিছু এসপিআই প্রেরণ করে ( ব্রেভিটির জন্য পেস্টবিনে কোড ) আমার সমস্যাটি হ'ল sendSerial()কমপ্লিট হওয়ার পরে , fLatchক্লকিং টাইমার গতিবেগকে কম (প্রক্রিয়াজাতকরণ) এ সেট করার অপেক্ষায় । এখানে যুক্তি বিশ্লেষক ট্রেস দেওয়া হয়েছে (আমি সেই অঞ্চলগুলিকে কাটা করেছি যেখানে একই সংকেত গ্রাফিককে আরও ছোট করে তোলে):

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

বাম দিকে, 0 এবং 1 চ্যানেলগুলি এসপিআই ডেটা প্রেরণের টেল এন্ড দেখায়। এছাড়াও বাম দিকে, চ্যানেল 4 এ, আপনি একটি ফাঁকা নাড়ি দেখতে পাবেন। চ্যানেল 2 তে প্রত্যাশার সাথে সাথে ক্লকিং ডাল চাগগুলি। চিত্রের ফাঁক যেখানে রয়েছে তার চারপাশে, রুটিনের অভ্যন্তরে fLatchসেট করা 1আছে main()। এবং শীঘ্রই এর পরে TIMER0প্রায় 4 এর গুণক গতি বাড়ায় Event আবার পাঠানো। আমি delay_ms(1);লাইনটি বের করার চেষ্টা করেছি main(), তবে একই ফলাফল পাওয়া যায়। কি হচ্ছে? আমার মনে রাখা উচিত যে এটিমেগা একটি 20 মেগাহার্জ স্ফটিক বন্ধ হয়ে গেছে এবং তারপরে নিম্নলিখিত কোডটি ব্যবহার করে x৪x হ্রাস করে:

CLKPR = 1<<CLKPCE;
CLKPR = (0<<CLKPS3)|(1<<CLKPS2)|(1<<CLKPS1)|(0<<CLKPS0);

এটি এর জন্য: আমি টিএলসি 5940 এলইডি ড্রাইভারটি নিয়ন্ত্রণ করার জন্য পরীক্ষা নিরীক্ষা করছি : এই চিপগুলির জন্য ক্লকিং চক্রের শেষে একটি বাহ্যিক ঘড়ি এবং পুনরায় সেট করা দরকার।


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

দুটি সমস্যা: ক) আমার কাছে জেটিএইচ প্রোগ্রামার নেই তাই আমার কাছে চিপটি ডিবাগ করার কোনও উপায় নেই খ) উপরে বর্ণিত সেটআপের পরে টাইমার নিবন্ধের মানটি আমি কখনই পরিবর্তন করি না, তাই আমি টাইমার নিবন্ধের মানগুলি আশা করি না আসলে পরিবর্তন। সে কি নিষ্পাপ?
অ্যাঞ্জেল্যাটলার্জ

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

1
@ ব্লুপ ১৯৮০ যা অন্য একটি জিনিস প্রস্তাব করেছিল সেগুলি বাদ দিয়ে টিএলসি59৪০ মুছে ফেলা চেষ্টা করা উচিত যে এটি ক্লক লাইনের সাথে কোনও জঘন্য কাজ করছে না তা নিশ্চিত করার জন্য।
পিটারজে

@ ব্লুপ ১৯৮০ আমি নিশ্চিত যে আমি ইউআরটির প্রাসঙ্গিকতা দেখছি: আমি এসপিআইয়ের জন্য ইউএসএআরটি ব্যবহার করছি না, কেবলমাত্র "নিয়মিত" এসপিআই সুবিধা রয়েছে। sendSerial()আমার কোড যা এসপিআই এর মাধ্যমে ডেটা প্রেরণ করে: এটি TCCR(টাইমার নিয়ন্ত্রণ) নিবন্ধগুলিতে স্পর্শ করে না ।
অ্যাঞ্জেল্যাটলার্জ

উত্তর:


1

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

কেবলমাত্র আপনি কীভাবে সংকলিত আরডুইনো স্কেচগুলি এভিআরে আপলোড করবেন তা জানেন না: আপনি যখন আপনার স্কেচটি সংকলন করেন তখন এটি একটি হেক্স ফাইল তৈরি করে (আপনি সেটিংসে ভার্বোস মোড চালু করে ফাইলটির সঠিক অবস্থানটি দেখতে পারেন)। আপনি সেই হেক্সটিকে আপনার পছন্দসই প্রোগ্রামারটির সাথে আপনার এভিআরে আপলোড করতে পারেন।

আশা করি এটা সাহায্য করবে

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