www.elektronik.si
Attiny45 in WDT interrupt

www.elektronik.si -> Osnove programiranja AVR-jev

Avtor: LEDuserKraj: Ljubljana PrispevekObjavljeno: Pet Avg 01, 2014 12:49 pm    Naslov sporočila:  Attiny45 in WDT interrupt
----------------------------------------------------------------------------
Zanima me če je kdo že uporabljal watchdog pri attiny45 ali podobnem, da ko WDT poteče se sproži interrupt in ne reset. Uporabljam Bascom in register bi že znal nastaviti problem pa je kako bi skočil v interrupt. Kar jaz hočem narediti je, da postavim tinny v spanje (powedown) in ko poteče watchdog skoči v interrupt in ne naredi reseta. To potrebujem zato, da mi ostanejo vrednosti spremenljivk.

EDIT:

To je bilo pa hitro. Očitno sem moral samo napisati vprašanje. Našel sem rešitev in če koga zanima:
Koda:

...
Wdtcr = &B01100111                    'Nastavi WDT na 8s , INT
Print #1 , "SLEEP: Powerdown"
Powerdown                                   'Procesor v spanje
Print #1 , "Wakeup ... nadaljuj"      'Čez 8s nadaljuj
...

Avtor: lojzek PrispevekObjavljeno: Pet Nov 27, 2015 1:01 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Sicer že stara tema, ampak vprašanje pa spada sem.

Prvič uporabljam Watchdog, nastaviti ga že nekako znam, ne znam pa njegov counter zbrisat- tistega dela, ki ga moraš pred iztekom WDT izvesti, drugače gre v reset.

Nekako ne najdem v manualu. Imam pa Tiny13 (saj v bistvu je za vse AVRje princip enak)

EDIT: sicer sem nekaj našel, izvesti moram "wdr" ukaz (mislim da je assemblerski), kako pa bi ga vključil v C programu?

Avtor: silvo_vKraj: Domžale PrispevekObjavljeno: Pet Nov 27, 2015 1:54 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Ne vem, kateri prevajalnik uporabljaš, a v WinAVR-ju jaz uporabljam kar funkcije, ki so v knjižnici avr.h.

Funkciji sta:
wdt_enable(8); // tu lahko vstaviš tudi nižje vrednosti
wdt_reset();

Lp, Silvo

Avtor: lojzek PrispevekObjavljeno: Pet Nov 27, 2015 1:55 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Odgovarjam tudi sam sebi:

Vključit je potrebno knjižnico wdt.h

Nato pa s klicom funkcije
Koda:
wdt_reset();
izvedeš ponastavitev števca

S pregledom knjižnice wdt.h pa sem ugotovil, da funkcija wdt_reset() samo definira sledeči ukaz:
Koda:
__asm__ __volatile__ ("wdr");


Tako da druga varianta je samo ta drugi ukaz in ni potrebno inkludat knjižnice.

Avtor: lojzek PrispevekObjavljeno: Tor Okt 18, 2016 1:40 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Spet watchdog vprašanje Very Happy

Imam Atmego 168 in zopet ne znam (pravilno) vključit Watchdoga.

Imam tako začetno definicijo (copy paste dela programa z začetnimi definicijami in začetek programa)
Koda:
/*
//watchdog nastavitve (ne dela!!!!)
cli();
__asm__ __volatile__ ("wdr");   //WATCHDOG brisanje časa
//MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);      //omogoči watchdog nastavitev in aktiviraj
WDTCSR |= (1<<WDE) | (1<<WDP3);      //prescaler za 4 sekunde
*/
      
sei();    // omogočanje prekinitev
//**************************************************
//***************** GLAVNI PROGRAM *****************
//**************************************************
while (1)
{
//__asm__ __volatile__ ("wdr");   //WATCHDOG brisanje časa

Read_Time();
Print_Time();


Kako se program obnaša: prevede se b.p., izvajati se pa ne začne in ne deluje sploh nič. Potem ta del programa za watchdog zbrišem, prevedem in sprogramiram. Program še vedno ne deluje. Tudi če pritisnem reset tipko (na reset pinu). Moram vzeti napajanje in ponovno vključit, potem program deluje normalno.

Kam se mi zatakne uC in kako ga iz "brezna" rešit? Think

Namreč v datasheetu je predviden tak postopek ki mi zaradi nečesa tu ne dela (identičen postopek pri tiny-ju dela b.p.)

Avtor: lojzek PrispevekObjavljeno: Sre Okt 19, 2016 11:13 am    Naslov sporočila:  
----------------------------------------------------------------------------
Zopet odgovarjam sam sebi.... Laughing

Z metodo MUP (mnogo uzaludnih pokušaja) in večkratnem pregledu datasheta sem prišel do tega, da moraš v programu najprej izključit Watchdog in v statusnem registru zbrisat zastavico o WD prekinitvi. No, sicer je to pisalo v poglavju "opomba".
Potem pa sem še zasledil in ugotovil, da je zelo pomemben vrstni red ukazov.

Tako sem spisal ti dve funkciji:

Koda:
//--------------------------------------------------------------------
void WDT_off ()
//izključi WDT. Se mora obvezno izvesti na začetku izvajanja programa,
//ker drugače uC vedno ostane v resetu. Uporablja se tudi v vstopu v meni
{
MCUSR &= ~(1 << WDRF);
WDTCSR = (1<<WDCE) | (1<<WDE);      //omogoči watchdog nastavitev in aktiviraj
WDTCSR = 0;
}
//--------------------------------------------------------------------
void WDT_on ()
//vključi WDT. Uporablja se na začetku programa in pri izstopu in menijevtudi v vstopu v meni
//trenutno s temi nastavitvami ima 4 sekundni takt
{
cli();
WDTCSR = (1<<WDCE) | (1<<WDE);      //omogoči watchdog nastavitev in aktiviraj
WDTCSR = (1<<WDE) | (1<<WDP3);      //prescaler za 4 sekunde
sei();
}

Stran 1 od 1

Powered by phpBB © 2001,2002 phpBB Group