ฉันต้องการตั้งค่าตัวจับเวลาเพื่อเรียกใช้ฟังก์ชัน 800 ครั้งต่อวินาที ฉันใช้ Arduino Mega และ Timer3 กับ prescaler ที่ 1024 เพื่อเลือกตัวประกอบ prescaler ที่ฉันได้พิจารณาขั้นตอนต่อไปนี้:
- CPU ความถี่: 16MHz
- ความละเอียดตัวจับเวลา: 65536 (16 บิต)
- ความถี่แบ่ง CPU โดย prescaler เลือก: 16x10 ^ 6/ 1024 = 15625
- แบ่งส่วนที่เหลือผ่านความถี่ที่ต้องการ 62500/800 = 19
- ใส่ผลลัพธ์ + 1 ในการลงทะเบียน OCR3
ฉันใช้ตารางต่อไปนี้เพื่อตั้งค่าการลงทะเบียนของ TCCR3B:
ข้อผิดพลาด
ไม่สามารถคอมไพล์โค้ดได้ นี่เป็นข้อผิดพลาดที่คอมไพเลอร์ส่งคืน:
Servo \ Servo.cpp.o: ในฟังก์ชั่น '__vector_32': C: \ Program Files (x86) \ Arduino \ libraries \ servers \ Servo / 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 / ./../../../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
หลังจากรวมไว้