Go Down

Topic: Ram+Seriale+Overflow (Read 8 times) previous topic - next topic

astrobeed


e' la variabile che inspiegabilmente non fa il suo dovere
io leo e lesto abbiamo provato, il led resta spento.


Le variabili fanno sempre il loro dovere, siete voi che sbagliate ad interpretare le cose, comunque posta lo sketch esatto che stai usando e ti dico dove sta esattamente il problema.

Testato

Usa questo, e vedrai,

con UNSIGNED INT l'IF fa il suo dovere, dopo un minuto overflow e led sempre fisso
con INT niente da fare, l'overflow avviene dopo 30 secondi (giustamente la meta' del tempo di Unsigned Int), ma il led resta spento
Code: [Select]
unsigned long Tempo;
unsigned int  ScrollTime; // TUTTO OK
//int  ScrollTime; // SI BLOCCA

void setup ()
{
pinMode(13, OUTPUT);     
}

void loop ()
{

Tempo=millis();

if (Tempo > ScrollTime + 300)
    {
     digitalWrite(13, HIGH); 
     delay (300);
    ScrollTime = millis();
    }
else
    digitalWrite(13, LOW); 
}
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed

La risposta è molto semplice cambia "if ( Tempo > (ScrollTime + 300))" in "if ((unsigned long) Tempo > (ScrollTime + 300))" e vedrai che funziona, il motivo te lo lascio scoprire da solo, ma è facile arrivarci, se vi dico sempre tutto non imparate nulla, è meglio se vi lascio fare un pochino di fatica da soli  :smiley-mr-green:

Testato

Non funziona,

la devo aggiungere alla lista (piccolissima) delle volte in cui Testato batte Astro ? :)

Code: [Select]
unsigned long Tempo;
// unsigned int  ScrollTime; // TUTTO OK
int  ScrollTime; // SI BLOCCA

void setup ()
{
pinMode(13, OUTPUT);    
}

void loop ()
{

Tempo=millis();

if ((unsigned long)Tempo > (ScrollTime + 300))
   {
    digitalWrite(13, HIGH);  
    delay (300);
   ScrollTime = millis();
   }
else
   digitalWrite(13, LOW);  
}
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Non funziona per forza ;)
Tempo è già unsigned long. Il casting va fatto per il secondo membro del confronto.
Code: [Select]
if (Tempo > ((unsigned long)ScrollTime + (unsigned long)300))

Così funziona senz'altro (penso).
Alternativamente prova
Code: [Select]
if (Tempo > ((unsigned long)(ScrollTime + 300)))

Testato

niente da fare, nessuno dei due

Scrivo a Massimo ?  :smiley-yell:
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Una domanda: mi spieghi esattamente cosa stai cercando di fare?  :smiley-sweat:

Testato

#97
Apr 29, 2012, 11:53 am Last Edit: Apr 29, 2012, 11:57 am by Testato Reason: 1
semplice, imparare

e se mostri sacri come te, astro e lesto, che tale siete in ambito di programmazione rispetto a me, non sanno spiegare perche' quest IF non si verifica, vuol dire che il tutto non e' banale.

Se vogliamo ammettere che c'e' un bug in arduino allora io chiudo qui, ma se si vuole dire che questo comportamento e' normale lo si deve spiegare

Il comportamento secondo me deve essere questo:
Il led deve lampeggiare fino all'overflow della variabile, da li' in poi deve stare sempre fisso, perche' l'IF e' sempre True.

Questo con Unsigned Int funziona, con Int no, perche' ?
Le ultime prove vanno nella direzione della corretta gestione del casting credo, ma con unsigned Int perche' va tutto liscio senza aggiungere nulla al codice ?
E cmq anche gli utimi tentativi Vostri sono falliti, quindi nessuno per ora conosce la spiegazione
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed


Non funziona,


Funziona perfettamente, e l'ho pure provato in pratica  :)

Testato

e io te lo riprovo subito,,spetta un attimo
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Boh, io sono senza "hardware" per cui vado avanti a parole.
Cmq fare il casting verso unsigned long di un dato che è già unsigned long mi sa che serve a poco  :smiley-sweat:


e se mostri sacri come te, astro e lesto, che tale siete in ambito di programmazione rispetto a me

ROTFL
Stai scherzando, spero  :smiley-yell:

Testato

Allora, ritestato quello di astro
NON FUNZIONA
Code: [Select]
unsigned long Tempo;
// unsigned int  ScrollTime; // TUTTO OK
int  ScrollTime; // SI BLOCCA

void setup ()
{
pinMode(13, OUTPUT);    
}

void loop ()
{

Tempo=millis();

if ((unsigned long) Tempo > (ScrollTime + 300))        
   {
    digitalWrite(13, HIGH);  
    delay (300);
   ScrollTime = millis();
   }
else
   digitalWrite(13, LOW);  
}


Riprovo i due tuoi
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Testato

Nemmeno il Primo di Leo funziona
Code: [Select]
unsigned long Tempo;
// unsigned int  ScrollTime; // TUTTO OK
int  ScrollTime; // SI BLOCCA

void setup ()
{
pinMode(13, OUTPUT);     
}

void loop ()
{

Tempo=millis();

if (Tempo > ((unsigned long)ScrollTime + (unsigned long)300))
    {
     digitalWrite(13, HIGH); 
     delay (300);
    ScrollTime = millis();
    }
else
    digitalWrite(13, LOW); 
}


aspettate l'ultimo
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Testato

Nemmeno il secondo funziona
Code: [Select]
unsigned long Tempo;
// unsigned int  ScrollTime; // TUTTO OK
int  ScrollTime; // SI BLOCCA

void setup ()
{
pinMode(13, OUTPUT);     
}

void loop ()
{

Tempo=millis();

if (Tempo > ((unsigned long)(ScrollTime + 300)))
    {
     digitalWrite(13, HIGH); 
     delay (300);
    ScrollTime = millis();
    }
else
    digitalWrite(13, LOW); 
}


Che si fa ?
Io uso IDE1.0 su Win7-64 con ArduinoUnoR1
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed

#104
Apr 29, 2012, 12:03 pm Last Edit: Apr 29, 2012, 12:05 pm by astrobeed Reason: 1

Se vogliamo ammettere che c'e' un bug in arduino allora io chiudo qui, ma se si vuole dire che questo comportamento e' normale lo si deve spiegare


Semmai il bug è nel compilatore e non certo in Arduino che è semplicemente un utilizzatore finale.
Comunque per distrazione ti ho scritto di fare il cast ad "unsigned long" invece devi farlo a "long", oppure dichiara Tempo direttamente come long.

Go Up