С данными в памяти программ AVR работать можно при помощи команд LPM и LPM Rx,Z+
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено BLACKEAGLE 18 мая 2003 г. 23:52
В ответ на: Как быстрее работать с данными в памяти програм AVR отправлено Retex 18 мая 2003 г. 22:01

Скорость выполнения этих команд - 3 цикла (187.5 нсек на 16-ти мегагерцах). Готов спорить, что сам обмен с устройством займет не меньше, а то и гораздо больше времени в зависимости от интерфейса.

Типовая процедура может выглядеть так:


InitDevice_1:
ldi zl,low(2*StartOfInitBlock_1)
ldi zh,high(2*StartOfInitBlock_1) ;Байтовый адрес начала блока данных для Device_1
ldi r16,LengthOfInitBlock_1 ;Длина этого блока
cbi portb,ChipEnableDevice_1 ;Активируем /ChipEnable для Device_1
init_lp1:
lpm r1,z+ ;Читаем байт, двигаем указатель дальше
out porta,r1 ;Выставляем байт в порт
sbi portb,DataStrobeDevice_1 ;Даем _|_ строб
cbi portb,DataStrobeDevice_1
dec r16
brne init_lp1 ;Повторяем до конца блока
sbi portb,ChipEnableDevice_1 ;Снимаем /ChipEnable для Device_1

InitDevice_2:
ldi zl,low(2*StartOfInitBlock_2)
ldi zh,high(2*StartOfInitBlock_2) ;Байтовый адрес начала блока данных для Device_2
ldi r16,LengthOfInitBlock_2 ;Длина этого блока
cbi portb,ChipEnableDevice_2 ;Активируем /ChipEnable для Device_2
init_lp2:
lpm r1,z+ ;Читаем байт, двигаем указатель дальше
out porta,r1 ;Выставляем байт в порт
sbi portb,DataStrobe ;Даем _|_ строб
cbi portb,DataStrobe
dec r16
brne init_lp2 ;Повторяем до конца блока
sbi portb,ChipEnableDevice_2 ;Снимаем /ChipEnable для Device_2
InitDevice_3:
ldi zl,low(2*StartOfInitBlock_3) ;Все то же самое для Device_3
...
...
ret

В этом на лету сочиненном простейшем примере подразумевается, что все устройства имеют байтовый параллельный интерфейс, ногу Strobe и ногу /ChipEnable. Данные и стробы объединены, /ChipEnable - раздельны. Имена переменных дал самообъясняющие. Данные идут в porta, строб и /CE - в portb (разумеется, порты должны быть сконфигурированы на выход). Если в девайсы нужно загонять больше, чем по 256 байт за один присест, вместо r16 надо использовать двойной регистр из верхней восьмерки, кроме z (например, r24), а вместо команды DEC R16 - команду SBIW R24,1.

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

Ответы



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

E-mail: info@telesys.ru