Еще раз к вопросу о командах Lpm Rx.,Z и Lpm Rx,Z+ в ATtiny26
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Dir 19 мая 2003 г. 16:11

В общем, нет слов, одни выражения...
Несмотря на заверения из службы техподдержки Атмеля о том, что эти команды работают корректно в ATtiny26 и отсутствие их в DS - это просто опечатка , я потратил вот уже больше 2 недель, чтобы в конце-концов удостовериться, что они нагло врут. Впору подавать в суд на компенсацию морального и материального ущерба :-/. А ведь могли бы честно ответить, что в Datasheet эти команды не внесены, потому что они работают не в соответствии с их описанием, т.е. попросту глючат. И глючат не так уж и сильно, просто в команде Lpm Rx,Z+ происходит постинкремент только ZL, а ZH при этом сбрасывается в "0". Т.е. использовать команду Lpm Rx,Z+ можно, но только если таблица расположена по адресам 0...0xFF. Глюков в команде Lpm Rx,Z я вроде не обнаружил, но кто его теперь знает...
В общем, бардак в этом Атмеле. Одни исключают команды из DS за их глюкавость, другие отрицают это. Техподдержка, разработчики ПО и группа тестирования живут своей жизнью и, похоже, не пересекаются друг с другом. Не зря AVR на Западе не пользуется популярностью несмотря на то, что чипы хорошие. Нет доверия к халтурщикам.

PS. Тестовая программа проверки работоспособности команы Lpm Rx,Z+

;****************************************************************
; Program : Lpm_test
;*****************************************************************
.equ IAddr = 0x100
.equ Q = 128
.def Data = r16
.def Addr = r17
.def Cnt = r18
.def Tmp = r19
.include "tn26def.inc"
.CSEG
Reset:
ldi Tmp,RAMEND
out SP,Tmp
ldi zl,low(Table*2)
ldi zh,high(Table*2)
clr Addr
ldi Cnt,Q
WriteLoop:
mov Data,zl
rcall WriteEEPROM
inc Addr
dec Cnt
mov Data,zh
rcall WriteEEPROM
;
lpm Tmp,z+
inc Addr
dec Cnt
DummyLoop:
breq DummyLoop
rjmp WriteLoop
;---------------------------------------------------------
; Input Data:
; Addr - EEPROM Address
; Data - Data to be written to Addr
;---------------------------------------------------------
WriteEEPROM:
sbic EECR,EEWE
rjmp WriteEEPROM
out EEAR,Addr
out EEDR,Data
sbi EECR,EEMWE
sbi EECR,EEWE
WriteEEPROM_1:
sbic EECR,EEWE
rjmp WriteEEPROM_1
sbi EECR,EERE
WriteEEPROM_2:
ret
;
.org IAddr
Table:
.exit

-----------------------------------
Дамп EEPROM (получен чтением EEPROM с помощью программатора):

00 02 01 00 02 00 03 00 04 00 05 00 06 00 07 00
08 00 09 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F 00
10 00 11 00 12 00 13 00 14 00 15 00 16 00 17 00
18 00 19 00 1A 00 1B 00 1C 00 1D 00 1E 00 1F 00
20 00 21 00 22 00 23 00 24 00 25 00 26 00 27 00
28 00 29 00 2A 00 2B 00 2C 00 2D 00 2E 00 2F 00
30 00 31 00 32 00 33 00 34 00 35 00 36 00 37 00
38 00 39 00 3A 00 3B 00 3C 00 3D 00 3E 00 3F 00

Дамп EEPROM (получен на симуляторе)
-----------------------------------------------
00 02 01 02 02 02 03 02 04 02 05 02 06 02 07 02
08 02 09 02 0A 02 0B 02 0C 02 0D 02 0E 02 0F 02
10 02 11 02 12 02 13 02 14 02 15 02 16 02 17 02
18 02 19 02 1A 02 1B 02 1C 02 1D 02 1E 02 1F 02
20 02 21 02 22 02 23 02 24 02 25 02 26 02 27 02
28 02 29 02 2A 02 2B 02 2C 02 2D 02 2E 02 2F 02
30 02 31 02 32 02 33 02 34 02 35 02 36 02 37 02
38 02 39 02 3A 02 3B 02 3C 02 3D 02 3E 02 3F 02

Видно, что после того, как команда lpm Tmp,z+ выпонилась в первый раз, ZH сбрасывается в 0 (4 позиция 1 строки в первом дампе EEPROM).


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru