Могли бы Вы выложить этот файл?[/uquote]shonty писал(а):lgt8f328Pdef.inc я взял из статьи
Да, конечно, во вложении.
Могли бы Вы выложить этот файл?[/uquote]shonty писал(а):lgt8f328Pdef.inc я взял из статьи
EEDR 寄存器用于8 位字节模式接口,E2PD0~3 用于32 位模式的读写操作;
Но оказалось, что вовсе и нет. Читается EEPROM (32-х битный)через E2PD0~3 без вопросов, но записать получится только первые 8 бит.Регистр EEDR используется для интерфейса 8-битного байтового режима, а E2PD0~3 используется для операций чтения и записи в 32-битном режиме;
Код: Выделить всё
ldi YL, BYTE1 (EE_adr_test)
ldi YH, BYTE2 (EE_adr_test)
lsl R28
rol R29
lsl R28
rol R29
call EEWrite32Код: Выделить всё
EEWrite32:
clr R16
out EEARL, R16
out EEDR, R22
inc R16
out EEARL, R16
out EEDR, R23
inc R16
out EEARL, R16
out EEDR, R24
inc R16
out EEARL, R16
out EEDR, R25
out EEARH,YH
out EEARL,YL
cli
ldi R16, 0x44
ldi R17, 0x42
out EECR, R16
out EECR, R17
sei
retКод: Выделить всё
EERead32:
cli
out EEARH,YH
out EEARL,YL
ldi R16, 0x41 ; 0b_0100_0001
out EECR, R16
nop
nop
in R22, E2PD0
in R23, E2PD1
in R24, E2PD2
in R25, E2PD3
sei
retКод: Выделить всё
sbic EECR,EEPE
rjmp PC-1Код: Выделить всё
call EEWrite32
call EEWrite32
call EEWrite32
call EERead32Код: Выделить всё
.ESEG
var1: .byte 4
var2: .byte 4
var3: .byte 4
...Код: Выделить всё
.ESEG
var1: .byte 1
var2: .byte 1
var3: .byte 1
...Имею наглость быть счастливымEats писал(а): Но ваши исследования на эту тему похвальны, я бы на такое вряд ли бы решился
Спасибо Юрию РевичуEats писал(а):P.S.: а за lgt8f328Pdef.inc спасибо!!!
Дискуссий достаточно на эту темуEats писал(а):И если бы мне понадобился епром, то я бы для него припаял отдельную микросхему по и2с и хранил бы данные в ней, а не перешивал каждый раз флеш, ресурс которого меньше, чем у епрома.
Нет, отличаться будут на 1, но отправляться в EEAR (EEARH/EEARL) будут со сдвигом, то естьДядяВован писал(а):Не совсем понятно. В eseg адреса двух соседних byte 1 будут отличаться на четыре?
Код: Выделить всё
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Код: Выделить всё
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Вот, и в коде у себя исправилEats писал(а):adiw Y, 0x04 ; увеличиваем адрес EEPROM на 4 байта
Ну тут как бы увеличиваю на 1 сдвинутый на 2 бита. Выходит, что на 4
Код: Выделить всё
adiw Y, (1<<2) ; увеличиваем 32-х битный адрес EEPROMКод: Выделить всё
ldi R16, 0b1010_0000
out DSCR, R16 ; включаем uDSC
ldi R25, high (0xFFFF) ; второй множитель
ldi R24, low (0xFFFF)
ldi R23, high (0xFFFF) ; первый множитель
ldi R22, low (0xFFFF)
; заметьте, здесь вводим только младшие байты
; старшие вводятся автоматически:
out DSDX, r24
out DSDY, r22
ldi r20, 0b0100_0100 ; настройка IR: DA = DX * DY
out DSIR, r20
; заметьте, здесь выводим только младшие байты
; старшие выводятся автоматически:
in r22, DSAL
in r24, DSAHКод: Выделить всё
ldi R16, 0b1010_0000
out DSCR, R16 ; включаем uDSC
ldi R27, BYTE2 (0x1234)
ldi R26, BYTE1 (0x1234)
ldi R25, BYTE4 (0x0FFFFFFF)
ldi R24, BYTE3 (0x0FFFFFFF)
ldi R23, BYTE2 (0x0FFFFFFF)
ldi R22, BYTE1 (0x0FFFFFFF)
out DSAH, R24
out DSAL, R22
out DSDY, R26
ldi r20, 0b10110000 ; настройка IR: DA = DA/DY
out DSIR, r20
sbis DSCR,D1 ; ожидаем окончания деления
rjmp PC-1
in r22, DSAL
in r24, DSAHМожет я не понятно выразился:Starichok51 писал(а):умножь делитель 0x1234 на 0xFFFF, и получишь максимальное значение для делителя 0x1234.
НО: если аппаратно делить 0xFFFFFFFF хоть на 0x1234, хоть на 0x5678 - результат получается 0x00000000.shonty писал(а):не нашёл только максимальное значение делимого, поэтому 0x0FFFFFFF старший разряд в 0 поставил, иначе ошибки.
Зачем мне читать, что Вы написали, если Вы понятия не имеете о чипе.Starichok51 писал(а):shonty, ты не в состоянии прочитать, что я тебе написал?
тогда повторю еще раз.
Таки вот, моё делимое в железе 0x0FFFFFFF почему-то больше Вашего виртуального 0х0011FFEE.Starichok51 писал(а):а 0x0012х 0xFFFF = 0х0011FFEE
любое число больше, чем 0х0011FFEE, при делении на 0x0012 даст переполнение результата и ты получишь ноль в ответе.
Ещё раз посмотрел аппаратное деление. Делил на 0xFFFF.shonty писал(а):Но с самой старшей тетрадой нужно потом разобраться..
Согласен, и много чего не дописано.Starichok51 писал(а):если бы старший бит был бы знаком, то выражение 0x8FFF_FFFF / 0xFFFF без знака превратилось бы в 0x0FFF_FFFF / 0xFFFF, и результат был бы 0х1000, а не 0х7000.
все равно какая-то непонятная ерунда с этим делением в этом чипе...


