Страница 1 из 1
Загрузка данных из нескольких массивов
Добавлено: Пт май 10, 2013 21:59:15
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, прибавляем нек-рую переменную-счетчик, чтобы загрузить нужное значение, и загружаем данные по обновленному адресу в регистровой паре.
Но возникла проблема с реализацией алгоритма. Помогите, пожалуйста

Re: Загрузка данных из нескольких массивов
Добавлено: Пт май 10, 2013 22:16:58
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
...
Надеюсь этого будет достаточно.

Re: Загрузка данных из нескольких массивов
Добавлено: Пт май 10, 2013 23:43:10
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
Все правильно?
Re: Загрузка данных из нескольких массивов
Добавлено: Сб май 11, 2013 05:04:49
ChipKiller
Попробовал так, но почему-то не работает:
... виной всему ***ная архитектура AVR - вместо
напишите
PS. если массивы имеют одинаковый размер,можно обойтись без
Arrays - вычисляем
Offset=number*ArraySize+sch, где константа
ArraySize - размер массива в байтах и добавляем к адресу 0-го массива
Код: Выделить всё
lpm //загружаем нужный элемент нужного массива в R0
mov temp,R0 //копируем его в temp
out PortB,temp
... temp лишнее - можно сразу
out PortB,r0
Re: Загрузка данных из нескольких массивов
Добавлено: Сб май 11, 2013 07:32:48
BOB51
Вообще-то требуется базово-индексная адресация (база в Z, индекс в регистровых парах R24,X,Y - с предхранением в программном стеке)...
в моей старой вариации автомата светоэффектов подобный способ используется для чтения программы прикладного рисунка (preparing8ul.txt):
фактически - обработка 8-ми массивов для 8-ми независимых процессов одновременно при использовании общих фрагментов в разных массивах
Только осторожно, чтоб не получилось описанное вот тут:
http://radiokot.ru/forum/viewtopic.php?f=20&t=84941 
Re: Загрузка данных из нескольких массивов
Добавлено: Сб май 11, 2013 13:26:28
gauss
В отладчике прогнал, вроде все работает. Но почему адреса массивов нужно умножать на два, если адрес и так двухбайтный и хранится в со-ей ячейке памяти??

Re: Загрузка данных из нескольких массивов
Добавлено: Сб май 11, 2013 15:14:18
ChipKiller
gauss писал(а): Но почему адреса массивов нужно умножать на два, если адрес и так двухбайтный и хранится в со-ей ячейке памяти??
.. потому что память программ организована в слова (16-бит), а не байты (8-бит), в отличии от памяти данных, например, которая адресуется побайтно.
Из-за этого очень легко "наступить на грабли"...

Re: Загрузка данных из нескольких массивов
Добавлено: Сб май 11, 2013 15:39:08
BOB51
Это особенность организации доступа к Памяти Программ у AVRок и других МК с фиксированной длинной команды ...
