Tôi đang cố kiểm tra tần số của Timer3 bằng bộ đếm. Giá trị của bộ đếm, được khai báo là không ổn định, được tăng lên trong ISR và cứ sau mỗi giây, tổng được hiển thị trong vòng lặp chính và đặt lại giá trị về 0.
Bộ hẹn giờ đã được thiết lập chính xác. (Nếu tôi chọn bộ hẹn giờ 3Hz, tôi có thể thấy đèn led nhấp nháy)
Vấn đề
Số lượt truy cập không tăng. Đây là đầu ra:
Setup Completed
tick: 1
tick: 0
tick: 0
tick: 0
MÃ
volatile int cont = 0;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
// 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; // 800Hz 5; // 3 Hz
// 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)
{
//digitalWrite(13, digitalRead(13) ^ 1);
cont++;
}
EDIT Bộ hẹn giờ này được sử dụng để đọc giá trị anlog từ gia tốc kế và lưu trữ nó trong một mảng nổi. Nhưng tại thời điểm này tôi bị mắc kẹt trong vấn đề cập nhật này.
GIẢI PHÁP 1 Cảm ơn Gerben
volatile int cont = 0;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
// 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
OCR3A = 20; // 20; //800Hz 5; // 3 Hz
// turn on CTC mode:
TCCR3B |= (1 << WGM32);
// 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()
{
delay(1000);
Serial.println(cont);
cont = 0;
}
ISR(TIMER3_COMPB_vect)
{
cont++;
}
GIẢI PHÁP 2 Nhờ BrettM
volatile int cont = 0;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
// 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; //800Hz 5; // 3 Hz
// turn on CTC mode:
//TCCR3B |= (1 << WGM32);
// 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()
{
Serial.println(cont);
cont = 0;
delay(1000);
}
ISR(TIMER3_COMPB_vect)
{
TCNT3 = 0;
cont++;
}
digitalWrite
và đặt OCR3B = 5;
đèn led nhấp nháy ở tần số đó.
cont = 0;
bên trong vòng lặp? Điều gì xảy ra sau đó?
digitalWrite
dòng bạn thấy đèn LED nhấp nháy khoảng một lần mỗi giây (cứ sau 0,66 giây)?