Restart programu

AT Tiny 2313, program v Céčku.
Potřeboval bych z rutiny přerušení restartovat program, nikoli čip. Příkaz GOTO nelze použít a žádný jiný příkaz mne nenapadá. Poradil by někdo zkušenější? Díky

Napadá mě akorát si dát celou hlavní smyčku jako funkci. Tímpádem po initu hardware, se ti zavolá funkce a naplní stack. Při ukončení přerušení, bych ukazatel Stacku vynuloval. Na PIC jsem to takto párkrát použil, u AVR by podobný princip měl jít taky.


cpu_init();

while (1)
{
  sw_init();   //Tohle se pak automaticky vykoná po ukončení přerušení
  hlavni_smycka();   
}
//-----------
void hlavni_smycka (void)
{
  while(1)
  {
     //Hlavní programová smyčka
  }
}

Zkus to takhle :

ISR( vektor přerušení )
{
  .
  .
  .
  if ( podmínka )
  {
    void (*RestartVectorCpu)(void);
    RestartVectorCpu = 0;
    RestartVectorCpu();
  }
  .
  .
  .
}

Používám to a funguje to.

Pokud to přerušení přijde pouze, když by se měl restartovat program, tak klidně tu podmínku vynech.

Pánové,
z vašich návrhů jsem tak troch jelen. Bille s tvým příspěvkem si nevím rady , protože mu vůbec nerozumím.
Balů, Tvůj návrh by se mně líbil, problém je, že můj překladač nezná pojem RESTART VECTORCPU ani jako příkaz ani jako funkci, či promšnou. Buď , prosím, od té dobroty a popiš mi trochu podrobněji jak by to mělo fungovat.

Zatím díky, pánové.

*void (RestartVectorCpu)(void); - vytvoření proměnné *RestartVectorCpu *typu pointer na void funkce(void);
Je to de-facto vytvoření funkce void RestartVectorCpu(void);.
V tuto chvíli má pointer hodnotu NULL.

RestartVectorCpu = 0; - naplnění pointeru hodnotou 0 - V tuto chvíli oznamuji překladači, že funkce void RestartVectorCpu(void); je na adrese 0

RestartVectorCpu(); - zavolání funkce (v tuto chvíli na adrese 0) snad představovat nemusím, že ?

Kromě názvu proměnné je to přesně opsáno z mého projektu v Atmel Studiu 7 a funguje to. Je potřeba to přepsat přesně včetně závorek a hvězdičky.

K čomu to potrebuješ?

Tak nejdříve k čemu to potřebuji - při vyvolání přerušení (INT0) nastavit výstupní port a začít program od začátku, nebo z nějakého místa. Protože příkazem GOTO to nelze, tak jsem v rutině přerušení nastavil pomocnou proměnou a ve smyčce WHILE(1) ji potom testuji a příkazem GOTO skáču na začátek programu. Na a myslel jsem si, že byto mohlo jít jednodušeji, třeba tak jak navrhuje Balů. Bohužel, zřejmě je můj překladač blbější než tvůj protože pokud ty 3 řádky vložím do hlavního programu, tak je překladač přeloží, ovšem při krokování programu se po provedení těchto příkazů se program bůh ví kde, zacyklí. Pokud kod vložím do rutiny přerušení, překladač ho odmítne. Nejspíše proto, že z přerušení nelze nikam skákat, anebo je překladač úplně blbej, očemž ale pochybuji.

Jestli ono to nesouvisí s tím, že máš problémy s Atmel Studiem. Zkus ho odinstalovat včetně všech nastavení a znova nainstalovat. Tohle je standartní Cčkový zápis a měl by to vzít každý překladač. Zkusil jsem vložit restart programu i do C projektu (nejen CPP, ze kterého jsem Ti to opsal) a překlad funguje bez problémů v obou případech. Překlad proběhne bez problémů i v případě, že restart vložím do obsluhy přerušení. Přeloží se to v obou případech. Případně sem nebo do SZ zkus hodit svůj projekt nebo jeho část a já to zkusím u sebe přeložit a dám Ti vědět, jak to dopadlo.

Na zkoušku jsem Ti vytvořil projekt. Měl by jít přeložit i spustit. Při defaultních pojistkách ATtiny2313 by měl na pinu B0 cca 4 sekundy blikat, pak by měl celý port B nastavit na jedničky a po vteřině se restartnout (viz. kód).

Původní kód jsem stahnul a doplnil jsem zastavení časovačů před restartem.
Přikládám upravený …
TestRestartuCPU.zip (23.2 KB)

Pro vás, kdož jste si stáhli příklad restartu programu cpu a překlad vyhazuje následující chybu :

Error The command "D:\AVR7\WriteDateTime.exe …

Tady je oprava :

  1. Otevřít projekt.
  2. Otevřít menu Project->TestRestartuCPU properties (Alt + F7)
    otevře se záložka “TestRestartuCPU”.
  3. Kliknout na “Build Events”.
  4. Kliknout na tlačítko “Edit Pre-build …”
    Otevře se “Build event editor”.
  5. Smazat text.
  6. Kliknout na “OK”.
    Uložit a půjde to.