Atmega16 časovače(nepoužití delay+větši projekt)

Dobrý den,

vytvářím program v C pro atmega16 k ní je připojeno 2x servo a 1x ultrazvukový senzor. Používám všechny tři časovače následovně TIMER0 = servo1. TIMER1 = ultrazvukový senzor a TIMER2 = servo2. Pro ultravukovovz senzor je hodnota TCNT1 nulována pro změření vzdálenosti, pro serva jsou časovače 0 a 2 v režimu fast PWM a tudíž nuluju hodnotu pomocí bitu OCRx. Potřeboval bych navíc měřit čas, tak abych například některé servo mohl zastavit na určitý čas na jednom místě a poté znovu pootočit a počkat zase určitou dobu(tato doba bude vždy stejná). Vzhledem k tomu, že si nuluju všechny časovače v určitých místech, tak uplně nevím jak bych měl tuto dobu změřit. Navíc k tomu všemu, nemůžu použít delay, protože bych si tak zastavil měření vydálenosti, která by měla běžět prakticky pararelně se servama. Napadlo mě, že bych třeba mohl časovače pro serva hodit do normálního režimu, počkat až dosáhne určité hodnoty a poté znovu spusti PWM režim abych otočil servomotorem. Předem děkuji za jakýkoliv nápad a omlouvám se za trošku zmatečný a dlouhý popis problému.

Čítač ve Fast PWM režimu čítá až do svého maxima - tedy pokaždé stejně = TOV přerušení nastává při přechodu 0xFF->0x00 a lze ho tedy k měření času použít. Pomocí OCRx se nenuluje hodnota čítače, ale ovládá se tím PWM výstup. Čítač by se pomocí OCRx nuloval pouze v případě CTC (Clear Timer on Compare match) režimu. V případě CTC režimu k TOV přerušení nikdy nedojde.

Jinak i Timer 1 by šel použít - a to tak, že bys startovací impulz pro ultrazvukový senzor posílal při přerušení TOV1 a dobu bys pak odchytával pomocí ICP, ale proč to předělávat, pokud Ti to šlape a na měření času můžeš použít ostatní čítače.

Dalším řešením by pak bylo použít pro ultrazvukový senzor timer 0 nebo 2 a pro obě PWM pak použít timer 1, který má 2 PWM výstupy. Zbyl by Ti jeden 8-bitový čítač. Ale v tuto chvíli je to stejné jako v předchozím případě - proč předělávat funkční program.

Mockrát děkuji za odpověď, to je přesně to co mi nedocházelo, snažil jsme se to vyčíst v datasheetu, ale pořád mi z těch grafů vycházelo, že se nuluje i hondnota TCNTx. Děkuji.