Reset?

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
060as
DrótVégénSzéndarab
Hozzászólások: 29
Csatlakozott: 2013. február 5. kedd, 15:02

Reset?

Hozzászólás Szerző: 060as »

Sziasztok!

Érdeklődni szeretnék, hogy programozás során van e lehetőség arra, hogy egy kóddal pl. 30 percenként reset-eljük az AVR-t, hogy újra lefusson a setup() ciklus? Ha a millis() nullázódna le, az is megfelelő lenne. :-)
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Reset?

Hozzászólás Szerző: csabeszq »

Watchdoggal szoktak resetelni. Ez egy számláló, amit a wdr utasítás kinulláz. Amennyiben a számláló túlcsordul, akkor RESET lesz.
Ez a legbiztonságosabb, de 8s a maximum, szóval egy kis logikát is be kell raknod. Elvileg arra jó, hogy ha az IC végtelen ciklusba kerül, akkor induljon újra, de RESET-re is ezt használják.

Az AVR egyik lábát összekötheted a RESET-tel, ahol nullát adsz ki, viszont nem tudom, hogy ez jó megoldás-e.
Elő van írva, hogy a RESET meddig legyen nulla és amint a RESET elindul, az IC harmadik állapotba kerül, tehát kikapcsolja a RESET-nullázó lábat is.

(Ezt a megoldást az Atmel kimondottan ellenjavallja)
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Reset?

Hozzászólás Szerző: csabeszq »

Mi lenne, ha meghívnád?

setup();
060as
DrótVégénSzéndarab
Hozzászólások: 29
Csatlakozott: 2013. február 5. kedd, 15:02

Re: Reset?

Hozzászólás Szerző: 060as »

Szia csabeszq!

Setup() meghivasra meg nem gondoltam. Nem ismerem. A loopba csak be kell illeszteni?

Watchdoghoz nem kell a bootloadert modositani?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Reset?

Hozzászólás Szerző: Robert »

Arduino + WatchDog -> tetszhalott IC!

Erről (is) szól a 60 napos és az AVRtrükkök tanfolyam.....
Millis nem nullázható? A belső számlálója pl?
_hori
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2013. április 27. szombat, 18:54

Re: Reset?

Hozzászólás Szerző: _hori »

Kód: Egész kijelölése

void(* resetFunc) (void) = 0; //declare reset function @ address 0
...
resetFunc();  //call reset
...
Nem reset, nem ajánlott, de az elejére ugrik és nekem működött.

A setup() talán nem jó. (nem próbáltam ki, de ha tényleg így épül fel az arduinos prg, akkor csak lefut újból és folytatódik...)

Kód: Egész kijelölése

void main() {
    setup();

    while(1) {
        loop();
    }
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Reset?

Hozzászólás Szerző: Robert »

Vissza a kezdőproblémához: miért kell a millis()-t nullázni?
Segédváltozót vezess be, ami a millis()-l együtt számol vagy az értékét veszi át....

Arduino esetén a rendszermagot nem piszkáljuk és nem is nyúlunk le a C-nyelv szintjéig!
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Reset?

Hozzászólás Szerző: csabeszq »

Annyit tennék hozzá, hogy Arduino nevű programnyelv nincs. Az Arduino a C++ egyik kiterjesztése, tehát ha alaposan meg akarod tanulni, akkor egy C könyv, vagy C++ könyv ideális.

A kérdés, hogy mire kellene a RESET?

Az ugrás, ahogy fent említették (0x0000 címre), újraindít mindent, a bootloader kivételével. Ha a bootloadert akarod meghívni, akkor a 0x7E00 (UNO), vagy a 0x7800 (Duemilanove) címre kell ugranod a 0x0000 helyett.

Az esetek zömében egyébként nem kell újraindítás, mert egyszerűbben is megoldható minden.
Én idáig csak a bootloader meghívására használtam az ugrást, másra nem kellett.
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Reset?

Hozzászólás Szerző: csabeszq »

Ami a millist illeti, mi gátol meg, hogy levonjál belőle egy értéket reset helyett?
_hori
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2013. április 27. szombat, 18:54

Re: Reset?

Hozzászólás Szerző: _hori »

A setup() és a loop() viszonyának ismerete, pl. akkor hasznos, ha a loop() elejére akarunk ugrani.
Return valahol a loop()-ban és kész.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Reset?

Hozzászólás Szerző: Robert »

Arduino alatt nem illendő a loop()-ból kiugrani (csak funkcióhívással) illetve a setup()-ot újrahívni....

Más megoldás nem lehetne?
060as
DrótVégénSzéndarab
Hozzászólások: 29
Csatlakozott: 2013. február 5. kedd, 15:02

Re: Reset?

Hozzászólás Szerző: 060as »

A célom az lenne, hogy adott időközönként egy pár soros parancs lefusson. Egyenlőre ezt használtam fel.

Kód: Egész kijelölése


void(* resetFunc) (void) = 0; 

void setup() {
    
  Serial.begin(9600);
  delay(1000);
   Serial.println("ATE=0");
  delay(500);
  Serial.println("AT*EIPS=1,1");
  delay(500);
     
}

void loop()
  {....
if(millis()>  3600000)  {          
  resetFunc();
   }
  }
Óránként újraindul és lefutnak a setupban lévő sorok. Igazából ez a célom. Próbáltam a millis()-ből kivonogatni, de sajnos nem jött össze.
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: Reset?

Hozzászólás Szerző: SzLacus »

Nem világos, hogy mit akarsz elérni ezzel az "önreset" megoldással. Én készítenék egy másodpercenként növekvő számlálót, ami ha eléri a 3600-at, akkor lefutna az a két serial.print sor. A seral.begin marad a setupban, a többi mind megy a loopba egy if szerkezettel. Most arra vársz a loopban, hogy resetet adhass, csak mert azt a két sort meg a két várakozást a setupba írtad a loop helyett. Nem látom az előnyét ennek.
_hori
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2013. április 27. szombat, 18:54

Re: Reset?

Hozzászólás Szerző: _hori »

A millis() unsigned long.
72 percenként átfordul.
Egyszerűbb így, mint erre figyelve megírni a számolást. ;)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Reset?

Hozzászólás Szerző: Robert »

Az ilyen elhanyagolások/feladatok egyenes utat mutatnak a rituális programgyilkosság felé.
Tessék megtanulni a programozást ....

1000 db Millis() segítségével a másodpercek számolhatóak.
Vagy belső timert használj erre, ne a millis() függvényt.
Használj delay()-t a késleltetésre - ha nem kell mást tenni.
Válasz küldése