Go Down

Topic: problema con time / comandi in parallelo (Read 778 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy