Pages: [1] 2   Go Down
Author Topic: strano problema con delay  (Read 652 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao a tutti,

mi accade uno strano problema nel seguente codice.
Code:

void utilizzo()  //funzione richiamata dal loop
{
      contatore++;
      if( contatore == 1000)
          avviso();
}

nella funzione avviso viene effettuata una Serial.print.
Il problema è che questa viene sempre stampata, come se non esistesse l' IF.
Tuttavia, se inserisco un delay qualsiasi prima dell'IF (indifferentemente se prima o dopo l'incremento) il problema scompare....

Qualcuno ha qualce idea sul possibile motivo?
grazie in anticipo.
Logged

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

Mi puzza si un array che viene usato oltre il suo indice o un puntatore che punta a caso nella memoria RAM.

Ci dai il sketch completo?

Ciao Uwe
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Che tipo è contatore? Int, long, unsigned long?
Se fosse un int e lo richiami ad ogni loop fa in fretta a tornare a zero e quindi nuovamente a 1000. Potrebbe essere il motivo per cui stampa frequentemente.
Se invece inserisci un delay allora allunghi il tempo, ma prima o poi lo ristampa.
« Last Edit: September 09, 2013, 02:46:03 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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

Con un pezzo di codice lungo 3 righe non si può capire cosa succede nel resto del programma che può magari influenzare questa funzione.
Se non è molto lungo, dovresti allegare tutto lo sketch.
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per PaoloP è un int.

eccovi il codice, non è lungo e nemmeno difficile e comunque sia il problema è isolato, il resto non dovrebbe influenzare minimamente.
Code:
int  elettroDx = 9;
int  elettroSx = 10;
int  pompaDx = 11;
int  pompaSx = 12;
int  sensore = 13;
int  pulsante = 2;


volatile int contatore=0;
int x=0;

int nruote=0;
int Rsensore=0;

void setup ()
{
  Serial.begin(9600);
  pinMode(elettroDx, OUTPUT);
  pinMode(elettroSx, OUTPUT);
  pinMode(pompaDx, OUTPUT);
  pinMode(pompaSx, OUTPUT);
 
  pinMode(sensore, INPUT);   
 
}

void loop()
{
   
  if(true) //la condizione originale non era questa ma il problema sorge anche cosi
utilizzo();

}

void utilizzo()
{
      contatore++;
      delay(1);  //delay necessario altrimenti succede quanto spiegato prima
      if( contatore == 1000)
          avviso();
     
    lavaggio(); 
}


void lavaggio()
{
  //apertura pompe
  digitalWrite(pompaDx, HIGH);
  digitalWrite(pompaSx, HIGH);
  delay(1000); //indicativo per pressione
 
  //chiusura pompe
  digitalWrite(pompaDx, LOW);
  digitalWrite(pompaSx, LOW);
 
  //apertura valvole
  digitalWrite(elettroDx, HIGH);
  digitalWrite(elettroSx, HIGH);
 

  do
  {
      delay(1000);
      x++;
  }
  while((( x<=5 || input()==false)) && nruote<1);
 
  x=0;
  digitalWrite(elettroDx, LOW);
  digitalWrite(elettroSx, LOW);
     
}

boolean input()

  if( digitalRead(sensore)==HIGH && digitalRead(pulsante)==LOW && nruote==0  ) //attivato-->ruota && pulsante start premuto  0--> prima ruota
    {
        nruote++;  //possibile delay per utenti riconglioniti
        return true;
    }
    if( digitalRead(sensore)==HIGH && nruote==1  ) //attivato-->ruota && pulsante start premuto
    {
        nruote++;
        return true;
    }
          return false;
}
 

void avviso(){
   Serial.println("AIUTO");
}


grazie per l'aiuto
Logged

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

Code:

void utilizzo()  //funzione richiamata dal loop
{
      contatore++;
      if( contatore == 1000){
          avviso();}
}

io direi che mancano le graffe...
Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 77
Posts: 4647
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@lucaleo    non sono obbligatorie se c'e' solo una istruzione
ad esempio puoi anche scrivere un if così
Code:
if(x==0) print("x vale 0");
invece di
Code:
if(x==0)
{ print("x vale 0");
}

@tom95  la variabile è int (piccola) ma anche volatile.  Puoi togliere quell'attributo per verificare se è quello? Non credo, però nel codice non mi pare di vedere qualcosa che porti a quel problema.
« Last Edit: September 10, 2013, 02:46:46 am by nid69ita » Logged

my name is IGOR, not AIGOR

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

eccovi il codice, non è lungo e nemmeno difficile e comunque sia il problema è isolato, il resto non dovrebbe influenzare minimamente.

Ad occhio e croce dovrebbe eseguirti il blocco circa ogni 0,00025 secondi ,
Non penso che un essere umano riesca a seguirlo visivanente  .
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Come già detto, il problema è che con la variabile int che può contenere solo fino a 32767 valori (più i negativi che però non usa) il ciclo loop se lo mangia in un baleno quindi la condizione "contatore == 1000" si ripresenta dopo ogni overflow della variabile.

@Lucaleo, in questo caso le parentesi non influiscono.

@Tom95
Se vuoi aumentare il ciclo in modo che l'avviso si ripresenti meno spesso una una variabile unsigned long.
Dopo l'overflow la condizione verrà nuovamente verificata ma molto tempo dopo rispetto all'uso della variabile int.
Per eliminare il problema devi cambiare la logica del programma.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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

ah buono a sapersi!!
ma secondo voi conviene metterle lo stesso per una questione di ordine oppure si preferisce usare quella soluzione li quando è possibile??
Logged

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

Dipende dai "gusti". Io le metto anche per una sola istruzione, mi confondo meno a rileggere il codice.
Logged


ivrea (to)
Offline Offline
Faraday Member
**
Karma: 77
Posts: 4647
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Come detto da @leo dipende di gusti.
I manuali che ho letto suggeriscono di metterle comunque sempre, per confondersi meno e perchè se un giorno dei aggiungere una istruzione allora poi sei costretto ad inserire anche le graffe in quel momento. Tanto vale metterle sempre.  smiley-grin
Logged

my name is IGOR, not AIGOR

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A volte servono per leggere meglio il codice

Esempio
Code:
if (condition)
  return true;
return false;

Illeggibile se non si ha dimestichezza col linguaggio.  smiley-eek-blue
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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

Code:
if (a) b = (c ? 1 : 0);

 smiley-yell
Logged


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

se a è verificato b diventa
1 se c è verificato
0 se non lo è

giusto?? smiley-grin
Logged

Pages: [1] 2   Go Up
Jump to: