我想设置一个计时器,以便每秒调用一个函数800次。我正在使用预分频器为1024的Arduino Mega和Timer3。为选择预分频器,我考虑了以下步骤:
- CPU频率:16MHz
- 计时器分辨率:65536(16位)
- 16x10 ^ 6 /:由所选择的预分频CPU频率1024 = 15625
- 将其余部分除以所需的频率62500/800 = 19。
- 将结果+1放入OCR3寄存器。
我已使用下表设置TCCR3B的寄存器:
错误
不可能编译代码。这是编译器返回的错误:
Servo \ Servo.cpp.o:在功能'__vector_32'中:C:\ Program Files(x86)\ Arduino \ libraries \ Servo / Servo.cpp:110:'__vector_32'AccelPart1_35.cpp.o:C:\的多个定义程序文件(x86)\ Arduino / AccelPart1_35.ino:457:首先在这里定义c:/程序文件(x86)/ arduino / hardware / tools / 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++;
}
由于已经解决了主要问题,因此我在这里创建了另一个与计数器增加问题有关的问题。