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.
Die Häufigkeit Ihres Timer-Interrupts entspricht der folgenden:
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