.. vim: ft=rst showbreak=--»\ noexpandtab fileencoding=utf-8 nomodified wrap textwidth=0 foldmethod=marker foldmarker={{{,}}} foldcolumn=4 ruler showcmd lcs=tab\:|- list tabstop=8 noexpandtab nosmarttab softtabstop=0 shiftwidth=0 linebreak :date: 2026.05.21 04:00:32 :_modified: 1970.01.01 00:00:00 :tags: MHF :authors: Gilhad :summary: Sound :title: Sound :nice_title: |logo| %title% |logo| %HEADER% Sound -------------------------------------------------------------------------------- Pro generování tónů na pozadí potřebuju nějaký nepoužitý Timer a jeho pin, se kterým můžu kmitat. Piny jsou použity všechny. Ale asi nejmíň to bude vadit na portu L, kde jsou adresy pro Shared RAM, kterou zrovna nepoužívám (až MHF bude grafickou kartou, tak to moc nepůjde). Je to "zneužití", takže budeme předpokládat, že může být kdykoli odstřeleno, tudíž provedu inicializaci při každém spuštění a kdokoli kdykoli může spustit stop. **Princip** Frekvence na OC5A: f_OUT = f_CPU / (2*N*(1+OCR5A)) a obráceně OCR5A= f_CPU / (2*N*f_OUT) - 1 kde: * f_CPU = 16 MHz * N = prescaler * OCR5A = compare registr Použijeme prescaler 8, protože dobře vychází pro audio tóny. .. code:: ; ; sound.S ; ATmega2560 ; OC5A = PL3 ; #include .global sound_init .global sound_play .global sound_stop ; ============================================================ ; sound_init ; ============================================================ sound_init: ; PL3 / OC5A jako output sbi DDRL, 3 ; Timer stopped ldi r16, 0 sts TCCR5A, r16 sts TCCR5B, r16 ret ; ============================================================ ; sound_play ; ; vstup: ; r25:r24 = OCR5A hodnota ; ; ============================================================ sound_play: // sound_init: ; PL3 / OC5A jako output sbi DDRL, 3 // ; Timer stopped - rovnou ho rozebehnu o kousek niz // ldi r16, 0 // sts TCCR5A, r16 // sts TCCR5B, r16 ; nastavit compare value sts OCR5AL, r24 sts OCR5AH, r25 ; ; Toggle OC5A on compare match ; ; COM5A0 = 1 ; ldi r24, (1<