При программуванні ATmega8 я намагаюсь читати EEPROM. При завантаженні нової прошивки, мікроконтроллер стирається повністю і вся його память становить FFFFFFFFFFFF….
Тому мало б читатись число 65535, що відповідає unsigned short
Проте при передачі цього числа на UART я отримую -1 !!!
Виявилось, що функція itoa , яка по опису перетворює int в символи, насправді працює з таким діапазоном -32,768 to 32,767 – що відповідає в gcc типу short (short int).
Тупо і дивно, чи не так?
Ну вирішив проблему, використавши функцію utoa
Як описано, вона працює з unsigned int що відповідає unsigned short в коді програми!
Non-standard (i.e. non-ISO C) functions.
char * ltoa (long val, char *s, int radix)
char * utoa (unsigned int val, char *s, int radix)
char * ultoa (unsigned long val, char *s, int radix)
long random (void)
void srandom (unsigned long __seed)
long random_r (unsigned long *__ctx)
char * itoa (int val, char *s, int radix)
#define RANDOM_MAX 0x7FFFFFFF
Ну а тепер шматочки коду
void uart_sendint (unsigned short f)
{
char buffer [30]; // was [7]
char *p;
utoa(f,buffer,10);
p = buffer;
uart_puts( p );
}
uint16_t WordOfData ;
WordOfData = eeprom_read_word (( uint16_t *) 46) ; // 46 is the address
RAMWatFlowLimit = (unsigned short) WordOfData;
if (RAMWatFlowLimit == 65535) { // 65535 comes from clean FFFF eeprom
//RAMWatFlowLimit = 11;
}