मैं फ़ंक्शन को प्रति सेकंड 800 बार कॉल करने के लिए एक टाइमर सेट करना चाहूंगा। मैं 1024 के एक प्रीस्कूलर के साथ Arduino मेगा और टिमर 3 का उपयोग कर रहा हूं। मैंने जो प्रीस्कूलर फैक्टर चुना है, उसे चुनने के लिए निम्नलिखित चरण देखें:
- CPU फ्रीक: 16MHz
- समय संकल्प: 65536 (16 बिट)
- 16x10 ^ 6 /: चुना prescaler से विभाजित सीपीयू freq 1024 = 15625
- बाकी को वांछित फ्रीक 62500/800 = 19 के माध्यम से विभाजित करें ।
- परिणाम + 1 को OCR3 रजिस्टर में डालें।
मैंने TCCR3B के रजिस्टर सेट करने के लिए निम्न तालिका का उपयोग किया है:
त्रुटि
कोड को संकलित करना असंभव है। यह कंपाइलर द्वारा दी गई त्रुटि है:
सर्वो \ Servo.cpp.o: फ़ंक्शन में '__vector_32': C: \ Program Files (x86) \ Arduino \ पुस्तकालयों \ Servo.cpp: 110: '__vector -32' AccelPart1_35.cpp.o: C: \: की कई परिभाषाएँ प्रोग्राम फाइल्स (x86) \ Arduino / AccelPart1_35.ino: 457: पहली बार यहाँ c: / प्रोग्राम फाइल्स (x86) / arduino / हार्डवेयर / टूल्स / avr / bin /../ lib / gcc / avr / 4.3.2 / को परिभाषित किया गया है। ./../../..//r/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
शामिल करने के बाद एक सही डालने का प्रयास करना होगा।