Zobrazovač na 7-segmentovém displeji, multiplexní rež. s BCD

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.

#include <avr/io.h>
#include <util/delay.h>
#include<avr/interrupt.h>

uint8_t a, b, c, d;
uint8_t pozice;
void zmena ()
{
if (pozice == 1)
{
PORTD = b | 0b00100000;
pozice = 2;
}
else if (pozice == 2)
{
PORTD = c | 0b01000000;
pozice = 3;
}
else if (pozice == 3)
{
PORTD = d | 0b10000000;
pozice = 4;
}
else
{
PORTD = a | 0b00010000;
pozice = 1;
}
}
ISR (TIMER0_COMP_vect)
{
zmena ();
}
void LED (uint16_t cislo)
{
uint16_t pom;
a = cislo/1000;
pom = cislo % 1000;
b = pom/100;
pom = pom % 100;
c = pom / 10;
pom = pom % 10;
d = pom;
}
int main(void)
{
DDRD = 255;
TCCR0 = 11;
TIMSK = 2;
OCR0 = 80;
sei();
int p = 0;
LED §;
while(1)
{
LED (++p);
_delay_ms(1000);
}
return 0;
}

:arrow_right: administrator: přejmenováno z "Problém při psaní kódu v C"

toto sa mi nejako nezda LED (++p); a namiest oif else skus pouzit switch - case

Jaký procesor a oscilátor?

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 :smiley:) 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 :wink:. 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 :smiley:. 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++…