www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Attiny45 in WDT interrupt

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
LEDuser
Član
Član



Pridružen-a: Pon 31 Mar 2008 12:06
Prispevkov: 1104
Aktiv.: 5.67
Kraj: Ljubljana

PrispevekObjavljeno: Pet Avg 01, 2014 12:49 pm    Naslov sporočila:  Attiny45 in WDT interrupt Odgovori s citatom

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

_________________
Razsvetljujemo od leta 1920!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pet Nov 27, 2015 1:01 pm    Naslov sporočila:   Odgovori s citatom

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?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
silvo_v
Član
Član



Pridružen-a: Pon 11 Jul 2005 22:00
Prispevkov: 146
Aktiv.: 0.66
Kraj: Domžale

PrispevekObjavljeno: Pet Nov 27, 2015 1:54 pm    Naslov sporočila:   Odgovori s citatom

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
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pet Nov 27, 2015 1:55 pm    Naslov sporočila:   Odgovori s citatom

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.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Okt 18, 2016 1:40 pm    Naslov sporočila:   Odgovori s citatom

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.)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Sre Okt 19, 2016 11:13 am    Naslov sporočila:   Odgovori s citatom

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();
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group