Go Down

Topic: problema con time / comandi in parallelo (Read 649 times) previous topic - next topic

ilmandorlone

salve a tutti o una domanda che riguarda i comandi in parallelo se così si possono chiamare
il mio problema sta ne l codice

faccio un codice più corto che assomiglia al mio in modo che è più facile da comprendere

esempio :
Code: [Select]

  void setup() {               
    pinMode(13, OUTPUT);
    Serial.begin(9600);   
  }
int x=0;
  void loop() {
    delay(10000);
    x=x+5;
    Serial.print(x);
   
    //altro codice che non deve essere bloccato
    digitalWrite(13, HIGH);   
    delay(5000);               
    digitalWrite(13, LOW);   
    delay(5000);             
   
  }

questo semplice codice prevede che ogni 10 sec venga stampato un testo e nel frattempo dovrebbe accendere e spegnere ogni 5 sec un led.
ovviamente si vede a colpo d'occhio che il led si accende, passano 5 sec poi si spegne e invece di 5sec passano 15 sec perché ci sono i 10 sec del codice per stampare la variabile.

in conclusione quello che voglio dire e come posso fare due cose separate in modo che il tempo di attesa dei due blocchi di codice non influisca tra loro.

sciorty

http://arduino.cc/en/Reference/millis  :)

ilmandorlone

ok grazie provo a vedere anche se il mio reale problema non è proprio stampare e in più lampeggiare un led ma è contare il numero di impulsi in un pin e stamparli su monitor in più ogni 20 minuti deve fare una media e stampare anche quella insomma ci provo :)

mauroz

#3
Apr 18, 2012, 03:30 pm Last Edit: Apr 18, 2012, 03:31 pm by mauroz Reason: 1
e se proprio vuoi un esempio pronto con i led ti basta caricare "Blink without Delay" che trovi nei tutorial digital di arduino.
Da quello che scrivi sembra che tu voglia contare gli impulsi del contatore enel  ]:D

sciorty

Certo, se devi fare qualcosa di impossibile il problema è un altro ma la funzione millis() ti ritorna i millesimi passati dall'accensione di arduino. Quindi si tratta solo di fare un controllo e di aggiornare una variabile, dovresti farcela!
Occhio che dopo circa 50 giorni vai in overflow!

Comunque dovresti fare una cosa come questa http://arduino.cc/en/Tutorial/BlinkWithoutDelay
scusami, ma pensavo quest'esempio fosse riportato nel link sopra

ilmandorlone

ecco grazie ora ho capito comunque se ogni 50 giorni torna a 0 posso calcolare prima che finisce il tempo trascorso non so dico che al giorno 30 una variabile "A" è uguale a "A+1" esempio se a è == a 4 so che sono passati 120 giorni si può fare?
una volta arrivato a 30 giorni posso resettarlo io a 0??

Quote
Da quello che scrivi sembra che tu voglia contare gli impulsi del contatore enel 

no ho una macchina che gira e fa tot giri al secondo, ogni giro mi da un impulso e con un pseudo flip flop memorizzo quanti impulsi sono stati fatti ogni secondo e riportarli in un display lcd in più ogni 20 minuti deve calcolare la media di giri al minuto non so cosa serve ma è una fabbrica che mi ha incaricato di farglielo.
comunque riporterò anche per il pseudo flip flop una domanda ma forse domani prima voglio vedere fino dove arrivo :)

sciorty

Il ragionamento non è sbagliato ma ogni 30 giorni dovresti portare millis() a 0.. e qui non so aiutarti!
Altrimenti dovresti sapere esattamente il momento in cui va in overflow, e neanche qui so che dirti :D

Aspetta qualche veterano!

ilmandorlone

ok grazie :)
allora c'è qualche veterano che sa come si porta il millis() a 0 ?

ilmandorlone

forse riesco ad auto rispondermi :) se a qualcuno interessa ho trovato questo :http://www.provalotu.com/robotica-2/millis-scandiamo-il-tempo-del-nostro-arduino/

nel codice d'esempio c'è scritto
Code: [Select]
time = millis(); // azzera il conteggio del tempo

quindi se li dico
Code: [Select]

int trenta_giorni=0;
if((time+[30 giorni bisognerebbe calcolare i sec])<millis())//Se sono trascorsi 30 giorni
trenta_giorni=trenta_giorni+1
time = millis(); // azzera il conteggio del tempo
}

come faccio a dirli 30 giorni in secondi è lunghissimo??
comunque che ne dite dovrebbe andare no?

brunol949


come faccio a dirli 30 giorni in secondi è lunghissimo??

Per i miei timer mi sono inventato questo
Code: [Select]
void BaseTempi(){
 
  TempoAttuale = millis(); // leggo i millisecondi
 
  //PULSE OGNI DECIMO DI SECONDO
  PulseDec = false ;
  if ( TempoAttuale > (TempoDecimi + 100)) {
    PulseDec = true ;
    TempoDecimi = TempoAttuale; // leggo i millisecondi
     }
  if (TempoDecimi > TempoAttuale ){
        TempoDecimi = TempoDecimi - 4294967295 ;
     }
 
    //PULSE OGNI SECONDO
  PulseSec = false ;
  if ( TempoAttuale > (TempoSecondi + 1000)) {
    PulseSec = true ;
    TempoSecondi = TempoAttuale; // leggo i millisecondi
     }
  if (TempoSecondi > TempoAttuale ){
        TempoSecondi = TempoSecondi - 4294967295 ;
     }
 
  } // Fine void BaseTempi()


TempoSecondi = TempoSecondi - 4294967295 ; Con questo controllo il ritorno a 0 di millis
Come avrai letto millis arriva a 2^32

Non e' di una precisione estrema come usare gli interrupt ma per fare qualcosa ogni x minuti e tenere attivato un rele' 10" va piu' che bene

Poi lo uso cosi
Code: [Select]
if ( Error[0] && Error[1] && Error[2] ){
            digitalWrite(ledPin, HIGH);
            DifUp2 = false ;  // Attivo il rele' ed abilito il timer
        } // End if controllo errori

  if (PulseSec && DifUp2 == false){Timer2++;}
  if (Timer2 > 19 && DifUp2 == false){      // attende di arrivare a 20"
      Timer2 = 0 ;
      DifUp2 = true ;     // blocco il timer e spengo il rele
      digitalWrite(ledPin, LOW);
    }  // End Timer2
Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

sciorty


nel codice d'esempio c'è scritto
Code: [Select]
time = millis(); // azzera il conteggio del tempo



Non è che azzera millis(), cambia il valore alla variabile time. Quindi gli assegna un valore nuovo che in questo caso serve ad azzerare un conteggio

ilmandorlone

Code: [Select]

time = millis(); // azzera il conteggio del tempo

quindi non azzera il clock di arduino come se si fosse riavviato?

leo72

"Sfornata" proprio ora  :P
http://arduino.cc/forum/index.php/topic,101938.0.html

Go Up