Pages: [1] 2 3   Go Down
Author Topic: dubbi sulla funzione millis()  (Read 1006 times)
0 Members and 1 Guest are viewing this topic.
Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

sto provando la funzione millis perchè ho dei sensori che hanno dei tempi di recupero di 50ms, e adesso sto provando con 4 led e un arduino 2009 per poi applicarlo anche ai sensori ma ho dei dubbi.... questo è il codice:
Code:
void setup()
{
 pinMode(2,OUTPUT);
 pinMode(3,OUTPUT);
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
}

void loop()
{
 byte y;
 unsigned long time[4];
 
 for(y=0;y<4;y++) time[y]=millis();
 
 y=0;
 
 while(3)
 {
  time[y]=millis()-time[y];
  if(time[y]<6000)delay(time[y]);
  time[y]=millis();
   
  switch(y)
  {
   case 0:
     {
      digitalWrite(2,HIGH);
      delay(random(1000,2000));
      digitalWrite(2,LOW);
      y=1;
     }break;
     
   case 1:
     {
      digitalWrite(3,HIGH);
      delay(random(1000,2000));
      digitalWrite(3,LOW);
      y=2;
     }break;
   
   case 2:
     {
      digitalWrite(4,HIGH);
      delay(random(1000,2000));
      digitalWrite(4,LOW);
      y=3;
     }break;
   
   case 3:
    {
     digitalWrite(5,HIGH);
     delay(random(1000,2000));
     digitalWrite(5,LOW);
     y=0;
    }break;
  }
 }
}
volevo provare ad accendere un led alla volta per un tempo random da 1 a 2 secondi e fare in modo che il led stia spento per almeno 6 secondi, il codice è giusto no?
il programma sembra che funzioni ma non capisco perchè ogni tanto si blocchi e aspetti altri 6 secondi per niente, a parte all'inizio dove aspettare ovviamente deve settare i tempi sul primo giro, succede anche dopo ma non capisco perchè... ho sbagliato qualcosa nel programma?  smiley-confuse
ci sono problemi nell'usare la funzione millis con gli ATtiny?
grazie smiley
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

macheccasini stai combinando?

non usare il while.

fai una digitalWrite high, un delay random tra 1 e 2 secondi, una write low, delay di random + delay 6 secondi

edit: per sostituire la delay con una millis, ti basta un semplice if
« Last Edit: December 28, 2011, 07:46:22 pm by lesto » Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma a me interessa capire la funzione millis... Dopo in questo codice devo mettere dei sotto-programmi per i sensori all posto dei accendi e spegni i led, questo è solo per capire se e come funziona
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la millis ti dice il numero di millisecondi trascorsi a partire dall'accensione dell'arduino.
Il valore è un unsigned long, quindi si resetta più o meno ogni 70 giorni se non erro.

Se vuoi aspettare un tot, per esempio 1000 millis, allora fai così: leggi la millis attuale, sommi 1000, e poi controlli ogni loop se la millis da un valore >= del valore calcolato, se è vero esegui la funzione e ricalcoli il prossimo tempo. mi raccomando anche il maggiore, metti che qualche parte di codice usi più tempo del previsto, rimastesti "intrapolato"
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20174
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Va in overflow ca ogni 49 giorni e mezzo;
Il micros() va in overflow ca dopo 70 ore.
Ciao UWE
Logged

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

Premesso che non riesco a capire la logica del tuo programma, la definizione di time[] messa nel loop significa che ogni volta che il programma riparte, viene reinizializzato l'array, con conseguente attesa dei 6 secondi.
Devi spostare quella dichiarazione prima del setup, in modo da farla diventare globale, oppure usare static affinché conservi il valore ad ogni iterazione di loop().

Poi mi pare che la struttura che hai usato è un inutile spreco di risorse dato che se devi accendere 1 solo led per volta ed ogni volta che lo accendi attendere un tempo casuale, puoi benissimo usare una variabile singola per gestire solo il led da accendere. Poi non so cosa devi fare esattamente nella versione finale dello sketch per cui questa indicazione prendila con le molle.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok ok grazie ho capito abbastanza, comunque dopo nel programma finale devo mettere delle funzioni dove leggo ed elaboro i dati dei sensori al posto dei led, questo è solo per provare se la base funziona, dopo metto assieme tutti i pezzi smiley-wink
non ho capito quello che dici sulle variabili... Se sono dentro il while il programma non riparte mai o sbaglio?
Se uso la funzione pulseIn durante il programma crea qualche problema a millis?
E con i tiny non cio dovrebbero essere problemi no?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

A me pare che ad ogni ciclo dopo l'accensione del 4° led, il tuo codice si fermi 6 secondi.
Comunque è molto ingarbugliato, sinceramente non ho capito la logica che dovrebbe rispettare.  smiley-sweat
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

eh non è da escludere smiley-red comunque dopo lo sistemo e lo riprovo e vi so dire...
Se uso la funzione pulseIn durante il programma crea qualche problema a millis?
E con i tiny cio sono problemi con millis?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

PulseIn blocca il codice per un determinato lasso di tempo in attesa di un segnale sul pin, quindi tieni conto di questa cosa.

Delay e millis funzionano sui Tiny come sull'Arduino.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok ma non impedisce il correto funzionamento di millis?
Grazie
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

Che intendi per "corretto funzionamento"?
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

bo non so, magari pulseIn crea qualche "interferenza", non so come funzionano realmente le funzioni smiley-red anche pulseIn si basa sul tempo...
ma non dovrebbe dare problemi, è solo per essere sicuro  smiley-sweat
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok ho modificato il codice, così pare che funzioni molto meglio smiley ma non so se va bene la parte dove metto un ciclo while senza operazioni...
avete qualche altro consiglio da darmi a rigurardo?

Code:
byte y;
unsigned long time[4];

void setup()
{
 pinMode(2,OUTPUT);
 pinMode(3,OUTPUT);
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
 
 for(y=0;y<4;y++) time[y]=0;
 y=0;
}

void loop()
{
  while(millis()<=time[y]){}
  time[y]=millis()+6000;
   
  switch(y)
  {
   case 0:
     {
      digitalWrite(2,HIGH);
      delay(random(1000,2000));
      digitalWrite(2,LOW);
      y=1;
     }break;
     
   case 1:
     {
      digitalWrite(3,HIGH);
      delay(random(1000,2000));
      digitalWrite(3,LOW);
      y=2;
     }break;
   
   case 2:
     {
      digitalWrite(4,HIGH);
      delay(random(1000,2000));
      digitalWrite(4,LOW);
      y=3;
     }break;
   
   case 3:
    {
     digitalWrite(5,HIGH);
     delay(random(1000,2000));
     digitalWrite(5,LOW);
     y=0;
    }break;
  }
}

grazie a tutti smiley-wink

(ripeto questo è solo un codice di prova, dopo al posto di accedi-spegni un led ci devo mettere delle funzioni per leggere e calcolare i dati dei sensori)
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

Mi limito a risponderti per la parte tecnica: va bene.
Logged


Pages: [1] 2 3   Go Up
Jump to: