| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Чтение массива из памяти https://radiokot.ru/forum/viewtopic.php?f=20&t=38291 |
Страница 1 из 1 |
| Автор: | Slavast [ Чт ноя 25, 2010 15:03:50 ] | ||
| Заголовок сообщения: | Чтение массива из памяти | ||
Добрый день! Помогите пожалуйста создать код считывания массива из памяти с начала массива данных и с его конца. мой массив: massiv: .DB 0x00,0x18,0x3C,0x7E,0xFF,0x7E,0x3C,0x18 Нашел пару примеров, но ничего не понимаю, каков же алгоритм считывания(( И в чем отличие например между ldi ZH, High(Array*2) и ldi ZH,High(Array<<1)? Что означает lpm Z+? Заранее, спасибо!
|
|||
| Автор: | Liv [ Чт ноя 25, 2010 16:16:29 ] |
| Заголовок сообщения: | Re: Чтение массива из памяти |
ldi ZH, High(Array*2) и ldi ZH,High(Array<<1) это разные формы записи одного и того же. lpm Z+ означает, что после чтения байта из массива значение ZH:ZL увеличится на единицу. |
|
| Автор: | Slavast [ Пт ноя 26, 2010 13:54:43 ] |
| Заголовок сообщения: | Re: Чтение массива из памяти |
Понял! Но каков алгоритм прочтения его обратно? |
|
| Автор: | ARV [ Пт ноя 26, 2010 13:58:30 ] |
| Заголовок сообщения: | Re: Чтение массива из памяти |
Slavast писал(а): Понял! Но каков алгоритм прочтения его обратно? не смешите мои тапки! какой еще алгоритм, кроме: 1 задали в Z адрес начала массива 2 считали значение по адресу Z 3 увеличили Z - т.е. взяли адрес следующего 4 если все данные не считаны - перешли к п.2 |
|
| Автор: | Slavast [ Пт ноя 26, 2010 14:08:18 ] |
| Заголовок сообщения: | Re: Чтение массива из памяти |
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 |
|
| Автор: | Engineer_Keen [ Пт ноя 26, 2010 14:12:13 ] |
| Заголовок сообщения: | Re: Чтение массива из памяти |
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 понимают аргументы с минусом и работают быстрее. |
|
| Автор: | ARV [ Пт ноя 26, 2010 14:25:56 ] |
| Заголовок сообщения: | Re: Чтение массива из памяти |
Engineer_Keen писал(а): Человеку вроде надо и в обратном порядке считать... ну простите... человеку надо было все лекции посещать, и книжки умные читать |
|
| Автор: | Slavast [ Пт ноя 26, 2010 15:14:39 ] |
| Заголовок сообщения: | Re: Чтение массива из памяти |
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 - это там надо смотреть? |
|
| Автор: | Slavast [ Пт ноя 26, 2010 15:31:27 ] |
| Заголовок сообщения: | Re: Чтение массива из памяти |
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. |
|
| Автор: | Engineer_Keen [ Пт ноя 26, 2010 16:39:15 ] |
| Заголовок сообщения: | Re: Чтение массива из памяти |
Slavast писал(а): Если есть свободная память -> загрузить массив туда при старте. Это с помощью каких операторов можно было бы сделать? Вначале определить место в памяти: Код: .dseg ;сегмент ОЗУ .org 0x60 ;начинается обычно после 0x60 array1: .byte 10 ;размер массива 10 байт при старте перенести массив побайтно из флеша в ОЗУ командами LMP R16,Z - ST X+,R16 (регистр X инициализировать адресом array1) Slavast писал(а): И еще - как мне узнать впределах каких адресов лежит моя программа? Запустить отладку и в меню выбрать дизассемблер, там адреса видно. Можно задать принудительно директивой .ORG прямо перед строкой с "massiv:" |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


