Zdravím a pozdravuji, mám následující kód psaný v jazyce C a funkce, která je napsaná v poslední nekonečné smyčce, se odmítá zavolat. Vážně nevím, kde dělám chybu. Při stupidním střídání LED(++p) a _delay_ms(1000) to funguje, ale nechápu, proč by to nemělo jít takhle… Program by měl fungoval jako jednoduchý zobrazovač čísel na sedmisegmentovém diodovém displeji v multiplexním režimi při použití BCD převodníku. 4 významější bity portu D spínají katody diod, druhé 4 bity pak určují číslo.
Co by bylo špatnýho na LED(++p)?? Můžu s klidem říct, že p++; LED§; ani p = p+1; LED§; nefunguje. Teď sem teda zkusil ten switch a beze změny… Oscilátor je 1MHZ a mikrokontrolér ATMega16.
Teď jsem zjistil, že kód funguje při vypnutí všech optimalizací, ovšem aby takováhle hloupost zabírala 4kB paměti není zrovna dobrý. Už kolikrát sem mně stalo, že překladač v zájmu optimalizace (nebo nevím čeho ) prostě nepočítal s přerušením, takže např kód, kde x je globální proměnná:
x = 1;
while (x)
{…}
přeložil jako nekonečnou smyčku, protože skrátka nepočítal s tím, že by se x mohlo změnit z přerušení. Ale jak AVR studiu “vnutit” tuto konrolu, to mně je záhadou. Snad pomocí nějakého klíčocého slova? Nevíte někdo? Taky mně celkem překvapuje, že přestože je AVR studio verze 4 prostředí pro C, barevně zvýrazňuje i klíčová slova z C++, nějaká jdou (např. inline, static - práce s třídami??) ale většina ne (třeba ani bool nebo false…)
Proměnná v přerušení není problém AVR studia ani překladače, ale tvé neznalosti jazyka C . Takovou proměnnou musíš označit jako “volatile”, tedy např. “volatile char x;”.
Inline znamená, že se funkce nebude volat, ale vloží se její kód na místo volání.
Static má více významů a také je třeba použití tohoto klíčového slova znát (stejně jako související extern), viz. jazyk C.
Za to volatile díky moc, kouzlo tohoto slova mně nebylo moc známo . Nicméně stejně nechápu, proč to ty C++ klíčový slova zvýrazňuje, když nejdou použít. Možná existuje do AVR studia nějaká nadstavba, která přidává podporu C++…