Eats писал(а): Но ваши исследования на эту тему похвальны, я бы на такое вряд ли бы решился
Имею наглость быть счастливым
Eats писал(а):P.S.: а за lgt8f328Pdef.inc спасибо!!!
Спасибо Юрию Ревичу

, а я тольео перепостил.
Eats писал(а):И если бы мне понадобился епром, то я бы для него припаял отдельную микросхему по и2с и хранил бы данные в ней, а не перешивал каждый раз флеш, ресурс которого меньше, чем у епрома.
Дискуссий достаточно на эту тему

не буду спорить.
ДядяВован писал(а):Не совсем понятно. В eseg адреса двух соседних byte 1 будут отличаться на четыре?
Нет, отличаться будут на 1, но отправляться в EEAR (EEARH/EEARL) будут со сдвигом, то есть
1 byte - это 32 байта.., но..
там как раз путаница небольшая, просто её нужно осмыслить

Адрес передаётся на 32-битную запись/чтение со сдвигом на 2 бита, [14:2]
А на 8-ми битную запись/чтение [14:0]
Дальше на примере:
.ESEG
var1: .byte 1
0b0XXXXXXX XXXXXXxx
Тоесть, если нам нужно обратиться к 32-х битной переменной, то сдвигаем на <<2, а последние 2 бита оставляем нули;
Код: Выделить всё
ldi YL, BYTE1 (var1)
ldi YH, BYTE2 (var1)
lsl R28
rol R29
lsl R28
rol R29
; или даже макросом:
.MACRO EE_ADDRESS
ldi YL, BYTE1 (@0)
ldi YH, BYTE2 (@0)
lsl R28
rol R29
lsl R28
rol R29
.ENDMACRO
Если же обращаемся к 8-ми битной переменной, то сдвигаем на 2 бита, а последние 2 бита (
значения 0, 1. 2, 3) у нас будут адресовать байт в 32-х байтах.
Вобщем младшие 2 бита нужны для 8-ми битной адресации внутри 32-х битного байта..
Как то так

надеюсь не сильно запутал
Но 1 byte в .ESEG - это 32 бита
В программе сначала идёт проверка еепрома, и, если была перепрошивка, то загружаются начальные данные:
Код: Выделить всё
EE_FIRST_LOAD:
ldi ZL, LOW (EE_FIRST_LOAD_DATA *2)
ldi ZH, HIGH (EE_FIRST_LOAD_DATA *2)
EE_ADDRESS (START_SETTINGS_EE)
clr XH
ldi R18, 6 ; 6 байт 32-х битных данных
ee_first_loop_2:
ldi XL, 22 ; загружаем адрес регистра R22
ldi R17, 4 ; 4 байта данных
ee_first_loop_1:
lpm
st X+, R0 ; переместили из памяти программм сначала в R22+, потом R23, R24, R25
adiw Z,1
dec R17
brne ee_first_loop_1
call EEWrite32
adiw Y, 0x04 ; увеличиваем адрес EEPROM на 4 байта
dec R18
brne ee_first_loop_2
adiw Y, 0x04 ; увеличиваем адрес EEPROM на 4 байта
Ну тут как бы увеличиваю на 1 сдвинутый на 2 бита. Выходит, что на 4