Hallo Forum.
Manchmal zweifle ich an meinen Fähigkeiten.
Ich will den Vergleich Wert für einen 16 bit Timer während der Laufzeit
ausrechnen und da muss man ja ein High Register setzen und ein Low
Register.
Wenn ich mache:
1 | OCR1AH = 0xF4;
|
2 | OCR1AL = 0x24;
|
Kommt genau 1 Sekunde raus für den Timer (Prescaler 256 und 16MHz) und
das klappt auch.
Jetzt zur gesagten Berechnung:
1 | void setCompRegister(int ms) {
|
2 | uint16_t compareVal = 16000 * ms / 256;
|
3 | uint8_t *ptr = (uint8_t *) &compareVal;
|
4 | OCR1AH = ptr[1];
|
5 | OCR1AL = ptr[0];
|
6 | }
|
mit dem Aufruf:
setCompRegister(1000);
Da müsste wieder genau
1 | OCR1AH = 0xF4;
|
2 | OCR1AL = 0x24;
|
rauskommen.
Ich habe leider keinen AVR Debugger, aber wenn ich den Code auf dem
Rechner laufen lasse funktioniert er!
Nur auf dem ATmega328p kommt was anderes raus (viel kleiner, also höhere
Frequenz)
Was mach ich nur falsch.