Pages: 1 ... 6 7 [8]   Go Down
Author Topic: Ram+Seriale+Overflow  (Read 7760 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22813
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Però lasciando ScrollTime di tipo signed int continuerai per forza ad avere problemi. Se ScrollTime è negativo, quando lo converti a unsigned long, hai tutti i bit "rovesciati" per via del complemento a 2.
Logged


0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5909
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per distrazione ti ho scritto di fare il cast ad "unsigned long" invece devi farlo a "long", oppure dichiara Tempo direttamente come long.
modifica un attimo il mio codice come dici te, e lo posti e lo testo subito, Tempo non lo devi toccare come variabile, e nemmeno Scroll time
il tutto deve essere chiaro e funzionale con Tempo Unsigned long e ScrollTime INT
Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9506
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eccolo, ti ho aggiunto delle print per vedere come varia ScrollTime

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

void setup ()
{
 pinMode(13, OUTPUT);  
 Serial.begin(19200);
}

void loop ()
{

Tempo=millis();

 if ((long) Tempo > (ScrollTime + 300))
    {
     digitalWrite(13, HIGH);  
     delay (300);
     ScrollTime = millis();
     Serial.print(ScrollTime, DEC);
     Serial.print(" ");
     Serial.println(ScrollTime+300, DEC);
    }
 else
    digitalWrite(13, LOW);  
}
Logged

0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5909
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

questo e' un trucco, prima dichiari tempo unsigned e poi nell'IF la fai diventare Signed.

Questa e' la soluzione ?

Cioe' la risposta finale e': Quando si usa un IF le due variabili in gioco devono essere entrambe Signed o entrambe Unsigned. Non possono essere una Signed ed un'altra Unsigned ?
Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9506
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cioe' la risposta finale e': Quando si usa un IF le due variabili in gioco devono essere entrambe Signed o entrambe Unsigned. Non possono essere una Signed ed un'altra Unsigned.

Vedo che non ci arrivi da solo, prova a dichiarare Tempo come unsigned int, vedrai che tutto funziona come si deve, vediamo se dopo questa "imbeccata" ci arrivi da solo.
Indizio 2, prova pure ad eseguire queste poche righe di codice nella setup e valuta bene il risultato che ottieni, poi fai 1+1 = 10 e hai la soluzione  smiley

Code:
int a = -32700;
 unsigned long b;
 b = a;
 Serial.println(b, DEC);
Logged

0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5909
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dopo pranzo, dopo un sonnellino, ci lavoro

grazie per avermi seguito in queste mie elugubrazioni mentali  smiley
Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9506
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dopo pranzo, dopo un sonnellino, ci lavoro

Mi sa tanto che adesso andiamo tutti a pranzo, io sto per sfornare una lasagna che non vedo l'ora di addentare  smiley-mr-green
Logged

0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5909
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

4294934596
questo e' definitivamente chiarificatore  smiley

grazie ancora a te, leo e lesto  smiley

Logged

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

0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5909
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusate se continuo a testare, mi manca un ultimo elemento, vediamo se ho capito
nel mio esempio
Code:
Tempo=millis();

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

Quando SrollTime, che e' INT, va in overflow diventa -32768, pero' l'operazione da fare nell'if automaticamente costringe a promuovere la Int ad Unsigned Long, per poi fare l'operazione ?
Quindi oni volta che si fa un'operazione le variabili in gioco vengono prima "Castate" ad un unico tipo ?

Se e' cosi', perche' non posso vederlo con gli occhi questa cosa, intendo se faccio il print di ScrollTime, perche' mi stampa -32768, invece di 4Giga ?

questo e' un esempio di stampa, da quale uno poi non capisce che succede
Quote
T=33004  ST+=-32571  ST=32665
« Last Edit: April 30, 2012, 04:14:42 am by Testato » Logged

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

Pages: 1 ... 6 7 [8]   Go Up
Jump to: