реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Работа с опреативной памятью в AVR ASM
_Bill
сообщение Jan 22 2011, 06:06
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(HoboTech @ Jan 21 2011, 15:19) *
И все таки туго что-то до меня доходит работа с адресами...
что означает следующий код:
Код
.DSEG
tmp: .byte 1

...

lds ZL,tmp

что я заношу в регистр ZL значение байта, который находился в памяти по адресу tmp или что я записываю значение младшего байта самого адреса? sad.gif

В регистр ZL загружается содержимое ячейки памяти с адресом tmp. Если вы хотите загрузить в ZL адрес ячейки, используйте команду LDI. Все ваши проблемы возникают от того, что вы путаете различные методы адресации. В ассемблере AVR различные методы адресации определяются с помощью различных мнемоник.
Код
    ldi   r16, 5    ; Непосредственная (immediate) адресация - загрузка числа 5
    lds  r16, 5        ; Прямая (direct) адресация - загрузка в регистр r16 содержимого ячейки по адресу 5
    ld    r16, Z    ; Косвенная (indirect) адресация - загрузка в регистр r16 через указатель Z
    ld    r16, Z+     ; Автоинкрементная (post increment) адресация через указатель Z
    ld    r16, Z-      ; Автодекрементная (pre decrement) адресация через указатель Z
    ldd  r16, z+5    ;  Косвенная со смещением (inditect with displscement) адресация через указатель Z
                        ; адрес ячейки памяти определяется как сумма содержимого указателя Z и числа 5

Надеюсь, что немного прояснил ситуацию. Или нет?

Сообщение отредактировал _Bill - Jan 22 2011, 06:07
Go to the top of the page
 
+Quote Post
HoboTech
сообщение Jan 24 2011, 08:42
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762



Про lds и ldi я понял, спасибо. Не понял что именно загружается (значение или адрес) в этих строках:
Цитата(_Bill @ Jan 22 2011, 08:06) *
ld r16, Z ; Косвенная (indirect) адресация - загрузка в регистр r16 через указатель Z
ld r16, Z+ ; Автоинкрементная (post increment) адресация через указатель Z
ld r16, Z- ; Автодекрементная (pre decrement) адресация через указатель Z
ldd r16, z+5 ; Косвенная со смещением (inditect with displscement) адресация через указатель Z
; адрес ячейки памяти определяется как сумма содержимого указателя Z и числа 5[/code]


P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся.

Сообщение отредактировал HoboTech - Jan 24 2011, 08:44
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 24 2011, 09:20
Сообщение #18


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(HoboTech @ Jan 24 2011, 12:42) *
P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся.

Вы считаете это чем-то из ряда вон, что при освоении нового материала надо приложить некоторые усилия?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 24 2011, 09:57
Сообщение #19


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(HoboTech @ Jan 24 2011, 11:42) *
Не понял что именно загружается (значение или адрес) в этих строках:

Для AVR в строках где нет никаких цифирей происходит косвенное обращение к данным (чтение или запись).
Адрес сидит внутри регистровой пары и его в коде операции не видно - поэтому такой тип адресации и называется косвенным (через индексные регистры X,Y,Z).
Смею предположить, что без такого способа адресации программирования, как мы его сегодня знаем, не существовало.
Так что изучите это очень внимательно! Основа основ как-никак:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 24 2011, 11:08
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(_Bill @ Jan 22 2011, 09:06) *
В регистр ZL загружается содержимое ячейки памяти с адресом tmp. Если вы хотите загрузить в ZL адрес ячейки, используйте команду LDI. Все ваши проблемы возникают от того, что вы путаете различные методы адресации. В ассемблере AVR различные методы адресации определяются с помощью различных мнемоник.
Код
        ld    r16, Z-    ; Автодекрементная (pre decrement) адресация через указатель Z
Просто правка  LD R16 ,-Z


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 24 2011, 12:35
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(HoboTech @ Jan 24 2011, 12:42) *
Про lds и ldi я понял, спасибо. Не понял что именно загружается (значение или адрес) в этих строках:


P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся.

Методы адресации - это один из трех китов, на которых держится архитектура любого процессора (AVR в том числе). Так что стоит затратить время, чтобы разобраться с адресацией. В дальнейшем эти знания скорее всего вам понадобятся. Что касается семейства AVR, то советую внимательнее почитать сей документ Система команд AVR
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 24 2011, 13:42
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Можно , так же открыть Ефремова . Почитать главу "Способы адресации памяти данных"


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
HoboTech
сообщение Jan 24 2011, 14:06
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762



Спасибо за ответы. Еще почитаю, наверняка возникнут вопросы, задам их тут.
Go to the top of the page
 
+Quote Post
нечитатель
сообщение Jan 26 2011, 00:54
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 20-11-10
Пользователь №: 61 032



