Pages: 1 ... 6 7 [8]   Go Down
Author Topic: Ram+Seriale+Overflow  (Read 6818 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nemmeno il secondo funziona
Code:
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
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

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

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.
« Last Edit: April 29, 2012, 05:05:39 am by astrobeed » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
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: 39
Posts: 5608
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] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 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: 39
Posts: 5608
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] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 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: 39
Posts: 5608
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] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 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: 39
Posts: 5608
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] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
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] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

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