Generátor: Generovaní sinusového a trojúhelníkového průběhu

Pro sinus trvá jedna perioda 24 us (1/41670).
Jestli chceme mít 32 vzorků na periodu, musí timer vyvolat přerušení ne za 24us ale za 24/32 = 0,75us.
Jinak řečeno, frekvence přerušení musí být 32*41670 = 1 333 440 Hz.

V módu CTC
frekvence = (F_CPU/prescaler)/(OCR0A+1)
OCR0A = ((F_CPU/prescaler)/frekvence)-1

Pro frekvenci 1333440 Hz a předdělič 1 dostaneme OCR0A = 13,99

//nastavení timeru TCCR0A = (1<<WGM01); // mód CTC TCCR0B = (1<<CS00); // prescaler 1 OCR0A = 14;

Při každém přerušení zapíšeme hodnotu z tabulky sinus.

Důležité je, že tento zápis nesmí trvat déle než 0,75 us, to jest, než přijde další přerušení.
Nemůžeme tady použít kód od Martina, protože tam bude trvat zápis podstatně déle.

Dokonce ani nejjednodušší kód bez testování tlačítka:

while (1) { if(TIFR & (1<<OCF0A)) { PORTB = sin_tab*; // "i" se vynuluje po hodnotě 31 i++; TIFR = (1<<OCF0A); // clear flag } }
se nedá použít, trvá 0,8us. (Avrstudio 4.17.666 - Winavr 20100110)

Proto bych zvolil menší počet vzorků na periodu, třeba 16 a zkontroloval jestli časování bude sedět.*