Óra probláma

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
Csoki
DrótVégénSzéndarab
Hozzászólások: 44
Csatlakozott: 2012. június 25. hétfő, 6:00

Óra probláma

Hozzászólás Szerző: Csoki »

Az óra megoldása során egy problémába ütköztem.

Kód: Egész kijelölése

//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

unsigned long marad=0;
int nap=0; 
int ora=0;
int perc=0;
int mp=0;
int tmp=0;

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display

void setup()
{
  lcd.init();
  lcd.backlight();
}

void loop()
{
  marad=millis();
  lcd.setCursor(0,1);
  
  nap=  marad / 86400000;      marad = marad-nap*86400000; 
  ora=  marad / 3600000;        marad = marad-ora*3600000;
  perc= marad / 60000;           marad = marad-perc*60000;
  mp=   marad / 1000;             marad = marad-mp*1000;
  tmp=  marad / 100;

  lcd.setCursor(0,0);
  if(nap<10) lcd.print('0');
  lcd.print(nap);
  lcd.print(" nap ");
  if(ora<10) lcd.print('0');
  lcd.print(ora);
  lcd.print(":");
  if(perc<10) lcd.print('0');
  lcd.print(perc) ;
  lcd.print(":");
  if(mp<10) lcd.print('0');
  lcd.print(mp);
  lcd.print('.');
  lcd.print(tmp);
  delay(100);
}
Ez egy I2C meghajtású LCD kijelző.
Namost az óra működik, de van 1 problémám vele, amit nem értek.
Látható probléma: ha a mp értéke 33 és 59 közötti, akkor a tizedmásodperc túlcsordul, és marhaságot mutat.

A "marad = marad-mp*1000;" sor használta során túlcsordulás következik be. Azt tapasztaltam hogy hiába lett a marad változó unsigned long -nek definiálva, úgy tűnik, hogy az mp*1000 számítása során a kiszámított értéke túlcsordul, mintha az eredmény mező integet lenne, nem pedig unsigned long.

A problémát megoldja ha a mp változót unsigned int -nek definiálom, de a kérdésem, hogy mi okozza a tulcsordulást ???
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az _eredmény_ határozza meg, hogy miben számol.

nap= marad / 86400000;
nap: int
marad: long
84600000 : konstans :P

az eredményt _INT_ben kapod!
Avatar
Csoki
DrótVégénSzéndarab
Hozzászólások: 44
Csatlakozott: 2012. június 25. hétfő, 6:00

Hozzászólás Szerző: Csoki »

Ez eddig tiszta.
de akkor mivel magyarázod ezt:

marad = marad-mp*1000;
long = long - int*constans;

Ebben az esetben az eredménynek longban kell keletkeznie, de ennek ellenére az int*constant részszámítása során olyan tulcsordulás jön létre, mintha ez egy önálló művelet lenne int eredménnyel, nem pedig egy long eredmény résszámítása.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

tipp: int-ben kezdi:
int*constans!
Válasz küldése