Jasne to byla moje chybka dik za radu.
jen mi to stale nechce generovat zadnej zvuk. Sirenka je pripojena k portu pres kondik a proti zemi takze by melo stait port nastavit do log1 na urcitou dobu.
Prve na tu f=4kHz
to prave meli resit ty for cykly ale nejak nejsem schopem urcit jak dlouho trva jeden for yklus pri Xtalu 16MHz a procesoru ATmega128
Prehlednejsi zapis je
PORTF |= 1<<PF5;
PORTF &= ~(1<<PF5);
a neovlivnuje to ostatni piny
Mas nastavenej port jako vystup?
DDRF |= (1<<PF5);
Zkus pred “unsigned int i;” a “unsigned int j;” dat jeste “volatile”, zamezi to odstraneni cyklu diky optimalizacim.
Abys zjistil jak dlouho smycka trva, musel by ses podivat do souboru s asemblerem a spocitat to. Lepsi reseni je citac Pokud neumis preruseni, muzes klidne ve smycce testovat priznak preteceni…
jeden for cyklus by mel trvat 6 instrukci. Tzn,: pri krystalu 16MHz jedna instrukce trva 63,3ns takze jeden for cyklus trva 379,8ns tj. 0,0003798ms.
Takze pozadovanou dobu dostanes pokud
for(i=0;i<329;i++)
alespon me to tak vyslo. Ale stejne netusim zda ti to bude neco delat. Ja zapojil sirenku podle prilozeneho obrazku ale nic to nedelalo
robit presne casove oneskorenie sluckam v C (ale v principe i v ASM ) je zhovadilost. Procesor ma vykonavat uzitocnu cinnost a nie stale codit dokola medzi styrmi instukciami ako taky blbec. Od prekladaca sa aj ocakava, ze vygeneruje co najmensi kod a o to sa aj on snazi. Ak usudi, ze nieco sa v podstate aj tak neprejavi v behu progrmu, tak to jednoducho vyhodi, alebo nejak inak zoptimalizuje. Volatile je riesenie, ale pre tento pripad velmi kostrbate.
sice v tvojom ASM povolujes globalne prerusenie, ale nenasiel som povolenie prerusenia od casovaca, tak ze kod pre prerusenie sa nikdy nevykona.
nenasiel som spravne nastavenie parametrov casovaca.
Skus sa pozriet na uvedene body, snad ti to pomoze posunut sa vpred.
Delka cyklu (kterej nic nedela a neni “odoptimalizovan” ) taky zavisi na pouzity pocitaci promenny… jiny to bude u unsigned char a jiny u int Je potreba si to zmerit v simulatoru…