Re: funkce v C - proč to nechodí

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Úterý Prosinec 29 19:25:28 CET 2015


EEPROM.read  ma predpoklada navratovou hodnotu 8 bitu, IMHO by to melo 
fungovat po pretypovani:

   return (((unsigned int)EEPROM.read (alarmclock + 2) * 65536) +
       ((unsigned int)EEPROM.read (alarmclock + 1)) * 256 + ((unsigned 
int)EEPROM.read (alarmclock)));

Ale nevim, jestli je int 16 nebo 32b u arduina, tipuju spis 16, pak bude 
problem u prvniho clenu pokud bude nenulovy...
Lepsi je pouzivat std. int typy uint8_t, uint16_t...pak je kod dobre 
prenositelny.


Dne 29.12.2015 v 19:10 Petr Zapadlo napsal(a):
> Zdravím,
>
> hraji s hodinami v arduinu a mám takovou poměrně jednoduchou funkci:
>
>
> unsigned long nactialarm ()
> {
>
>   return ((EEPROM.read (alarmclock + 2) * 65536) +
>       (EEPROM.read (alarmclock + 1)) * 256 + (EEPROM.read (alarmclock)));
> }
>
>
> tato by měla vracet hodnotu uloženou v eeprom (3 byte). Ale chová se 
> velmi podivně.
> pokud je hodnota na adrese (alarmclock + 1)  vyšší než určitá hodnota 
> ( mám otestováno od 250), tak návratová hodnota funkce je cca 
> 4294937760 (pokaždé stejná).
> Pokud je hodnota na adrese nízká, pak je výsledek očekávaný. 
> nepochopil jsem proč.
> Přepsal jsem to takhle:
> unsigned int alarm2 =  EEPROM.read (alarmclock + 2);
>   unsigned int alarm1 = EEPROM.read (alarmclock + 1);
>   unsigned int alarm0 = EEPROM.read (alarmclock);
>   alarm=alarm2*65536+alarm1*256+alarm0;
> A to chodí jak má.
> Hodnoty v eeprom jsou korektní, obsah eeprom je v pořádku.
>
> Čím to je?
>
> Díky
>
> Petr
> _______________________________________________
> 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