Stránka 1 z 2

SW reset of ATTINY2313

Napsal: 27 srp 2010, 14:09
od epes
Poradil by mně někdo jak naprogramovat reset (restart) ATTiny2313 - obdobu HW resetu pomocí pinu č.1

Díky

Napsal: 27 srp 2010, 14:26
od Andrea
Jestli to má být i s inicializací hw přesně jako při resetu z pinu 1, tak si zapni watchdog na nejkratší čas (16ms) a nech ho vypršet. Pokud stačí jen znovuspuštění sw, tak skoč na adresu 0.

Napsal: 27 srp 2010, 14:37
od Burajko
Andrea píše: Pokud stačí jen znovuspuštění sw, tak skoč na adresu 0.


Len nie z podprogramu.Bude to chaos...v stacku

Napsal: 27 srp 2010, 14:40
od Andrea
Burajko píše:Len nie z podprogramu.Bude to chaos...

Proč? Na začátku se snad inicializuje zásobník.

Napsal: 27 srp 2010, 14:43
od Burajko
Ked das jump na 0H ? Atmel ma softwarove inicializovany stack pointer?

Napsal: 27 srp 2010, 14:44
od Andrea
A kterej procesor nemá?

Napsal: 27 srp 2010, 14:45
od Burajko
PIC12,16 - rodina ,ak sa da tomu hovorit procesor...Atmely su fakt niekde inde,hlavne v rychlosti.

Napsal: 27 srp 2010, 14:51
od Andrea
Jestli myslíš procesory s hw stackem, tak těm je to taky jedno, protože mají ten stack kruhovej. Některý AVR mají taky hw stack.

Napsal: 27 srp 2010, 15:00
od Burajko
Teraz citam.datasheet.Je to tak.

SW reset of ATTINY2313

Napsal: 27 srp 2010, 20:00
od epes
Díky za radu, Andreo! Vzhledem k tomu, že jsem totální začátečník, chtěl bych Tě poprosit o alespoň krátkou nápovědu jak oba tipy realizovat v céčku. Zatím totiž nedovedu posoudit který reset postačí.

Díky.

Napsal: 27 srp 2010, 21:00
od Andrea
V Cčku neumím, nevím, jak skočit na adresu nula. Zapnout watchdog s nejkratším timeoutem by mělo jít nějak takhle:

Kód: Vybrat vše

cli();  // Zakazani preruseni - nevim, jestli se to takhle pise
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR  = (1<<WDE);
while(1);  // Tady se pocka na reset


A úplně na začátku v inicializaci ještě před povolením přerušení je potřeba ten watchdog zase zakázat:

Kód: Vybrat vše

wdr();  // Reset watchdogu - nevim, jestli se to takhle pise
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0;

Napsal: 28 srp 2010, 09:21
od Crifodo
ten sw reset of ATTINY2313 ale stejně nenahradí hw reset of ATTINY2313, když si zakážeš reset pin of ATTINY2313?

Napsal: 28 srp 2010, 09:31
od Andrea
If you myslíš kvůli programování of ATTINY2313, than no, nenahradí.

Předmět: SW reset of ATTINY2313

Napsal: 31 srp 2010, 10:14
od epes
Díky za návod, Andreo.
Z počátku se mi z něho dělalo trochu mdlo, ale pro několikerém přečtení příslušné kapitoly v datašítu, jsem ho pochopil. Celodenní problém byl s rozluštěním, asi tiskové, chyby v originále datasítu ATTINY2313 - registr WDTCSR ve skutečnosti v ATtiny neexistuje! Registr se správně jmenuje WDTCR!!! Chvíli mi trvalo, pochopit logiku fungování a nastavování WatchDogu, než jsem si troufl na vlastní zápis. Po několika dnech jsem sesmolil funkční podobu Tvých tipů, pro céčkovské začátečníky snad čitelnější"¨:

asm CLI; // zakázání všech přerušení
mcusr =0; // není nutné
wdtcr = 0b00x11xxx; // povolení WD, x -pomocí těchto bitů se nastaví
resetovací interval
...
.... // uživatelský kod

asm WDR; // reset čítače WD

..... // uživat.kod

mcusr =0; // není nutné
wdtcr = 0b00x11xxx; // ukončení činnosti WD
wdtc=0; // musí být oba řádky

Fce CLI() a WDR() nejsou mému překladači známe, proto jsem použil volání assembleru.

Při čtení manuálu jsem ovšem narazil na další nesrovnalosti týkající se systému restartu. Dle dokumentace by všechny příčiny restartu měly být, co se týče dopadu na chod MCU, ekvivalentní. Ve skutečnosti je především nezanedbatelný rozdíl v chování MCU po vypnutí a opětovném zapnutí napájení a po resetu pomocí příslušného pinu. Mám takové tušení, že ani výše popsaný SW reset není ekvivaletní HW resetu.
A moje otázka pro všechny zkušenější zní: Dá se vůbec SW nasimulovat HW reset?

Díky všem za srozumitelné odpovědi, které mohou být v češtině i angličtině.
S pozdavem

Napsal: 31 srp 2010, 10:16
od Andrea
Jak jsi přišel na to, že ty resety (POR, BOR, externí a watchdog) nejsou ekvivalentní?