Помогите разобраться AVR с командой LPM

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 2
Зарегистрирован: Вс ноя 03, 2019 20:26:36

Сообщение mike-brandy »

Помогите разобраться где собака порылась ?!

Записаны данные в програмный сегмент . НО при чтении команда LPM - регулярно врёт при ємуляции в AVR Studio ..

Прикложу скрин с обманом .

Может кто объяснит , от чего так получается ??? в описаловках НЕ НАШЁЛ ответа на проблемму ....
Вот отрезок проги :

LDI R30 , low (DATA*2)
LDI R31 , high(DATA*2)

LPM R0 , Z+
LPM R1 , Z+
LPM R2 , Z+
LPM R3 , Z+
LPM R4 , Z+
LPM R5 , Z+
LPM R6 , Z+
LPM R7 , Z+
LPM R8 , Z+
LPM R9 , Z+
LPM R10 , Z+
LPM R11 , Z+
LPM R12 , Z+
LPM R13 , Z+
LPM R14 , Z+
LPM R15 , Z+
LPM R16 , Z+
LPM R17 , Z+
LPM R18 , Z+
LPM R19 , Z+
LPM R20 , Z+
LPM R21 , Z+
LPM R22 , Z+
LPM R23 , Z+
LPM R24 , Z+
LPM R26 , Z+
LPM R27 , Z+
LPM R28 , Z+
LPM R29 , Z

NOP
NOP

.CSEG ;
.ORG 0X300 ;

DATA:
.DB 0X01 , 0X02 , 0X03 , 0X04 , 0X05 , 0X06 , 0X07 ;
;
.DB 0X08 , 0X09 , 0X10 , 0X11 , 0X12 , 0X13 , 0X14 ;

.DB 0X15 , 0X16, 0X17 , 0X18 , 0X19 , 0X20 , 0X21 ;

.DB 0X22 , 0X23 , 0X24 , 0X25 , 0X26 , 0X27 , 0X28 ;

.DB 0X29 , 0X30 , 0X31 , 0X32 , 0X33 , 0X34 , 0X35 ;
Вложения
forum.png
(158.3 КБ) 343 скачивания
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Из описания директивы .DB
If the DB directive is given in a Code Segment and the expression-list contains more than one expression, the expressions are packed so that two bytes are placed in each program memory word. If the expression-list contains an odd number of expressions, the last expression will be placed in a program memory word of its own, even if the next line in the assembly code contains a DB directive. The unused half of the program word is set to zero. A warning is given, in order to notify the user that an extra zero byte is added to the .DB statement.
Перепишите таблицу чтобы в строке было четное число байт
Спойлер

Код: Выделить всё

LDI R30 , low (DATA*2)
LDI R31 , high(DATA*2)

LPM R0 , Z+
LPM R1 , Z+
LPM R2 , Z+
LPM R3 , Z+
LPM R4 , Z+
LPM R5 , Z+
LPM R6 , Z+
LPM R7 , Z+
LPM R8 , Z+
LPM R9 , Z+
LPM R10 , Z+
LPM R11 , Z+
LPM R12 , Z+
LPM R13 , Z+
LPM R14 , Z+
LPM R15 , Z+
LPM R16 , Z+
LPM R17 , Z+
LPM R18 , Z+
LPM R19 , Z+
LPM R20 , Z+
LPM R21 , Z+
LPM R22 , Z+
LPM R23 , Z+
LPM R24 , Z+
		LPM R25,Z+; Эта команда пропущена??? Или так сознательно сделано?
LPM R26 , Z+
LPM R27 , Z+
LPM R28 , Z+
LPM R29 , Z

		RJMP	PC
NOP

;.CSEG ;
;.ORG 0X300 ;

;DATA:
;.DB 0X01 , 0X02 , 0X03 , 0X04 , 0X05 , 0X06 , 0X07 ;
;
;.DB 0X08 , 0X09 , 0X10 , 0X11 , 0X12 , 0X13 , 0X14 ;

;.DB 0X15 , 0X16, 0X17 , 0X18 , 0X19 , 0X20 , 0X21 ;

;.DB 0X22 , 0X23 , 0X24 , 0X25 , 0X26 , 0X27 , 0X28 ;

;.DB 0X29 , 0X30 , 0X31 , 0X32 , 0X33 , 0X34 , 0X35 ;

.CSEG ;
.ORG 0X300 ;

DATA:
.DB 0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08 ;
;
.DB 0X09,0X10,0X11,0X12,0X13,0X14,0X15,0X16 ;

.DB 0X22,0X23,0X24,0X17,0X18,0X19,0X20,0X21 ;

.DB 0X29,0X30,0X31,0X32,0X25,0X26,0X27,0X28 ;

.DB 0X33,0X34,0X35,0x00 ;
.exit
Реклама
Родился
Сообщения: 2
Зарегистрирован: Вс ноя 03, 2019 20:26:36

Сообщение mike-brandy »

Отлично !!!!!!!!!!!!!!
Спасибо за подсказку .
Переписывать таблицу не реально .....
она более половины всей памяти , и разрисована битами , это для понимания я написал попроще .
значит всё остаётся как сегодня , отслеживам 7-ое чтение и игнорируем 8-ое .......
Ещё раз спасибо !

P.S . (перевод подсказки - может пригодиться многим )
Если директива DB задана в сегменте кода, а список выражений содержит более одного выражения, выражения упаковываются так, что в каждое слово памяти программы помещается два байта. Если список выражений содержит нечетное количество выражений, последнее выражение будет помещено в собственное слово памяти программы, даже если следующая строка в коде сборки содержит директиву DB. Неиспользованная половина слова программы установлена на ноль. Выдается предупреждение, чтобы уведомить пользователя о том, что в инструкцию .DB добавлен дополнительный нулевой байт.
Ответить

Вернуться в «AVR»