Pages: [1]   Go Down
Author Topic: istruzione che viene eseguita una sola volta  (Read 999 times)
0 Members and 1 Guest are viewing this topic.
Roma
Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 7
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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".
Logged

Roma
Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6617
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si.
Puoi dichiarare una variabile globale, ad esempio:
Code:
bool onetime = true;

poi nel case metti:
Code:
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.
Logged

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

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 2228
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, accodo un altro metodo a quelli proposti da PaoloP
Nel tuo case, dopo l'operazione specifica, puoi aggiungere questa istruzione:

Code:
while(true);

che di fatto è un loop infinito.
« Last Edit: December 13, 2012, 09:58:27 am by pitusso » Logged

Roma
Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Appena posso sperimento tutto.

Vi ringrazio.. sempre gentili e disponibili.

Saluti
Giuseppe
Logged

Offline Offline
Sr. Member
****
Karma: 7
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 2228
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@qsecofr (questo nick mi ricorda troppo il mondo AS400  smiley-razz)
il
Code:
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...

« Last Edit: December 13, 2012, 09:59:40 am by pitusso » Logged

0
Online Online
Faraday Member
**
Karma: 24
Posts: 2817
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
/**
  * 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:

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.
Logged

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

Roma
Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley

grazie
« Last Edit: December 13, 2012, 10:38:13 am by peppe123 » Logged

0
Online Online
Faraday Member
**
Karma: 24
Posts: 2817
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21654
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged


Roma
Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
bool onetime = true;

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

Grazie a tutti..
Logged

Pages: [1]   Go Up
Jump to: