আমি প্রতি সেকেন্ডে 800 বার একটি ফাংশন কল করতে একটি টাইমার সেট করতে চাই। আমি আরডুইনো মেগা এবং টাইমার 3 ব্যবহার করছি 1024 এর একটি প্রেসক্যালারের সাথে the
- সিপিইউ ফ্রিক্স: 16 মেগাহার্টজ
- টাইমার রেজোলিউশন: 65536 (16 বিট)
- 16x10 ^ 6 /: মনোনীত prescaler দ্বারা বিভক্ত করা CPU- র ফ্রিকোয়েন্সি 1024 = 15625
- বাকিগুলি কাঙ্ক্ষিত ফ্রিক্স 62500/800 = 19 এর মাধ্যমে ভাগ করুন ।
- ফলাফলটি 1 টি ওসিআর 3 রেজিষ্টারে রাখুন।
আমি টিসিসিআর 3 বি এর রেজিস্ট্রার সেট করতে নীচের টেবিলটি ব্যবহার করেছি:
ভূল
কোডটি সংকলন করা অসম্ভব। এটি সংকলক দ্বারা ফিরে আসা ত্রুটি:
সার্ভো \ সার্ভো সিপি.পি: ফাংশনে '__vector_32': সি: \ প্রোগ্রাম ফাইল (x86) rdu আরডুইনো \ লাইব্রেরি \ সার্ভো / সার্ভো সিপিপি: 110: '__vector_32' এর একাধিক সংজ্ঞা অ্যাক্সেলপার্ট1_35.cpp.o: সি: \ প্রোগ্রাম ফাইলগুলি (x86) \ আরডুইনো / অ্যাক্সেলপার্ট1_35.ino: 457: প্রথমে এখানে সংজ্ঞায়িত সি: / প্রোগ্রাম ফাইল (x86) / আরডুইনো / হার্ডওয়্যার / সরঞ্জাম / এভিআর / বিন /.. / লিবি / জিসিসি / এভিআর / 4.3.2 /। ./../../../avr/bin/ld.exe: শিথিলকরণ অক্ষম করা: এটি একাধিক সংজ্ঞা দিয়ে কাজ করবে না
কোড
volatile int cont = 0;
unsigned long aCont = 0;
void setup()
{
[...]
// initialize Timer3
cli(); // disable global interrupts
TCCR3A = 0; // set entire TCCR3A register to 0
TCCR3B = 0; // same for TCCR3B
// set compare match register to desired timer count: 800 Hz
OCR3A = 20;
// turn on CTC mode:
TCCR3B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR3B |= (1 << CS30) | (1 << CS32);
// enable timer compare interrupt:
TIMSK3 |= (1 << OCIE3A);
// enable global interrupts:
sei();
}
void loop()
{
// Print every second the number of ISR invoked -> should be 100
if ( millis() % 1000 == 0)
{
Serial.println();
Serial.print(" tick: ");
Serial.println(contatore);
contatore = 0;
}
}
[...]
// This is the 457-th line
ISR(TIMER3_COMPA_vect)
{
accRoutine();
contatore++;
}
void accRoutine()
{
// reads analog values
}
সার্ভো লাইব্রেরি দিয়ে বিরোধ কীভাবে সমাধান করবেন?
সমাধান
নিম্নলিখিত কোড ব্যবহার করে বিবাদ সমাধান হয়েছে। এটি সংকলন করে তবে 800Hz টাইমারের সাথে সম্পর্কিত কাউন্টারটি এর মান বাড়ায় না।
volatile int cont = 0;
void setup()
{
Serial.begin(9600);
// Initialize Timer
cli(); // disable global interrupts
TCCR3A = 0; // set entire TCCR3A register to 0
TCCR3B = 0; // same for TCCR3B
// set compare match register to desired timer count: 800 Hz
OCR3B = 20;
// turn on CTC mode:
TCCR3B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR3B |= (1 << CS30) | (1 << CS32);
// enable timer compare interrupt:
TIMSK3 |= (1 << OCIE3B);
// enable global interrupts:
sei();
Serial.println("Setup completed");
}
void loop()
{
if (millis() % 1000 == 0)
{
Serial.print(" tick: ");
Serial.println(cont);
cont = 0;
}
}
ISR(TIMER3_COMPB_vect)
{
cont++;
}
যেহেতু মূল সমস্যাটি সমাধান হয়ে গেছে, তাই আমি কাউন্টার বর্ধনের সমস্যা সম্পর্কিত এখানে আরও একটি প্রশ্ন তৈরি করেছি ।
#define _useTimer3
লাইনটি সরিয়ে আপনি লাইব্রেরিটি কিছুটা পরিবর্তন করতে হবে , বা #undef _useTimer3
অন্তর্ভুক্ত করার পরে একটি ডানদিক চেষ্টা করার চেষ্টা করছেন ।