16-Bit-Timer von ATMega: Wie berechnet man die Timer-Zählung?

Ich versuche, den 16-Bit-Timer von ATMega bei jedem Midi-Clock-Tick zu verwenden. Ein Beat hat 24 MIDI-Clock-Ticks. Also zB 60 Schläge pro Minute = 1 Schlag pro Sekunde = 24 Ticks pro Sekunde.

Wie kann ich den Timer auf x mal pro Sekunde einstellen (abhängig vom BPM-Wert)?

Ich initialisiere den Timer auf meinem Arduino mit:

void setup()
{
cli();          // disable global interrupts
TCCR1A = 0;     // set entire TCCR1A register to 0
TCCR1B = 0;     // same for TCCR1B

// set compare match register to desired timer count:
OCR1A = 6510;

// turn on CTC mode:
TCCR1B |= (1 << WGM12);

// Set CS10 and CS12 bits for 1024 prescaler:
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);

// enable timer compare interrupt:
TIMSK1 |= (1 << OCIE1A);

// enable global interrupts:
sei();
}

Ich bekomme die Berechnung von OCR1A nicht hin. Es sollte abhängig von einem BPM-Wert sein.

Antworten (2)

Die Häufigkeit Ihres Timer-Interrupts entspricht der folgenden:

Taktfrequenz des Mikrocontrollers ( Vorteiler ) × ( Match-Registerwert vergleichen + 1 )

Da Sie also erwähnt haben, dass Sie ein Arduino verwenden, das mit einem 16-MHz-Quarz geliefert wird, sollte der Wert des Vergleichsregisters (OCR1A) bei einem Prescaler von 1024 650 betragen, um eine Interrupt-Frequenz von 24 Hz zu erreichen.

Wenn Sie die BPM ändern möchten, müssen Sie OCR1A on the fly einstellen.

https://oscarliang.com/arduino-timer-and-interrupt-tutorial/ überprüfen Sie diese Seite, wo die Timer-Interrupt-Funktion alle 0,5 Sekunden ausgelöst wird, die Periode gleich 1/62500 ist (16 MHz mit 256 Prescale), es würde eine Periode dauern von 0000 0000 auf 0000 0001 zu gehen, um den Wert von ocr1a zu bestimmen (occr1a-0+1)*period=0.5 (der Timer zählt von 0 bis occr1a) occr1a=(0.5/period)+1