Předděličku použijeme tehdy, když počet kroků vyjde větší, než je rozsah čítače, který chceme použít.
Timer1 má max hodnotu 65535, takže pro 7373 kroků není třeba předděličky.
Ale např. pro 10 ms vyjde 73730 kroků, takže použijeme předdělič /stačí 8/.
Prostě použít co nejmenší předděličku, aby se žádaný počet kroků vešel do 16 bitů (nebo do osmi bitů u osmibitového čítače).
Ja to riesim tak, ze si pocitam pocet preruseni a kazde piate nastavim na 116.
(pre predvolbu 115 treba nastavit do OCR cislo 114 a pre predvolbu 116, cislo 115)
Tym vznikne presny deliaci pomer 115.2 v 2.5 ms. Aby to bolo v 2.5ms, prerusenie generujem kazdych 500us.
Ale chyba vznika v tej frekvencii Xtalu, lebo ta nie je 7.3730MHz, ale 7.3728MHz.
co je 0.0027%. Myslim, ze je pre bezne pouzitie uplne zanedbatelna.
no ak to chcem vsetko nastavit v kode ? rozhodol som sa pre timer/counter1 (16bit) aby som nemusel pouzit predelicku. Ale co vsetko nastavit? alebo treba pouzit nejaky rezim (CTC,PWM…??), jedine co vime tak nastavit timer: TCCR1B|=(1<<CS10); potom ho checknut: if (TCNT1>=7373) … TCNT1=0; (reset) a dalej neviem ako nastavit reg. TIMSK(maskovanie prerusenia), TIFR(nastavenie priznaku)…
#define T2_CNT TCNT2 #define T2_PREDVOLBA OCR2A #define POCET_PRVEJ_PREDVOLBY 5 // pocet priradenia hodnoty TB_DEFAULT_1 a TB_DEFAULT_2 do komparacneho registra #define TB_DEFAULT_1 229 //230-1 pouzije sa POCET_PRVEJ_PREDVOLBY, alebo 115-1, ak mas pomalsi Xtal #define TB_DEFAULT_2 231 //232-1 pouzije sa 1x, (ak POCET_PRVEJ_PREDVOLBY = 5, potom bude priemer 230.4) , alebo 116-1, ak mas pomalsi Xtal, potom bude priemer 115.2
void cnt_ini(void)
{
TCCR2A = (1<<WGM21);
TCCR2B = (1<<CS22);
SET(TIMSK2,OCIE2A); // povolenie interuptu pri compare match
}
ISR(SIG_OUTPUT_COMPARE2A)
{
if (--tb_cnt_count_int_tb) { // najprv sa dekrementuje pocitadlo vlozenia predvolieb a potom sa porovna
TB_PREDVOLBA = TB_DEFAULT_1;
}
else {
tb_cnt_count_int_tb = POCET_PRVEJ_PREDVOLBY;
TB_PREDVOLBA = TB_DEFAULT_2;
}
// … tu si daj co chces
// je to napisane narychlo, dufam, ze tam nebudu nejake neprekonatelne chyby
}[/code]
if (--tb_cnt_count_int_tb) { // najprv sa dekrementuje pocitadlo vlozenia predvolieb a potom sa porovna
TB_PREDVOLBA = TB_DEFAULT_1;
}
else {
tb_cnt_count_int_tb = POCET_PRVEJ_PREDVOLBY;
TB_PREDVOLBA = TB_DEFAULT_2;
}
presne tak, ako som Ti napisal … rozsirenie 8b je 16b, pouzi pre rozsirenie 16b na 24b
pouzil som funckciu case (switch) a av avr studiu ako by to nepoznalo; hlasi chybu:
…/usart_new.c:127: error: expected declaration or statement at end of input
make: *** [usart_new.o] Error 1
Zdravim,
poradil by mi nekdo kde je chyba v následujícím kódu? Melo by to jen načíst znak z klávesnice a poslat ho zpět… Díky
V hyperterminálu nastavuju rychlost 9600, datové bity 8, parita žádná, stop bit 1, řízení toku žádné