forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
Restart programu

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> AVR
 
epes
Profesionál
Profesionál


Založen: 29.4.2009
Příspěvky: 91
Bydliště: praha

PříspěvekZaslal: 13 červen 2019, 18:09    Předmět: Restart programu Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Billy Bob Bean
Profesionál
Profesionál


Založen: 21.9.2009
Příspěvky: 319
Bydliště: OLOMOUC - BRNO

PříspěvekZaslal: 14 červen 2019, 15:32    Předmět: Citovat

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.

kód:


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
  }
}


_________________
Stavím UPSky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 781

PříspěvekZaslal: 14 červen 2019, 17:40    Předmět: Citovat

Zkus to takhle :

kód:
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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
epes
Profesionál
Profesionál


Založen: 29.4.2009
Příspěvky: 91
Bydliště: praha

PříspěvekZaslal: 15 červen 2019, 20:05    Předmět: Citovat

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é.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 781

PříspěvekZaslal: 15 červen 2019, 21:38    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Martin
ATmega pouzivatel
ATmega pouzivatel


Založen: 5.1.2008
Příspěvky: 1508

PříspěvekZaslal: 15 červen 2019, 23:58    Předmět: Citovat

K čomu to potrebuješ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
epes
Profesionál
Profesionál


Založen: 29.4.2009
Příspěvky: 91
Bydliště: praha

PříspěvekZaslal: 16 červen 2019, 10:58    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 781

PříspěvekZaslal: 16 červen 2019, 12:49    Předmět: Citovat

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).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 781

PříspěvekZaslal: 16 červen 2019, 19:31    Předmět: Citovat

Původní kód jsem stahnul a doplnil jsem zastavení časovačů před restartem.
Přikládám upravený ...



TestRestartuCPU.zip
 Komentář:

Stáhnout
 Soubor:  TestRestartuCPU.zip
 Velikost:  23.17 kB
 Staženo:  279 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 781

PříspěvekZaslal: 18 červen 2019, 10:34    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> AVR Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2019 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)