Pages: [1]   Go Down
Author Topic: problema con time / comandi in parallelo  (Read 623 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 4
Posts: 408
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://arduino.cc/en/Reference/millis  smiley
Logged

Offline Offline
Sr. Member
****
Karma: 4
Posts: 408
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Verona
Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-twist
« Last Edit: April 18, 2012, 08:31:56 am by mauroz » Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 4
Posts: 408
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-grin

Aspetta qualche veterano!
Logged

Offline Offline
Sr. Member
****
Karma: 4
Posts: 408
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 4
Posts: 408
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

forse riesco ad auto rispondermi smiley 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:
time = millis(); // azzera il conteggio del tempo
quindi se li dico
Code:
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?
Logged

Malo ( VI )
Offline Offline
Sr. Member
****
Karma: 0
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

come faccio a dirli 30 giorni in secondi è lunghissimo??
Per i miei timer mi sono inventato questo
Code:
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:
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
Logged

Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

nel codice d'esempio c'è scritto
Code:
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
Logged

Offline Offline
Sr. Member
****
Karma: 4
Posts: 408
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
time = millis(); // azzera il conteggio del tempo
quindi non azzera il clock di arduino come se si fosse riavviato?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

"Sfornata" proprio ora  smiley-razz
http://arduino.cc/forum/index.php/topic,101938.0.html
Logged


Pages: [1]   Go Up
Jump to: