Например TDA7294

Форум РадиоКот • Просмотр темы - Чтение массива из памяти
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пт фев 06, 2026 20:59:49

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 10 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Чтение массива из памяти
СообщениеДобавлено: Чт ноя 25, 2010 15:03:50 
Открыл глаза

Зарегистрирован: Чт окт 21, 2010 10:05:27
Сообщений: 66
Рейтинг сообщения: 0
Добрый день!
Помогите пожалуйста создать код считывания массива из памяти с начала массива данных и с его конца.
мой массив:
massiv:
.DB 0x00,0x18,0x3C,0x7E,0xFF,0x7E,0x3C,0x18

Нашел пару примеров, но ничего не понимаю, каков же алгоритм считывания((
И в чем отличие например между ldi ZH, High(Array*2) и ldi ZH,High(Array<<1)? Что означает lpm Z+?

Заранее, спасибо!


Вложения:
Комментарий к файлу: Примеры, которые видел
Чтение массива.txt [1.56 KiB]
Скачиваний: 276
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Чтение массива из памяти
СообщениеДобавлено: Чт ноя 25, 2010 16:16:29 
Вымогатель припоя
Аватар пользователя

Карма: 3
Рейтинг сообщений: 4
Зарегистрирован: Сб сен 20, 2008 12:12:30
Сообщений: 525
Откуда: Minsk
Рейтинг сообщения: 0
ldi ZH, High(Array*2) и ldi ZH,High(Array<<1) это разные формы записи одного и того же.
lpm Z+ означает, что после чтения байта из массива значение ZH:ZL увеличится на единицу.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Чтение массива из памяти
СообщениеДобавлено: Пт ноя 26, 2010 13:54:43 
Открыл глаза

Зарегистрирован: Чт окт 21, 2010 10:05:27
Сообщений: 66
Рейтинг сообщения: 0
Понял!
Но каков алгоритм прочтения его обратно?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Чтение массива из памяти
СообщениеДобавлено: Пт ноя 26, 2010 13:58:30 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2119
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18457
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Slavast писал(а):
Понял!
Но каков алгоритм прочтения его обратно?

не смешите мои тапки! какой еще алгоритм, кроме:
1 задали в Z адрес начала массива
2 считали значение по адресу Z
3 увеличили Z - т.е. взяли адрес следующего
4 если все данные не считаны - перешли к п.2

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Чтение массива из памяти
СообщениеДобавлено: Пт ноя 26, 2010 14:08:18 
Открыл глаза

Зарегистрирован: Чт окт 21, 2010 10:05:27
Сообщений: 66
Рейтинг сообщения: 0
ARV писал(а):
Slavast писал(а):
Понял!
Но каков алгоритм прочтения его обратно?

не смешите мои тапки! какой еще алгоритм, кроме:
1 задали в Z адрес начала массива
2 считали значение по адресу Z
3 увеличили Z - т.е. взяли адрес следующего
4 если все данные не считаны - перешли к п.2


Я хочу считывать массив

massiv:
.DB 0x00,0x18,0x3C,0x7E,0xFF,0x7E,0x3C,0x18

не с начала, а с конца. Как это сделать на вычитание?

Вот есть алгоритм, но он не работает:((
выдает ошибку на команде lpm r16,-Z :(((



equ ret = 8

ldi ZH,high(massiv*2)
ldi ZL,low(massiv*2)
ldi r17, ret
clr r16
add ZL,r17
adc ZH,r16
read_massiv:
lpm r16,-Z
dec r17
brne read_massiv

massiv: .db 0x00,0x18,0x3C,0x7E,0xFF,0x7E,0x3C,0x18


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Чтение массива из памяти
СообщениеДобавлено: Пт ноя 26, 2010 14:12:13 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 238
Зарегистрирован: Пт янв 29, 2010 10:27:40
Сообщений: 3868
Откуда: Москва
Рейтинг сообщения: 0
ARV писал(а):
какой еще алгоритм, кроме:


Человеку вроде надо и в обратном порядке считать...
Так как команда LPM не работает с аргументом "-Z" считывать надо в две команды, примерно так:

Код:
...
Read_Massiv:
LPM R16,Z  ; чтение без изменения Z
SBIW ZH:ZL,0x01 ;уменьшение Z на 1
DEC R17
...


Если весь массив лежит в пределах адресов XX00-XXFF, то можно вместо SBIW сделать просто DEC ZL (на 1 такт быстрее).
Или написать тот же массив задом наперед и читать просто LPM R16,Z+ (если быстродействие важнее)
Если есть свободная память - загрузить массив туда при старте, команды LD понимают аргументы с минусом и работают быстрее.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Чтение массива из памяти
СообщениеДобавлено: Пт ноя 26, 2010 14:25:56 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2119
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18457
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Engineer_Keen писал(а):
Человеку вроде надо и в обратном порядке считать...
ну простите... человеку надо было все лекции посещать, и книжки умные читать :)))

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Чтение массива из памяти
СообщениеДобавлено: Пт ноя 26, 2010 15:14:39 
Открыл глаза

Зарегистрирован: Чт окт 21, 2010 10:05:27
Сообщений: 66
Рейтинг сообщения: 0
Engineer_Keen писал(а):
ARV писал(а):
какой еще алгоритм, кроме:


Человеку вроде надо и в обратном порядке считать...
Так как команда LPM не работает с аргументом "-Z" считывать надо в две команды, примерно так:

Код:
...
Read_Massiv:
LPM R16,Z  ; чтение без изменения Z
SBIW ZH:ZL,0x01 ;уменьшение Z на 1
DEC R17
...


Если весь массив лежит в пределах адресов XX00-XXFF, то можно вместо SBIW сделать просто DEC ZL (на 1 такт быстрее).
Или написать тот же массив задом наперед и читать просто LPM R16,Z+ (если быстродействие важнее)
Если есть свободная память - загрузить массив туда при старте, команды LD понимают аргументы с минусом и работают быстрее.



УРАААА!!!! Получилось!!!!!! Эврика!))

SBIW ZH:ZL,0x01 ;уменьшение Z на 1
LPM R16,Z ; чтение без изменения Z

Заработало!!!!!

Engineer_Keen, огромнейшее спасибо!

Вот у вас есть интересный способ - если есть свободная память -> загрузить массив туда при старте. Это каким образом можно было бы сделать?
И еще - как мне узнать впределах каких адресов лежит моя программа? Я использую AVR Studio - это там надо смотреть?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Чтение массива из памяти
СообщениеДобавлено: Пт ноя 26, 2010 15:31:27 
Открыл глаза

Зарегистрирован: Чт окт 21, 2010 10:05:27
Сообщений: 66
Рейтинг сообщения: 0
Slavast писал(а):
Engineer_Keen писал(а):
ARV писал(а):
какой еще алгоритм, кроме:


Человеку вроде надо и в обратном порядке считать...
Так как команда LPM не работает с аргументом "-Z" считывать надо в две команды, примерно так:

Код:
...
Read_Massiv:
LPM R16,Z  ; чтение без изменения Z
SBIW ZH:ZL,0x01 ;уменьшение Z на 1
DEC R17
...


Если весь массив лежит в пределах адресов XX00-XXFF, то можно вместо SBIW сделать просто DEC ZL (на 1 такт быстрее).
Или написать тот же массив задом наперед и читать просто LPM R16,Z+ (если быстродействие важнее)
Если есть свободная память - загрузить массив туда при старте, команды LD понимают аргументы с минусом и работают быстрее.



УРАААА!!!! Получилось!!!!!! Эврика!))

SBIW ZH:ZL,0x01 ;уменьшение Z на 1
LPM R16,Z ; чтение без изменения Z

Заработало!!!!!

Engineer_Keen, огромнейшее спасибо!

Если есть свободная память -> загрузить массив туда при старте. Это с помощью каких операторов можно было бы сделать?
И еще - как мне узнать впределах каких адресов лежит моя программа?
RESPECT.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Чтение массива из памяти
СообщениеДобавлено: Пт ноя 26, 2010 16:39:15 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 238
Зарегистрирован: Пт янв 29, 2010 10:27:40
Сообщений: 3868
Откуда: Москва
Рейтинг сообщения: 0
Slavast писал(а):
Если есть свободная память -> загрузить массив туда при старте. Это с помощью каких операторов можно было бы сделать?


Вначале определить место в памяти:
Код:
.dseg ;сегмент ОЗУ
.org 0x60 ;начинается обычно после 0x60
array1:   .byte   10 ;размер массива 10 байт


при старте перенести массив побайтно из флеша в ОЗУ командами LMP R16,Z - ST X+,R16 (регистр X инициализировать адресом array1)

Slavast писал(а):
И еще - как мне узнать впределах каких адресов лежит моя программа?

Запустить отладку и в меню выбрать дизассемблер, там адреса видно.
Можно задать принудительно директивой .ORG прямо перед строкой с "massiv:"


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y