Pages: [1]   Go Down
Author Topic: Ancora con delay, millis() etc.  (Read 686 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buongiorno, scusate.

Posto un breve codice incompleto per capirci ed arrivare alle domande:

Code:
void loop() {
  if(pin1 == HIGH)
 
  if(delayMotor) delay(delayMotor);

  digitalWrite(pin2, HIGH);
}

Meglio togliere l'if e far eseguire eventualmente un delay(0)?

Detto questo delay può assumere valori da 0 a 1000 (1sec.) nel mio caso, settati tramite menu.

Che problematiche vedete alla cosa?

Mi fareste per favore un esempio più efficiente? (durante il delay non è necessario che il micro esegua altre operazioni).

Grazie.
Logged

Offline Offline
Jr. Member
**
Karma: 2
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

tra
if(delayMotor) delay(delayMotor);
e
delay(delayMotor);
nel caso particolare dello 0 non vedo molta differenza...cioè mettere o no l'if a questo punto è più una cosa del tipo "quando fra un mese andrò a vedere il programma capisco meglio con l'if o senza l'if".

leggendo l'ultima frase mi sembra che il codice sia abbastanza efficiente anche perchè sono 3 righe di codice ci sarebbe poco da ottimizzare, e poi (rispondendo a quello che hai scritto tra parentesi) durante il delay il micro non fa niente già di suo non è una cosa opzionale (non so se mi sono spiegato)

comunque aspetta anche altri pareri più professionali che non fanno mai male smiley


ps. riguardandolo direi che devi aprire la parentesi graffa dopo if(pin1 == HIGH) e chiuderla dopo digitalWrite(pin2, HIGH); se vuoi che l'if sia effettivo
« Last Edit: June 12, 2012, 03:49:26 am by ale92 » Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No ok, il codice è li non controllato solo per avere un riferimento sul delay smiley In pratica per dare un'idea alle persone di quello che vorrei sapere.

Probabilmente si, mancano parentesi ma non le ritenevo importanti. L'importante era che il tema del delay fosse compreso.

Per 'ottimizzare' non intendevo ottimizzare le tre righe, che non sono niente. Ma, ho usato un termine inadatto, sostituire il delay() con qualcosa di più efficiente (se c'è).
« Last Edit: June 12, 2012, 03:58:59 am by GS88 » Logged

Offline Offline
Jr. Member
**
Karma: 2
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se il tuo intento è far "dormire" il micro per un tot tempo prima di riprendere l'esecuzione così su due piedi non mi viene in mente un altro modo, l'unica è che se vuoi essere più preciso usi il delayMicroseconds ma non ne vedo il motivo
spero di esserti stato di aiuto
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il mio intento è quello di attendere a fare le successive operazioni se la variabile delayMotor è impostata.

Vorrei capire se usare delay (per i tempi che ho descritto, da 0 ad 1sec) oppure altro e nel caso cosa (e come).

Grazie.
Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10444
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a parte che il codice così scritto serve a poco (in particolare la digitalWrite), meglio l'if di delay(0) perchè eviti di salvare lo stato sullo stack etc... tutte cose relative ad una chiamata a funzione
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Sr. Member
****
Karma: 0
Posts: 380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a parte che il codice così scritto serve a poco (in particolare la digitalWrite), meglio l'if di delay(0) perchè eviti di salvare lo stato sullo stack etc... tutte cose relative ad una chiamata a funzione

mi sta tutto bene lesto smiley

altro modo di scrivere quel delay(delayMotor) in modo non bloccante?

Grazie.
Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10444
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

usando la millis, ora non ho tempo di scriverti il codice, se stasera sei ancora in alto mare te lo scrivo, cmq il blinkWithoutDelay è il posto giusto da cui partire
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Sr. Member
****
Karma: 0
Posts: 380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cosa ne dici?

Code:
boolean sensor_stop(unsigned int limitTime){

  long time= millis();
  boolean result = false;

  while(!result) {

    if (millis() >= time + limitTime) result = true;  
  }
}
Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10444
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la while rende il codice bloccante, in pratica è come funziona internamente la millis.
certo, al contrario della millis nel while puoi mettere altro codice che vuoi, ma se poi vuoi creare differenti temporizzazioni contemporanee (per esempio ogni 3 sec. fai X, però ogni 2,7 sec fai Y e ogni pressione del tatsto fai Z) impazzisci per niente.

Al posto del while usa il loop stesso, e in pratica anzichè usare la flag a true per uscire dal ciclo e eseguire il tuo codice, usi la flag a true per eseguire il codice smiley
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1]   Go Up
Jump to: