ciao a tutti,
ho un problema con il linguaggio di programmazione di arduino..
se io apro ad esempio il file blink
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}
questo si accende e si spegne ogni secondo "per sempre".
Ma se io volessi modificare questo sketch in modo che all'avvio di arduino il led mi lampeggi una volta sola e basta, quindi non un loop? esiste qualche comando semplice per fermare il loop oppure devo usare qualche funzione accessoria tipo millis() del tipo che faccio lampeggiare il led quando il millis() raggiunge 1000ms e basta o qualcosa del genere?
Sinceramente è la prima cosa che ho fatto ma mi da errore (a memoria mi diceva che manca il loop). Possibile?
forse devo fare un loop vuoto?
Edit:
l'errore è questo:
core.a(main.cpp.o): In function main': C:\Users\Marco\Desktop\arduino-0023\hardware\arduino\cores\arduino/main.cpp:10: undefined reference to loop'
effettivamente se non metto un void loop mi da errore, mentre se lo lascio vuoto no...
Si, metti il loop e non scriverci niente dentro e vedrai che funziona: se arduino non trova il loop va in pappa :). Comunque ci sono mille modi diversi per far eseguire un comando solo una volta o un numero predefinito di volte, però questo è il metodo più semplice e immediato e va benissimo per il problema che ti sei posto.
Per definizione la funziona setup() viene eseguita 1 volta subito dopo un accensione o un reset e la funzione loop() viene eseguito di continuo al termine del setup().
Non si puó (o meglio detto non ha nessun senso) voler bloccare la funzione loop().
Tutti due le funzioni devono essere presente nel sketch di Arduino.
Ciao Uwe
uwefed:
Per definizione la funziona setup() viene eseguita 1 volta subito dopo un accensione o un reset e la funzione loop() viene eseguito di continuo al termine del setup().
Non si puó (o meglio detto non ha nessun senso) voler bloccare la funzione loop().
Tutti due le funzioni devono essere presente nel sketch di Arduino.
Ciao Uwe
Perché non ha senso Uwe? Se metto delle istruzioni in setup per rieseguirle devo resettare Arduino e perdo tempo fino alla ri-esecuzione, se le metto in loop e blocco tutto con un while (1) in attesa di un pulsante, posso rieseguirle ogni volta che voglio, p.es. per mandare una sequenza di bit ad un apparecchio in un momento ben preciso e poi in momenti successivi con intervalli non stabili.
menniti:
Perché non ha senso Uwe? Se metto delle istruzioni in setup per rieseguirle devo resettare Arduino e perdo tempo fino alla ri-esecuzione, se le metto in loop e blocco tutto con un while (1) in attesa di un pulsante, posso rieseguirle ogni volta che voglio, p.es. per mandare una sequenza di bit ad un apparecchio in un momento ben preciso e poi in momenti successivi con intervalli non stabili.
perché in quel modo non "stoppi un Void loop()"; Nel esempio del while(1) Arduino continua ad eseguire il codice nel loop() in un ciclo che non da nessun uscita.
Ciao Uwe
menniti:
Perché non ha senso Uwe? Se metto delle istruzioni in setup per rieseguirle devo resettare Arduino e perdo tempo fino alla ri-esecuzione, se le metto in loop e blocco tutto con un while (1) in attesa di un pulsante, posso rieseguirle ogni volta che voglio, p.es. per mandare una sequenza di bit ad un apparecchio in un momento ben preciso e poi in momenti successivi con intervalli non stabili.
perché in quel modo non "stoppi un Void loop()"; Nel esempio del while(1) Arduino continua ad eseguire il codice nel loop() in un ciclo che non da nessun uscita.
Ciao Uwe
Ma la richiesta NON era così tecnica, lui parla semplicemente di fermare un ciclo infinito NON di fermare l'attività del microcontrollore, comunque nonn è per mettere in piedi una questione, solo per dire che anche "fermare" l'esecuzione di un codice che sarebbe eseguito all'infinito può avere i suoi vantaggi, in alcuni particolari casi.
menniti:
Perché non ha senso Uwe? Se metto delle istruzioni in setup per rieseguirle devo resettare Arduino e perdo tempo fino alla ri-esecuzione,
Modo non corretto di procedere, se hai del codice da eseguire in funzione di un determinato evento lo metti in una funzione dedicata che richiami dal main loop quando si verifica l'evento in questione.
In realtà la loop() altro non è che una funzione richiamata dalla main() all'interno di una for(,,) (loop infinito), basta guardare il codice della main.cpp per rendersene conto.
Su una mcu non ha alcun senso terminare il programma, ci deve sempre essere un loop infinito da qualche parte che tiene impegnato il micro altrimenti l'esecuzione del software ripartirebbe sempre dalla locazione 0, cioè un soft reset, oppure si va incontro a effetti non prevedibili se la flash contiene dei dati che potrebbero essere interpretati come codice reale mentre il program counter scorre le locazioni di memoria oltre la fine del programma.
#include <WProgram.h>
int main(void)
{
init();
setup();
for (;;)
loop();
return 0;
}
Non voglio insistere che già mi hai rimandato a settembre, non vorrei finire peggio
però pongo il caso di tenere ferma la procedura a tempo indeterminato ed attivare una o più istruzioni solo quando lo decido io. Tu dici che la cosa miglioer sarebbe, se parliamo di un pulsante (come nel mio esempio), di legarlo ad un interrupt che esegua una routine? In tal modo il loop sarebbe completamente vuoto, se parliamo solo di un'istruzione o una sequenza di istruzioni non alternative.
menniti:
Non voglio insistere che già mi hai rimandato a settembre, non vorrei finire peggio
però pongo il caso di tenere ferma la procedura a tempo indeterminato ed attivare una o più istruzioni solo quando lo decido io.
Non è indispensabile usare gli interrupt, a meno che non sia necessario per motivi di timing e/o real time, semplicemente fai un polling nella loop() delle varie condizioni che devono attivare le operazioni, esempio pratico :
loop()
{
LeggiPulsanti();
if (Pulsante1) Operazione1();
if (Pulsante2) Operazione2();
if (Pulsante3) Operazione3();
// altre cose da fare nel main loop
}
La funzione LeggiPulsanti() va a controllare lo stato dei pin a cui sono collegati i pulsanti, esegue l'eventuale debounce, se viene rilevata la pressione setta i relativi flag (Pulsantex) in modo che al ritorno nel ciclo principale le if avviano le operazioni richieste.
Quanto sopra è solo un esempio del concetto, non è da intendersi come programma reale.
Al tempo, ma così il micro lavora continuamente, in attesa che ci sia l'evento pulsante; invece se la loop è vuota quella parte di funzioni non viene svolta ed io posso anche tenerlo a dormire finché non attivo l'interrupt, era questo che intendevo dire, ma correggetemi se sbaglio.
menniti:
invece se la loop è vuota quella parte di funzioni non viene svolta ed io posso anche tenerlo a dormire finché non attivo l'interrupt, era questo che intendevo dire, ma correggetemi se sbaglio.
Non cambia nulla, se vuoi il micro lo metti a nanna oppure lo tieni attivo in polling.
Ti faccio presente che le applicazioni dove si mettono i micro in sleep sono la minoranza e non la regola, comunque è sempre bene gestire il software nel modo corretto indipendentemente se usi o meno lo sleep.