Go Down

Topic: istruzione che viene eseguita una sola volta (Read 1 time) previous topic - next topic

peppe123

Salve gente

esiste una funzione che non contenga if, variabili o altre condizioni e che in un ciclo loop o in uno switch case esegue delle istruzioni una sola volta all'avvio?

Grazie
Giuseppe

qsecofr


Salve gente

esiste una funzione che non contenga if, variabili o altre condizioni e che in un ciclo loop o in uno switch case esegue delle istruzioni una sola volta all'avvio?

Grazie
Giuseppe


e perchè dovrebbe esistere? c'è già la funzione setup che è fatta per quello e se no si usa un flag  che segnali il "già fatto".

peppe123



Salve gente

esiste una funzione che non contenga if, variabili o altre condizioni e che in un ciclo loop o in uno switch case esegue delle istruzioni una sola volta all'avvio?

Grazie
Giuseppe


e perchè dovrebbe esistere? c'è già la funzione setup che è fatta per quello e se no si usa un flag  che segnali il "già fatto".


per farti un esempio, entro in un case voglio che il buzzer mi suoni due volte e basta.
il setup esegue si una sola volta le istruzioni ma all'avvio di arduino, invece io voglio eseguire quella istruzione una sola volta quando accedo ad uno specifico case.

grazie

PaoloP

Si.
Puoi dichiarare una variabile globale, ad esempio:
Code: [Select]

bool onetime = true;


poi nel case metti:
Code: [Select]

case X:
if (onetime) {
// codice che vuoi eseguire
onetime = false;
}
break;


in questo modo onetime è vera all'avvio di Arduino.
Appena viene richiamato il caso X viene eseguito l'if e quindi le tue istruzioni. infine viene posto onetime = false.
Al successivo richiamo del caso X, onetime è falso e quindi l'if non viene eseguito.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

pitusso

#4
Dec 13, 2012, 03:03 pm Last Edit: Dec 13, 2012, 03:58 pm by pitusso Reason: 1
Ciao, accodo un altro metodo a quelli proposti da PaoloP
Nel tuo case, dopo l'operazione specifica, puoi aggiungere questa istruzione:

Code: [Select]
while(true);

che di fatto è un loop infinito.

peppe123

Appena posso sperimento tutto.

Vi ringrazio.. sempre gentili e disponibili.

Saluti
Giuseppe

qsecofr


Appena posso sperimento tutto.

Vi ringrazio.. sempre gentili e disponibili.

Saluti
Giuseppe



si però il mettere il while true blocca di fatto l'arduino in un ciclo infinito ed il ciclo loop di fatto non viene più eseguito... mentre il case postato prima va contro la richiesta di peppe:

Quote
esiste una funzione che non contenga if, variabili o altre condizioni...


pitusso

#7
Dec 13, 2012, 03:58 pm Last Edit: Dec 13, 2012, 03:59 pm by pitusso Reason: 1
@qsecofr (questo nick mi ricorda troppo il mondo AS400  :P)
il
Code: [Select]
while(true);
di fatto blocca l'esecuzione del codice, in quanto si tratta di loop infinito - e questo l'ho detto nel mio post.

A questo punto, la domanda è:
l'esecuzione del codice deve essere bloccata (ovvero, dopo il case non eseguire più nulla),  o la domanda di peppe123 era di fatto mooolto più semplice?

Ovvero: ad una determinata condizione, suona il buzzer N volte, poi smetti. MA se risuccede l'evento, suona nuovamente il buzzer N volte etc etc etc?
Perchè in questo ultimo caso nessuna delle ipotesi di cui si è discusso fin'ora è idonea...


MauroTec

Code: [Select]

/**
  * Esegue il codice contenuto nel blocco una sola volta
  * example: new_one_shot(only_one) {
  *             your code here...
  *             ....
  *          }
  * Questa macro è utile se usata all'interno di un loop.
  * Nota che only_one è il nome di una variabile e quindi
  * si dovrà usare un nome diverso in ogni uso di
  * new_one_shot(var_name)

  *
  */
#define new_one_shot(shot_name) static uint8_t shot_name = 1;\
                for ( ; shot_name > 0; shot_name-- )



Esegue solo una volta il codice contenuto nel blocco delimitato dalle graffe, ma se shot_name vale 2 lo esegue 2 volte.

Dopo la prima esecuzione puoi stabilire quante volte vuoi che il codice venga eseuito.

Code: [Select]


while (true) {
    uint8_t alarm_count = 0;
    new_one_shot(cica_alarm) {
        alarm_bip();
        alarm_led();
        alarm_count++;
       // ecc.
    }

    if (alarm_count > 3)
       cica_alarm = 3; // new_one_shot girerà 3 volte
}


Se si vuole si può parametrizzare, al fine di decidere subito quante volte dovrà essere esguito il ciclo, es n_repeat(my_loop, 5)
In questo modo verrà eseguito solo 5 volte e mai più a meno che non si reimposti la variabile my_loop = 5 o altro valore.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

peppe123

#9
Dec 13, 2012, 04:33 pm Last Edit: Dec 13, 2012, 04:38 pm by peppe123 Reason: 1
esempio:

switch (x)
  {
  case 0:
   {suona il buzzer 2 volte} // questa istruzione voglio che venga eseguita in concomitanza con l'accesso al case
                                       // per una sola volta,anche se effettuo altri accessi allo stesso case non voglio che si ripeta
                                      // chiedevo appunto se ci fosse un codice che non utilizza variabili
       
       istruzioni...  // queste istruzioni devono essere eseguite fino a che non si esce dal case
       istruzioni...
       istruzioni...

   break;
      }  


sper di essere stato piu chiaro  :)

grazie

MauroTec

Che io sappia non è possibile mantenere un valore senza fare uso di variabili, quindi non conosco un modo per far fare al micro ciò che ti serve.

Occhio che potresti trovare una funzione o macro che fa quello che vuoi ma sotto sotto una variabile ci sarà sempre.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

leo72


esiste una funzione che non contenga if, variabili o altre condizioni e che in un ciclo loop o in uno switch case esegue delle istruzioni una sola volta all'avvio?

Quindi, per i motivi su esposti, la risposta è: no.
Ma perché non vuoi usare variabili?

peppe123



esiste una funzione che non contenga if, variabili o altre condizioni e che in un ciclo loop o in uno switch case esegue delle istruzioni una sola volta all'avvio?

Quindi, per i motivi su esposti, la risposta è: no.
Ma perché non vuoi usare variabili?


non avrei problemi ad utilizzare variabili, pensavo ci fosse la possibilità di utilizzare un codice semplice che non utilizza variabili, tutto qui.
a questo punto direi che il modo piu snello e semplice per gestire la cosa è una variabile booleana come suggerito da PaoloP

Si.
Puoi dichiarare una variabile globale, ad esempio:
Code: [Select]

bool onetime = true;


poi nel case metti:
Code: [Select]

case X:
if (onetime) {
// codice che vuoi eseguire
onetime = false;
}
break;



Grazie a tutti..

Go Up