Problém s optimalizovaným premenné: sekne pri inom nastavení

Ahojte,

rád by som Vás požiadal o pomoc s nasledujúcim problémom:

V AVR studiu 5 píšem program, ktorý obsahuje:

[code]char premenna;

ISR(ANALOG_COMP_vect) // prerušenie každých 20ms
{
if(premenna > 0) premenna–;
}

void main()
{
// predchádzajúca časť kódu

  premenna = 3;
  while(premenna != 0)
  {}

  //  nasledujúca časť kódu

}[/code]

Všetko funguje bez problémov, pokým sú optimalizácie nastavené na (-O0). Pokiaľ použijem iné nastavenie optimalizácií, program sa ,zasekne" v slučke while, a neopustí ju ani vtedy, keď sa premenna=0.

Viete mi poradiť ako a čo nastaviť, resp. zmeniť, aby to fungovalo správne?
Skúšal som použiť pred definíciu premennej ,volatile", taktiež som skúšal do slučky while dať smerník na premenna, ale nepomáha nič.

Dalo by sa nejako zakázať optimalizácie len pre časť kódu?

Ďakujem za vopred rady, mňa už nič nenapadá…

:arrow_right: administrator: přejmenováno z "Problém s optimalizovaním premennej"

Zkus to takhle :

volatile char premenna;

To zabrání překladači optimalizovat onu proměnnou.

Mimochodem - jseš si jistý tím přerušovacím vektorem ANALOG_COMP_vect, když v poznámce píšeš “prerušenie každých 20ms”?

Volatile som už skúšal, ale nepomohlo. Mám taký pocit, že chyba nie je s premennou, ale skôr s cyklom while - akoby netestoval premennú v každom cykle, ale nejako celú podmienku jednoducho ignoroval…

Inak to zapojenie a a. komparátor je v poriadku, detekujem tým prechody nulou (alebo po zmene nastavenia maximum) napätia na fáze v sieti.

Přerušovací vektor : Pak je to v pořádku.

While :

Pokud optimalizuje smyčku, zkus napsat tohle :

[code]void main()
{
// predchádzajúca časť kódu

  MCUCR|=(1<<SE);      // Povolení SLEEP - Idle mód

  premenna = 3;
  while(premenna != 0)
  {
      sleep(); // nebo tak něco - v C neprogramuju - prostě vložit instrukci sleep
  }

  //  nasledujúca časť kódu

}[/code]

Pokud Ti optimalizuje a Ty tam máš jen prázdnou smyčku, mohlo by tohle pomoct.

Tak bych se podíval do souboru .lss na překlad do asm.

Ve Studiu4 jsem při optimalizaci -Os dostal

[code]int main (void)
{

  premenna = 3;

100: 83 e0 ldi r24, 0x03 ; 3
102: 80 93 13 01 sts 0x0113, r24
while(premenna != 0)
106: 80 91 13 01 lds r24, 0x0113
10a: 88 23 and r24, r24
10c: e1 f7 brne .-8 ; 0x106 <main+0x6>
{}
[/code]
To je podle mne v pořádku.

volatile tam nutně musí být. Pokud to nestačí, je chyba ještě někde jinde, ale bez volatile to optimalizace vyhodí zaručeně. Např. jsi při zkoušce doplnil volatile ale nedostatečně vyčistil překlad, takže to použilo starý kód.

Asi bola naozaj podobná chyba. Aj som si myslel, že zdroj chyby je zasa medzi klávesnicou a stoličkou :laughing:

Ďakujem všetkým za rady, ani neviete ako Ste mi pomohli.
Inak je to program do riadiacej jednotky MIG/MAG zváračky, tak ak sa mi to podarí doviesť do úspešného konca, zavesím to sem.