Не считая полезным занятием переписывание собственными словами документа "AVR Instruction Set", обратил бы внимание на:
Код
ldi XH, high(addr)
ldi XL, low(addr)
cli                                  ; !!!
ld R16, X+
ld R17, X
sei                                  ; !!!

В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

Где-то умнее излагается о, но ссылку либо название затрудняюсь.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 26 2011, 04:02
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(нечитатель @ Jan 26 2011, 04:54) *
Не считая полезным занятием переписывание собственными словами документа "AVR Instruction Set", обратил бы внимание на:
Код
ldi XH, high(addr)
ldi XL, low(addr)
cli                                 ; !!!
ld R16, X+
ld R17, X
sei                                 ; !!!

В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

Где-то умнее излагается о, но ссылку либо название затрудняюсь.

Это как?! 05.gif
Go to the top of the page
 
+Quote Post
V_G
сообщение Jan 26 2011, 05:01
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(нечитатель @ Jan 26 2011, 10:54) *
если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

Где-то умнее излагается о, но ссылку либо название затрудняюсь.

Если бы так было, это следовало бы писать красными большими буквами 32 кегля во всех документах, а Атмел давно бы заклевали конкуренты. Так что ссылку в студию, начнем клевать...

Может, вы спутали с загрузкой 2-байтных регистров с использованием внутренних защелок и жесткими требованиями к таймингам? Это есть, и во всех pdf-ках есть отдельный параграф про работу с 16-разрядными регистрами.
Go to the top of the page
 
+Quote Post
OlegNZH
сообщение Jan 26 2011, 05:04
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782



Цитата(нечитатель @ Jan 26 2011, 03:54) *
В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

Где-то умнее излагается о, но ссылку либо название затрудняюсь.


sm.gif ну во-первых , после ld R16, X+ прерывание не может произойти , а во-вторых-что за диверсант будет портить регистр X ?

upd.Аааааа - V_G понял откуда ноги растут... sm.gif

Цитата...
Доступ к 16-разрядным регистрам

Регистры TCNTn, OCRnA/B/C и ICRn являются 16-разрядными, поэтому, доступ к ним через 8-разр. шину данных AVR ЦПУ может быть осуществлен с помощью двух инструкций чтения или записи. У каждого 16-разр. таймера имеется свой 8-разр. регистр для временного хранения старшего байта данных. Поэтому, во время доступа к 16-разр. регистрам одного таймера используется один и тот же временный регистр...

...Не все 16-разрядные регистры используют временный регистр для копирования старшего байта. Чтение 16-разр. регистров OCRnA/B/C не связано с использованием временного регистра...

...При этом следует обратить внимание на проблему, которая связана с необходимостью выполнения двух инструкций для получения доступа к 16-разр. регистру. Если после выполнения первой инструкции доступа 16-разр. регистра происходит прерывание и в процедуре обработки прерывания также происходит обновление этого же или другого регистра, но относящегося к тому же таймеру, то по завершении обработки прерывания изменяется содержимое временного регистра и выполнение второй инструкции приведет к некорректному результату. Таким образом, когда и в основной программе и в прерываниях происходит обновление временного регистра, то в основной программе перед инициацией доступа к 16-разр. регистру необходимо запретить прерывания...
Конец Цитаты.

Сообщение отредактировал OlegNZH - Jan 26 2011, 05:44
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 26 2011, 05:46
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(OlegNZH @ Jan 26 2011, 09:04) *
sm.gif ну во-первых , после ld R16, X+ прерывание не может произойти , а во-вторых-что за диверсант будет портить регистр X ?

upd.Аааааа - я понял откуда ноги растут...

Ну, во-первых, прерывание может произойти когда угодно, но переход к прерыванию начинается только после выполнения текущей инструкции. Что касается доступа к 16-разрядным портам ВВ, то это совсем другая история.

Сообщение отредактировал _Bill - Jan 26 2011, 05:47
Go to the top of the page
 
+Quote Post
OlegNZH
сообщение Jan 26 2011, 06:02
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782



Цитата(_Bill @ Jan 26 2011, 08:46) *
Ну, во-первых, прерывание может произойти когда угодно, но переход к прерыванию начинается только после выполнения текущей инструкции. Что касается доступа к 16-разрядным портам ВВ, то это совсем другая история.

Вообще-то я- про конкретную конструкцию говорил
cli ; !!!
ld R16, X+
А регистры XYZ к прерываниям никаким боком...Здесь речь может идти только о регистрах ВВ.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 26 2011, 06:12
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(OlegNZH @ Jan 26 2011, 10:02) *
Вообще-то я- про конкретную конструкцию говорил
cli ; !!!
ld R16, X+

На целостность выполнения инструкции ld R16, X+ запрет или разрешение прерываний никоим образом не повлияют. С таким же успехом можно использовать и такую конструкцию
Код
     sei                            ; !!!
     ld     R16, X+


Сообщение отредактировал _Bill - Jan 26 2011, 06:14
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01524 секунд с 7
ELECTRONIX ©2004-2016