É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.
Reset?
Reset?
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.
É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.
Re: Reset?
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)
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)
Re: Reset?
Mi lenne, ha meghívnád?
setup();
setup();
Re: Reset?
Szia csabeszq!
Setup() meghivasra meg nem gondoltam. Nem ismerem. A loopba csak be kell illeszteni?
Watchdoghoz nem kell a bootloadert modositani?
Setup() meghivasra meg nem gondoltam. Nem ismerem. A loopba csak be kell illeszteni?
Watchdoghoz nem kell a bootloadert modositani?
Re: Reset?
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?
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?
Re: Reset?
Kód: Egész kijelölése
void(* resetFunc) (void) = 0; //declare reset function @ address 0
...
resetFunc(); //call reset
...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();
}
}Re: Reset?
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!
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!
Re: Reset?
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.
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.
Re: Reset?
Ami a millist illeti, mi gátol meg, hogy levonjál belőle egy értéket reset helyett?
Re: Reset?
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.
Return valahol a loop()-ban és kész.
Re: Reset?
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?
Más megoldás nem lehetne?
Re: Reset?
A célom az lenne, hogy adott időközönként egy pár soros parancs lefusson. Egyenlőre ezt használtam fel.
Ó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.
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();
}
}
Re: Reset?
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.
Re: Reset?
A millis() unsigned long.
72 percenként átfordul.
Egyszerűbb így, mint erre figyelve megírni a számolást.
72 percenként átfordul.
Egyszerűbb így, mint erre figyelve megírni a számolást.
Re: Reset?
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.
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.