|
БРЕД с dph, dpl в Atmel c51
В общем наткнулся я на такую бяку (потом конечно вспомнил, что в году 2000 уже было такое, но я как всегда про это забыл).
проц at89s8252
выполняю следующие операции:
SEL_DPS0()
MOV DPTR,#1001H
MOV A,#11H
MOVX @DPTR,A
SEL_DPS1()
MOV DPTR,#2002H
MOV A,#22H
MOVX @DPTR,A
PUSH DPL
PUSH DPH
PUSH DPL1
PUSH DPH1
SEL_DPS0()
PUSH DPL
PUSH DPH
PUSH DPL1
PUSH DPH1
;
После чего:
POP ACC
LCALL HEX_ASCII_DP (вывод в hex виде)
POP ACC
LCALL HEX_ASCII_DP
POP ACC
LCALL HEX_ASCII_DP
POP ACC
LCALL HEX_ASCII_DP
POP ACC
LCALL HEX_ASCII_DP
POP ACC
LCALL HEX_ASCII_DP
POP ACC
LCALL HEX_ASCII_DP
POP ACC
LCALL HEX_ASCII_DP
SEL_DPS1()
MOV DPTR,#1001H
MOVX A,@DPTR
SEL_DPS0()
LCALL HEX_ASCII_DP
SEL_DPS1()
MOV DPTR,#2002H
MOVX A,@DPTR
SEL_DPS0()
LCALL HEX_ASCII_DP
что должно быть?
20 02 10 01 20 02 10 01 11 22
а получаем:
10 01 10 01 20 02 20 02 11 22
т.е. загрузка в указанный dptr идет верно, адресация озу тоже (иначе давно было бы заметно).
а вот прямая адресация DPHx, DPLx при сохранении в стеке идет всегда от выбранного dptr.
более того, вот что я нашел у себя в архиве от 2000 года:
При записи в DPLi,DPHi - запись идет по конкретному адресу
При чтении из DPLi,DPHi - чтение идет всегда из указаного через DPS
1) ВОСТАНОВЛЕНИЕ ИЗ СТЕКА - ПРАВИЛЬНО
2) СОХРАНЕНИЕ В СТЕКЕ - НЕВЕРНО (ВЫБРАННЫЙ DPTR)
3) INC DPTR - ВЕРНО
4) INC/DEC ВЫБРАННОГО DPLi,DPHi - РАБОТАЕТ ВЕРНО,
INC/DEC НЕВЫБРАННОГО DPLi,DPHi - +1 К ВЫБРАННОМУ И ЗАПИСЬ В НЕВЫБРАННЫЙ
кто то с таким бодался? или атмел у меня гнилой?
на корпусе:
at89s8252
0038
Цитировать •Редактировать • Инфо
E-mail: info@telesys.ru