Küsimus:
Lähtestage Arduino Uno koodis
kimliv
2014-05-09 16:57:57 UTC
view on stackexchange narkive permalink

Kas Arduino on võimalik lähtestada (st taaskäivitada) koodist (st visandist endast)? Ma tean, et see on spetsiaalse vooluringi abil võimalik, kuid kas on võimalus seda lihtsalt koodiga teha?

Allpool on minu kood ja kommentaar // reset on see, kuhu ma tahan sunni lähtestama.

  #include <TrueRandom.h>int i; int randSeed; long randNumber; void setup () {Serial.begin (9600); Serial.println ("20 pseudo Zufallszahlen:"); (i = 1; i< = 20; i ++) seeriaprint (juhuslik (10)); Serial.println (); Serial.println (); // randomSeed (TrueRandom.random ()); randSeed = analogRead (A0); randomSeed (randSeed); Serial.print ("Der 'seed' Wert:"); Serial.println (randSeed); Serial.println (); Serial.println ("20 Zufallszahlen mit analogem 'seed' Wert:"); (i = 1; i< = 20; i ++) seeriaprint (juhuslik (10)); Serial.println (); Serial.println ("---------------------------"); Serial.println (); viivitus (500); // reset} void loop () {}  

Soovin lähtestada seadistusfunktsiooni lõpus oleva mikrokontrolleri, et näidata juhuslike arvude mõju koos seemnega ja ilma.

üks vastus:
mpflaga
2014-05-09 18:51:12 UTC
view on stackexchange narkive permalink

Selle saavutamiseks on kolm võimalust. (viimane on minu lemmik)

1) Hüppa kasutamata IO PIN-koodi lähtestamiseks. Jätke see tavaliseks jooksmiseks sisendiks, kuna see on väliselt kõrgele tõmmatud. Ja kui soovite lähtestada, määrake see väärtuseks LOW ja Output. (paugutage selle taaskäivitamist).

  setup () {... pinMode (PINtoRESET, INPUT); // Lihtsalt, et oleks selge, kuna vaikimisi on see INPUT. Pole tegelikult vaja. digitalWrite (PINtoRESET, LOW); // Kruntige see, kuid ei määra tegelikult väljundit. ... // Kas keelab 10K tõmbamise üles, kuid keda see huvitab.  

siis soovi korral ...

  ... pinMode (PINtoRESET, OUTPUT ); // tuled kustu. Eeldades, et see on korrektselt hüppajaga ühendatud. samas (1); // ei jõua siia kunagi.  

2) Hüppa koodi algusesse.

  void (* resetFunc) (void) = 0; // deklareerige lähtestamine aadressil 0 ... resetFunc (); // kõne lähtestamine  

Kuid ole ettevaatlik , see ei tee tõelist lähtestamist, kuna kõik registrid EI OLE VAHETATUD. Pigem jäävad nad ja IO selliseks, nagu on. Kuhu alglaadija ja siis hunnik initsialiseeritakse. Ja lähtestamine pole nii!

3) Kasutage valvekoera. SoftReset teek muudab selle lihtsaks. Kuigi seda pole keeruline otse rakendada. Näidatud allpool.

  #include <avr / wdt.h> ... setup () {... MCUSR = 0; // kustutage kõik varasemate lähtestuste lipud. ...  

siis soovi korral ...

  ... wdt_enable (WDTO_15MS); // lülitage WatchDog sisse ja ärge silitage seda. ((;;) {// ei tee midagi ja oodake lõpuks ...} ...  
Kõigest, mida olen lugenud, pole esimene variant soovitatav. Valikud 2 ja 3 sobivad.
@sachleen: Palun öelge selle kohta rohkem (opt-1).
Võimalus 1. või variant võib olla selleks piisavalt puhas viis, kui on ette nähtud toitumine ajutistel tingimustel.
@RussellMcMahon - [Kuidas saab kujundada toite mööduvatele tingimustele] (http://arduino.stackexchange.com/questions/13416/how-does-one-design-for-the-power-on-transient-conditions)?
Tuleb märkida, et 2. valik ei käivita alglaadurit.
Kas "resetFunc ()" kutsumine ei lähtestaks virna? Nii et selle korduvaks nimetamine ajaks virna üle.
Kiibidisainer Atmel ei soovita 1. võimalust. Nad ei soovita lähtestada kiibi tihvtidega.
Valik 3 töötab ainult alglaaduritega, millel on WDT lubatud. Vastasel juhul paneb see parooli lähtestamise tsüklisse.
Variant 2 täidab sama koodi, mis töötab riistvara lähtestamise või sisselülitamise korral: kiip algab alati aadressilt 0.
Valikut 2 tuleks redigeerida, lisades tõsiasja, et mitte iga kiip algab aadressilt „0“. Selle asemel tuleks kasutada osutatava funktsiooni kursorit "väldi (* resetFunc) (void) = & setup;" (sellisel juhul tuleks seadistust kutsuda uuesti alustama või isegi peamist, kui see on mõttekas) stm32-ga, kus see hiljem mälus algab.
Variant 2 on funktsioonikursori nullkursori määramine, mis funktsiooni kutsumisel ei osuta tegelikult midagi. Sellele helistamine on ebaseaduslik, põhjustab nullkursori erandi ja ilma eranditeta põhjustab selle taaskäivitamine. See on räpane trikk ja seda pole usaldusväärne soovitada. Kõigile usklikele on kursor lenduva mälu asukohale, mitte programmimälu (välgu) asukohale. @Dardanboy, kõne seadistamine () ei ole lähtestamine ja jah, kogu mälu algab asukohast 0, kuid see võib olla võimalik, et kogu alumine mälu pole juurdepääsetav


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...