přetečení int v C arduino

Petr Zapadlo zapik na email.cz
Pátek Červenec 18 10:10:15 CEST 2014


Zdravím,

je to jednorázové udělátko - časovač na dýmovnici na tábor. Použito 
arduino a LCD shield. V určenou dobu (8:08:08) to má odpálit dýmovnici.
Nachystat to pujdu  večer před akcí, proto nepotřebuju nějaké ošetření 
všech možných stavů, prostě jen funkčnost na tu jednu příležitost.
Celý kod je zde:


/ include the library code:
#include <LiquidCrystal.h>
int sensorPin = A0;
int sensorValue = 0;
unsigned long fr = 0;
unsigned long cas=0;
unsigned long alarm=115688;
int rychlost=991;
int outpin = 2;


// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
   // set up the LCD's number of columns and rows:
   lcd.begin(16, 2);
   pinMode(outpin, OUTPUT);
   digitalWrite(outpin, LOW);
}

void loop() {
   //hodiny
   lcd.setCursor(0, 0);
   zobraz(cas);
    //zrychleni chodu pro nastaveni casu
   if ( (analogRead(sensorPin) > 120) && (analogRead(sensorPin) < 140) )  {
     rychlost= 10;
   }


   if ( (analogRead(sensorPin) > 300) && (analogRead(sensorPin) < 320) )  {
     rychlost= 100;
   }


   if ( (analogRead(sensorPin) > 460) && (analogRead(sensorPin) < 500) )  {
     cas=cas+60;
   }
   if ( (analogRead(sensorPin) > 1020)) { rychlost= 991;}


   if ((millis()-fr) >= rychlost) {
     fr = millis();
    cas++;
   }

   lcd.setCursor(12,0);
   lcd.print(analogRead(sensorPin));
   lcd.print(" ");
   lcd.setCursor(0,1);
   zobraz(alarm);
   lcd.setCursor(7,1);
   if (alarm >= cas) {
     zobraz(alarm-cas);
   }
   else {
    lcd.print ("----------");
   digitalWrite(outpin, HIGH);
   }

}

void zobraz(unsigned long cas1) {
   long den,hodina,minuta,vterina;


   den=long(cas1/86400);
   cas1=cas1-den*86400;
   hodina=long(cas1/3600);
   cas1=cas1-hodina*3600;
   minuta=long(cas1/60);
   cas1=cas1-minuta*60;
   vterina=int(cas1);


   lcd.print ( den);
   lcd.print (" ");
   lcd.print (hodina);
   lcd.print (":");
   lcd.print (minuta);
   lcd.print (":");
   lcd.print (vterina);
   lcd.print (" ");

}



Dne 18.7.2014 09:53, Jaroslav Lukesh napsal(a):
> Arduino se neprogramuje v Céčku, ale v uměleckém jazyku Wire, který je 
> zjednodušeným céčkem.
>
> http://arduino.cc/en/Reference/HomePage
>
> viz odstavec Data Types, mrkněte taky na typ byte
>
> Zajímalo by mně, jak je máte udělané celé, hoďte to sem celé, za 
> odměnu sem hodím svého knightridera.
>
> A až se budete někdy příště divit proč třeba mikrosekundy občas 
> neposlouchají, tak si přečtětě, jaký je jejich reliable rozsah.
>
> A zkuste si do něj přidat doplněk ArduBlock, co tomu řeknou děti.
>
>
>
> ----- Původní zpráva ----- Od: "Petr Zapadlo" <zapik na email.cz>
>
> nejsem úplně zběhlý v Céčku, tak mě občas něco překvapí.
> Mám následující funkci:
>
> void zobraz(unsigned long cas1) {
>   int den,hodina,minuta,vterina;
>
>
>   den=int(cas1/86400);                //den=0, cas1=36000
>   cas1=cas1-den*86400;            //den=0, cas1=36000
>   hodina=int(cas1/3600);            //hodina=10, cas1=65535
>   cas1=cas1-hodina*3600;        //hodina=10, cas1=65535
>   minuta=int(cas1/60);            //minuta=1092,
>   cas1=cas1-minuta*60;
>   vterina=int(cas1);
>
>
>
> }
>
> A když proměnná cas1 má hodnotu přes  36000, tak dojde někde přetečení a
> v minutách se objeví hodnota přes 1092.  Do komentářů jsem připsal 
> hodnoty.
> Při změně proměných na long se to začalo chovat korektně.
> V čem je problém, co jsem nepochopil?
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list