есть процессор Atmel AT89S8252 с 51-й архитектурой со внутренним EEPROM на 2Кб, вопрос - как правильно с этим EEPROM-ом общаться?
По документации надо выставлять флаги EEMEN и EEMWE в регистре WMCON (0x96) для чтения/записи соответственно. Тогда операции movx a,@dptr и movx @dptr,a работают не с внешней памятью, а со встроенным eeprom. Но тут я натолкнулся на такую неприятность - стоит во время записи сделать что-нибудь лишенее (по идее, никак не могущее влиять на запись) и результаты записи в eeprom-е получаются просто непредсказуемые. Вот пример кода:
orl WMCON,#EEMEN
orl WMCON,#EEMWE
mov dptr,#0
movx a,@dptr
cjne a,#0aah,initEpromI
; дальше пропустим
;------------------------------------------
initEpromI{
mov a,#0aah
call wrEpromI
mov r3,#)mDStep-xEStep:
mov r0,#xEStep
wrkf{
clr a
mov @r0,a
call wrEpromI
inc r0
djnz r3,wrkf
; здесь опять пропустим
xrl WMCON,#EEMWE
xrl WMCON,#EEMEN
jmp start
wrEpromI{
push b
mov b,a
nextWr{ movx @dptr,a
loop{ mov a,WMCON
anl a,#WDTRST
jz loop
movx a,@dptr
cjne a,b,wrErr
inc dptr
pop b
ret
wrErr{ mov a,b
jmp nextWr
start{
задачей этого отрывка является инициализация епром-а нового процессора. в результате в епром с адреса 0x0000 прошиваются следующие значения: 0xaa и 8 раз 0x00
приведенный выше кусок работает нормально, но (!) раньше вслед за меткой initEpromI: стояла команда orl WMCON,#EEMWE (т.е. просто излишняя команда, которая ни на что влиять не должна), а врезультате в епром-е оказывалось 0xaa 0xff и только после этого нули.
В чем тут загвоздка?