Кто знает, в чем загвоздка.
Вы используете восьмибитное значение в качестве указателя. Но на AVR указатель по умолчанию занимает 16 бит. Соответственно, компилятор предупреждает, что размер не соответстует, и он дополнит недостающее нулями.
Проблемы могут начаться, если вы захотите записать по адресу, большему чем 255 (особенно опасно в цикле, кстати). Будет переполнение, и запись пойдет по тем же адресам. Так что предупреждение не лишено смысла.
Чтобы втупую избавиться от варнинга, можно сделать так:
Код: Выделить всё
eeprom_write_byte((uint8_t*)((uint16_t)(i)),0x30);
То есть, сначала расширяем i до шестнадцати бит, потом пишем - компилятор не заподозрит подвоха.
Но это косметическое решение, от переполнения это не спасет никак, разумеется. Нормальное решение - объявить i как
uint16_t.
Это вообще жуть.
(uint8_t*)&i - Эта запись значит следующее: эй, компилятор, вот переменная i. Возьми ее адрес и преврати его в указатель на восьмибитное значение. То есть, по факту,
вы пишете не по тому адресу, что хранится в i, а по адресу самой переменной i, только направляя запись в EEPROM. Разумеется, вы вылетаете за пределы EEPROM, вот оно и не работает.
Решение, предложенное
Hoksmur, рабочее, но там слишком много звездочек, в которых при небольшом усложнении легко запутаться. Всю магию с указателями лучше ограничивать одним местом (одной строкой), чтобы в перспективе было легче локализовать источник проблем.
Разница между теорией и практикой на практике гораздо больше, чем в теории.