Загрузка данных из нескольких массивов

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Загрузка данных из нескольких массивов

Сообщение gauss »

Допустим, у нас есть несколько массивов, и в зависимости от ситуации нужно загружать данные из одного из них.
На ум приходит примерно следующее:

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

Arrays:
.dw Array1,Array2,Array3
Array1:	//любые данные в кол-ве [10;200]
.db 0b00001000,0b00000100,0b00000010,0b00001100,0b11110000,0b00001000,0b00000100,0b00000100
Array2:	//любые данные в кол-ве [10;200]
.db 0,0,0b01111100,0b01000100,0b01111100,0,0,0
Array3:	//любые данные в кол-ве [10;200]
.db 0b00100000,0b01000000,0b11111111,0,0b01000111,0b10001001,0b01110001,0b00000001
Загружаем в регистровую пару Z адрес массива из таблицы Arrays, прибавляем нек-рую переменную-счетчик, чтобы загрузить нужное значение, и загружаем данные по обновленному адресу в регистровой паре.
Но возникла проблема с реализацией алгоритма. Помогите, пожалуйста :)
:idea:
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Загрузка данных из нескольких массивов

Сообщение Kavka »

8-bit AVR Instruction Set
Пример из описания команды LPM.

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

Example:
ldi  ZH, high(Table_1<<1); Initialize Z-pointer
ldi  ZL, low(Table_1<<1)
lpm  r16, Z
; Load constant from Program
; Memory pointed to by Z (r31:r30)
...
Table_1:
.dw 0x5876
; 0x76 is addresses when ZLSB = 0
; 0x58 is addresses when ZLSB = 1
...
Надеюсь этого будет достаточно. :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Re: Загрузка данных из нескольких массивов

Сообщение gauss »

Попробовал так, но почему-то не работает:

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

//начало
ldi ZH,high(Arrays*2)
ldi ZL,low(Arrays*2)
lsl number  //number - номер массива, из которого мы должны загружать
ldi r17,0
add ZL,number
adc ZH,r17
lpm r16,Z+
lpm r17,Z  //загружаем адрес нужного массива, вернее, адрес первого элемента из этого массива
movw ZH:ZL,r17:r16  //помещаем его в РП Z
ldi r17,0
add ZL,sch  //sch - переменная, которая будет определять номер загружаемого элемента
adc ZH,r17
lpm  //загружаем нужный элемент нужного массива в R0
mov temp,R0 //копируем его в temp
out PortB,temp 
//конец программы
Arrays:
.dw Array1,Array2,Array3
Array1:   //любые данные в кол-ве [10;200]
.db 0b00001000,0b00000100,0b00000010,0b00001100,0b11110000,0b00001000,0b00000100,0b00000100
Array2:   //любые данные в кол-ве [10;200]
.db 0,0,0b01111100,0b01000100,0b01111100,0,0,0
Array3:   //любые данные в кол-ве [10;200]
.db 0b00100000,0b01000000,0b11111111,0,0b01000111,0b10001001,0b01110001,0b00000001
Все правильно?
:idea:
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Загрузка данных из нескольких массивов

Сообщение ChipKiller »

Попробовал так, но почему-то не работает:
... виной всему ***ная архитектура AVR - вместо

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

Arrays:
.dw Array1,Array2,Array3
напишите

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

Arrays:
.dw Array1*2,Array2*2,Array3*2
PS. если массивы имеют одинаковый размер,можно обойтись без Arrays - вычисляем Offset=number*ArraySize+sch, где константа ArraySize - размер массива в байтах и добавляем к адресу 0-го массива

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

lpm  //загружаем нужный элемент нужного массива в R0
mov temp,R0 //копируем его в temp
out PortB,temp 
... temp лишнее - можно сразу out PortB,r0
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Загрузка данных из нескольких массивов

Сообщение BOB51 »

Вообще-то требуется базово-индексная адресация (база в Z, индекс в регистровых парах R24,X,Y - с предхранением в программном стеке)...
в моей старой вариации автомата светоэффектов подобный способ используется для чтения программы прикладного рисунка (preparing8ul.txt):
nv8_avr.rar
(339.69 КБ) 163 скачивания
фактически - обработка 8-ми массивов для 8-ми независимых процессов одновременно при использовании общих фрагментов в разных массивах
8)
Только осторожно, чтоб не получилось описанное вот тут:
http://radiokot.ru/forum/viewtopic.php?f=20&t=84941 :facepalm:
Реклама
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Re: Загрузка данных из нескольких массивов

Сообщение gauss »

В отладчике прогнал, вроде все работает. Но почему адреса массивов нужно умножать на два, если адрес и так двухбайтный и хранится в со-ей ячейке памяти?? :shock:
:idea:
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Загрузка данных из нескольких массивов

Сообщение ChipKiller »

gauss писал(а): Но почему адреса массивов нужно умножать на два, если адрес и так двухбайтный и хранится в со-ей ячейке памяти??
.. потому что память программ организована в слова (16-бит), а не байты (8-бит), в отличии от памяти данных, например, которая адресуется побайтно.

Из-за этого очень легко "наступить на грабли"... :)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Загрузка данных из нескольких массивов

Сообщение BOB51 »

Это особенность организации доступа к Памяти Программ у AVRок и других МК с фиксированной длинной команды ... :cry:
Ответить

Вернуться в «Разные вопросы по МК»