Jak test. program z CVA v AVRS? Zobraz. akt. stavu registru?

Zdravim vsechny nadsence,

snazim se zacit programovat mikroC AVR. Stahl jsem si AVR Studio i CodeVisonAVR. Jako navod mam knihu od V. Vani, ktery je psany v CodeVisonAVR ( bohuzel nejde presne psat v AVR studiu) a ten neobsahuje simulator. Docetl jsem se, ze jde pomoci souboru *.cof testovat program i z CVA v AVRStudiu. Bohuzel jsem neprisel na to, jakym zpusobem toho dosahnout - klasicke open file nestaci. Muzete mi nekdo poradit?

A druha vec ohledne AVRS simulatoru. Je nejak mozne spustit program tak, aby zobrazoval aktulani stavy jednotlivych registru atd. okamzite za behu? Vzdycky, kdyz chci neco testovat a mam tam zpozdeni napr. 500ms, chtel bych simulaci spustit a videt, co se presne deje, jak napr. preblikavaji hodnoty na vystupu. Ted musim bud krokovat (coz je trochu nerealne v takovem casovem rozsahu - krok trva snad 30mikros) a nebo spustit program, po nejakem case pauznout a zkontrolovat stavy. To zase neni idealni, protoze se tezko sleduje, kdy se stav zmenil - pri behu se hodiny nemeni na obrazovce, jen v pozadi.

Diky moc za rady. Pavel

:arrow_right: administrator: přejmenováno z "Zakladni funkce AVR Studio simulatoru"

GCC v avrstudiu je více “ansi C”. Když je v codevision nějaká fičurka, stačí přepsat do C syntaxe a mělo by to fachat.

kdybys měl problém nějaký konkrétní příkaz přeložit v gcc, písni ho, nejspíš to dokážem přelousknout. Nápověda gcc je v tomhle případě taky celkem použitelná (to pdfko, ne ten html hnuj, na kterej je ve startu odkaz po instalaci).
Ohledně druhé otázky - nejspíš si budeš muset vystačit s breakpointy. Dát ho před instrukcí, která mění sledovaný objekt a odklepnout step-out.
Při použití “auto step” se hodnoty refreshují při každém kroku :wink:

Diky za rady, no jde o to, ze jsou tam jen trochu odlisne funkce napr. delay_ms vs _delay_ms. Pak jeste pri tvorbe projektu u COdeVison pouzivaji wizard, kde jde nastavit presne typ komunikace, procesoru a ostatnich veci. To presne nevim, kde se v AVR studiu dela a aby se to dalo podobne pouzit.

Zkusil jsem pouzit teda ty breakpointy a nefunguje to presne tak, jak bych si predstavoval.

Mam kod

[code]
while(1)
{
_delay_ms(200);
PORTA = 0b01010101;
_delay_ms(200);
PORTA = 0b10101010;

}  [/code]

a breakpointy dam pred obe PORTA, tak jsem myslel, ze se to tam zastavi v kazdem cyklu. Mne se to ale zastavi jen poprve a pak uz nikdy…je v tom jeste nejaky hacek? Diky moc

Tady je problem “moc kratkej” kod. Kyž se totiž podíváš do disasembleru, uvidíš, že ten příkaz má 2 instrukce. Astudio dá breakpoint před první z nich, ovšem optimalizátor kód trochu přerovná a program se na tu 1. instrukci už nikdy nedostane. Pokud by byl kód větší, aby byl kompilátor nucenej ty použitý registry přepsat, nebo se na porty nezapisovaly konstanty, tak už by to chodilo.
Schránka04.gif
Schránka02.gif

Třeba tohle už by ti s breakpointy před “PORTA = …” chodilo dle představ. Ovšem breakpoint před “temp = …” by skončil stejně jako v předchozím případě.

int main (void)
{
	volatile unsigned char temp;

	for(;;)
	{
		temp = 0b01010101;
		PORTA = temp;
		temp = 0b10101010;
		PORTA = temp;
	}
	return 0;
}

“volatile” je zde nezbytné, jinak optimalizace opět zařídí to co se dělo výše.

Diky moc…uz se s tim pokusim poprat;) Urcite tady nepisu naposledy;)

V té knize je to dost jasně vysvětlené. Navíc je to velmi jednoduché:

V Codevisionu klikneš na “berušku”(debugger) ,v AVR studiu na “open”
a otevřeš soubor .cof . Pokud ti toto nefunguje, máš asi starou verzi studia - Codevision spolupracuje s verzemi od 4.06 výše.

Já to dělám tak, že spustím “autostep”. Před tím je ale nutné pro simulátor upravit časy ( delay_ms(500) trvá asi 2minuty) takže o 1 -2 řády snížit - pak samozřejmě nezapomenout vrátit.