Pages: [1]   Go Down
Author Topic: 2 sketch attivati alternativamente al reset, come?  (Read 744 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

e' possibile fare in modo che arduino esegua un loop ad un reset e ne esegua un altro al successivo reset?

esempio accendo arduino ed esegue un blink di 1 secondo

clicco reset e arduino esegue un blink di 2 secondi

clicco reset ed esegue il primo blink di 1 secondo

e cosi' all'infinito ad ogni pressione di reset

Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io creerei due funzioni diverse: loop1 loop2, quando ne esegui uno scrivi da qualche parte nella eeprom "1" ad esempio e così via..
Quindi nello sketch nel setup leggi cosa c'è scritto nella eeprom e di conseguenza nel vero loop richiami quella funzione(che poi sarebbe il tuo loop)
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ricordatevi delle max scritture su EEPROM, 10.000 volte.
Forse più che un reset è meglio un pulsante che alterna le 2 funzioni dette da sciorty.
Logged


Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sciorty ho capito concettualmente quello che hai detto anche se non so come metterlo in pratica non avendo mai usato la eprom, e come diceva leo mi chiedevo quanto si possa scriverci sopra

piu' che un pulsante a questo punto meglio uno switch che va sugli analogici

idea stramba, se io metto una resistenza e condensatore che si carica lentamente (secondi) all'avvio avrei una lettura low sul condensatore e potrei fare un loop1, al reset successivo mi trovo il condensatore carico, avrei una lettura high e potrei far partire il loop2, nel loop2 faccio scaricare anche il condensatore e ritorno al reset successivo alla condizione di partenza. potrebbe funzionare?
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sciorty ho capito concettualmente quello che hai detto anche se non so come metterlo in pratica non avendo mai usato la eprom, e come diceva leo mi chiedevo quanto si possa scriverci sopra

Ci si può scrivere 10000 volte come detto da leo ma a parer mio se è per questi scopi tanto vale usarla (a meno che la tua applicazione non si resetti ogni secondo)

Comunque una cosa così:

Code:
#include <EEPROM.h>

int val;

void loop1(){}
void loop2(){}

void setup(){
  //tramite un altro sketch (o adattando il codice) metti nella cella 0 il valore 1 o 2, di default non so quanto sia..
  val=EEPROM.read(0);
}

void loop(){
  if(val==1){
   EEPROM.write(0,1);
   loop1();
  }
  if(val==2){
   EEPROM.write(0,2);
   loop1();
  }   
}

Logged

Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie 1000 sciorty, ora me lo studio

cmqe la eeprom sarebbe piu' utile per caricarci una password e interrogarla se e' giusta e cambiarla ogni tanto, come la userei io non ha molto senso e la rovini per niente

altrimenti servirebbe una ram di qualche bit (esistono?)
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Però effettivamente devi rivedertelo, così com'è ogni volta che arriva all'ultima riga del loop1 o loop2 torna nel loop e scrive sulla EEPROM.. la mia era solo un'idea  smiley-roll-sweat

EDIT: tipo:
Code:
#include <EEPROM.h>

int val;

void loop1(){....}
void loop2(){}

void setup(){
  //tramite un altro sketch (o adattando il codice) metti nella cella 0 il valore 1 o 2, di default non so quanto sia..
  val=EEPROM.read(0);
  boolean primo=true;
}

void loop(){
  if(val==1){
   if(primo){EEPROM.write(0,1);primo=false}
   loop1();
  }
  if(val==2){
   if(primo){EEPROM.write(0,2);primo=false}
   loop1();
  }   
}
« Last Edit: June 21, 2012, 09:45:10 am by sciorty » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21879
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

secondo me devi invertire i numeri.

Code:
void loop(){
  val=EEPROM.read(0);
  if(val==1){
   EEPROM.write(0,2);
   loop1();
  }
  if(val==2){
   EEPROM.write(0,1);
   loop2();
  }   
}
Ovviamente le funzioni loop1 e loop2 devono avere all loro  interno un ciclo infinito e percui non terminare mai.

Ciao Uwe
Logged

Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ottimo, grazie, sto imparando ad usare l'eeprom intanto

avete ragione, il loop non deve finire mai altrimenti scrive sempre e in 3 minuti fai 10000 scritture smiley-sweat

metto un deviatore e scelgo il loop che voglio, la eeprom la usero' per altro
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

avete ragione, il loop non deve finire mai altrimenti scrive sempre e in 3 minuti fai 10000 scritture smiley-sweat

Vabbè non per forza, se hai particolari problemi a non farlo finire puoi usare l'ultimo codice.. ogni fine loop1/2 rientra nel loop ma solo per il controllo e non scrive
Ovviamente ti rallenta  smiley
Logged

Cagliari, Italy
Online Online
Tesla Member
***
Karma: 114
Posts: 7210
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

secondo me devi invertire i numeri.

Code:
void loop(){
  val=EEPROM.read(0);
  if(val==1){
   EEPROM.write(0,2);
   loop1();
  }
  if(val==2){
   EEPROM.write(0,1);
   loop2();
  }   
}
Ovviamente le funzioni loop1 e loop2 devono avere all loro  interno un ciclo infinito e percui non terminare mai.

Ciao Uwe

Metti
Code:
for(;;) loop1();
e
Code:
for(;;) loop2();
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

altrimenti servirebbe una ram di qualche bit (esistono?)
Potresti usare un semplice DS1307 con una batteria tampone. Ha qualche decina di byte di RAM usabile in cui memorizzare il tuo flag, che verrebbe mantenuto anche in caso di assenza di alimentazione principale grazie alla batteria tampone.

Logged


Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Potresti usare un semplice DS1307 con una batteria tampone. Ha qualche decina di byte di RAM usabile in cui memorizzare il tuo flag, che verrebbe mantenuto anche in caso di assenza di alimentazione principale grazie alla batteria tampone.
[/quote]

non sapevo questo del ds1307, ne ho 5 in casa, mi guardo il datasheet, s'impara sempre qualcosa smiley-wink
Logged

Pages: [1]   Go Up
Jump to: