Jak jsem psal výše, nepodařilo se mi přesvědčit překladač, aby proměnnou řetězec umístil před ostatní. Ať jsem zkoušel, co jsem chtěl, vždy byl řetězec na konci RAM. Zkoušel jsem nakonec použí i unsigned int na index, jenže pravděpodobně optimalizace nebo něco jiného mi to “zhatily”. Nevadi. Nebudu Ti více motat hlavu.
V tuto chvíli, když sahneš mimo rozsah 0-100 prostě saháš do oblasti, která není ničím obsazena. Smyčku
do
{
index--;
retezec[index]=0; // Index je na konci řetězce, tak ho vynulujeme až do nultého znaku.
}
while (index>0);
přepiš na
while (index>0)
{
index--;
retezec[index]=0; // Index je na konci řetězce, tak ho vynulujeme až do nultého znaku.
}
Vysvětlení :
V okamžiku, kdy budeš mít v řetězci pouze ENTER na pozici 0, bude index=0. Před zahájením této smyčky jsi nahradil ENTER znakem 0, tudíž nevadí, když se smyčka neprovede ani jednou. Pokud budeš mít v řetězci třeba “AB”+ENTER, bude index=2. Při vstupu do vyhodnocování nahradíš ENTER znakem 0, čímž řetězec ukončíš. Po vstupu do této smyčky bude index=2. Provede se první cyklus, kdy se index sníží na 1 a na pozici 1 se uloží 0. Následuje kontrola indexu. V tuto chvíli je index 1, smyčka se zopakuje. Při indexu 0 se smyčka neprovede. V prvním případě by, kdy se kontrola prováděla na konci, to znamenalo, že pokud do smyčky vstupuješ s indexem větším, než 0, vše chodí OK. Pokud jsi však do smyčky již vstoupil s indexem=0, pak se dekrementoval index o 1, jenže protože index je unsigned char, nenastavil se na -1, ale na 255. Proto mohl být problém. To, že WinAVR nasypal proměnnou retezec vždy až na konec, způsobilo, že chyba se neprojevila. Dokonce ani při indexu definovaným jako unsigned int, kdy při dekrementování z 0 na 65535 se chyba neprojevila, protože v simulátoru se při práci s řetězcem index ořízl z 16-ti bitů na 8 (z 0xFFFF se stalo 0x00FF). Možná díky optimalizacím - nevím.
Programy krokuji a ladím v AVR Studiu 4.19+WinAVR (to je zárověň odpověď na Tvůj druhý dotaz). Dá se tam nasimulovat i třeba externí přerušení apod. Nicméně mám vyzkoušené, že simuátor AVR Studia obsahuje množství chyb, které se musí obejít v SW při ladění nebo se obejít nedají vůbec (pak nezbývá, než ladit přímo v mcu). Například - nefunguje freerunning mód AD převodníku, resp. automatický restart AD převodu. Pokud používám přerušení od AD převodníku, lze to obejít tak, že se tam při simulaci přidá instrukce pro nové spuštění AD převodu. Zlobí v něm ještě pár dalších věcí (z hlavy si teď nevzpomenu), ale na prvotní ladění je to dobrý. Jako další krok následuje testování na samotném HW. Tam používám systém štěnic, kdy si do inkriminovaného místa dám třeba rozsvícení LEDky, zobrazení na LCD/LED displeji (pokud je použit), případně i posláním dat přes UART do PC (pokud je k dispozici, což většinou není a pokud je, tak je hrozně pomalý…). Tím zjistím, jestli tam program dorazí nebo ne. Chybu, na kterou jsem se snažil Tě navést odhalíš v simulátoru. AVR Studio je ke stažení třeba přímo ze stránek ATmelu (dneska ve verzi tuším 6.2) nebo pohledat po Internetu, kde bys našel starší. Co vím, tak AVR Studio 5 a výše jsou molochy. Někdo na ně nadává, někdo je chválí. Já jsem je zatím nezkoušel. Mě zatím vyhovuje 4.19 (myslím, že se dá i nakopírovat a spouštět bez instalace).
Jinak, co psal AB je samozřejmě pravda. Řetězcová proměnná není unsigned char retezec[100], ale char retezec[100]. Jenže použití char při čtení z UARTu mi dělalo nějaké problémy, tak jsem použil unsigned. Jinak jsem si prošel celý algoritmus a (jak psal AB) je pravda to, že stačí místo nulování řetězce nastavit index=0. Co se té sté pozice týká, tak tam jsem to myslel tak, že na pozici 99 (stá pozice od 0) musí být nula pro stringové funkce. Tam jsem se do toho trošku zamotal sám, protože jakmile dorazí ENTER, tak před předáním řetězce do stringových funkcí se ENTER nahradí 0, tím se řetězec zakončí. Musel bys tam tu 0 zachovávat pouze v případě, že bys ten ENTER před předáním do stringových funkcí nemazal.
Nemohl jsem si nevšimnout, že jsi odložil sleep_mcu(). Na funkčnost tohoto programu to vliv samozřejmě nemá, ale rozhodně je to šikovná věcička. Pomůže Ti častěji, než si myslíš. Například při eliminaci zákmitů tlačítek.
Já drtivou většinu programuju v AVR Studiu v assembleru, po Cčku sáhnu jenom občas a to pouze, když zpracovávám textové proměnné nebo větší množství dat. K programování pak používám programátor ASIX Presto.