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

 
 
 
Reply to this topicStart new topic
> Загадочное число $20 при обращении к РВВ
serg_42
сообщение Jun 12 2012, 04:38
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 26-09-11
Из: Новокузнецк
Пользователь №: 67 380



В книге А.В.Евстифеева "Микроконтроллеры AVR семеййства Tiny и Mega фирмы ATMEL"
на странице 391 есть любопытный абзац:

"Необходимо только помнить, что если для обращения к регистру
ввода/вывода используется команда обмена с ОЗУ, то к символическому
имени требуется добавить число $20".





Сам понять смысл этого действа не смог...
Растолкуйте, пожалуйста, зачем и почему?
Для чего таки надо добовлять эти самые $20 к имени РВВ?
Go to the top of the page
 
+Quote Post
stells
сообщение Jun 12 2012, 04:59
Сообщение #2


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



к РВВ можно обратиться как к регистру из пространства ввода-вывода с помощью IN и OUT, так и как к ячейке ОЗУ с помощью ST и LD. во втором случае адрес ячейки нужно сместить на 20
Go to the top of the page
 
+Quote Post
serg_42
сообщение Jun 12 2012, 05:17
Сообщение #3





Группа: Участник
Сообщений: 9
Регистрация: 26-09-11
Из: Новокузнецк
Пользователь №: 67 380



Как бы понятно что нужно тупо сместить на 20h...
Непонятно почему, зачем?
Может есть ссылка в даташитах?

Сообщение отредактировал serg_42 - Jun 12 2012, 05:19
Go to the top of the page
 
+Quote Post
stells
сообщение Jun 12 2012, 06:28
Сообщение #4


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



Цитата(serg_42 @ Jun 12 2012, 09:17) *
Непонятно почему, зачем?

потому что первые 20 (32) ячеек в пространстве ОЗУ - это РОНы

Сообщение отредактировал stells - Jun 12 2012, 06:29
Go to the top of the page
 
+Quote Post
serg_42
сообщение Jun 12 2012, 07:33
Сообщение #5





Группа: Участник
Сообщений: 9
Регистрация: 26-09-11
Из: Новокузнецк
Пользователь №: 67 380



На странице 174 той-же книги нашел ещё одно упоминание про это:



Что-то теперь я совсем запутался.

Допустим, имеем РОН TIMSK0.
Для Atmega168 его адрес $6E, т.е. для команд IN и OUT он недоступен.
В каком случае мы до него "достучимся" правильно (в 1-м или во 2-м)?

1)
sts TIMSK0, temp

2)
sts TIMSK0+$20, temp
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 12 2012, 07:42
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(serg_42 @ Jun 12 2012, 10:33) *
В каком случае мы до него "достучимся" правильно (в 1-м или во 2-м)?

1)
sts TIMSK0, temp

2)
sts TIMSK0+$20, temp

Зависит от того как определён TIMSK0.
Если так(а по другому его нет смысла определять - он через IN/OUT недоступен):

Код
#define TIMSK0 0x6E

то так:
Код
sts    TIMSK0, temp
Go to the top of the page
 
+Quote Post
serg_42
сообщение Jun 12 2012, 07:51
Сообщение #7





Группа: Участник
Сообщений: 9
Регистрация: 26-09-11
Из: Новокузнецк
Пользователь №: 67 380



Ok!
Спасибо большое!
Буду пробовать...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 12 2012, 07:56
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(serg_42 @ Jun 12 2012, 10:33) *
Допустим, имеем РОН TIMSK0.
Для Atmega168 его адрес $6E, т.е. для команд IN и OUT он недоступен.
В каком случае мы до него "достучимся" правильно (в 1-м или во 2-м)?


P.S. TIMSK0 в данном случае нипричом: рез о регистрах доступных как ОЗУ через st/ld и in/out одновременно, например для м168 это PORTB (0x05). В In/out адрес 0x05 в st/ld 0x25.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jun 13 2012, 07:28
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Всегда пользуюсь in/out. Если компилятор ругается, меняю на lds/sts sm.gif
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jun 13 2012, 09:39
Сообщение #10


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

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



Цитата(RabidRabbit @ Jun 13 2012, 11:28) *
Всегда пользуюсь in/out. Если компилятор ругается, меняю на lds/sts sm.gif

Всегда пользуюсь макросами , "забыл" когда нужно использовать in/out ,а когда lds/sts


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

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jun 14 2012, 13:57
Сообщение #11


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Помнится, эти танцы с бубном вокруг регистров IO меня удивили ещё при первом знакомстве с AVR.

Нет, чтобы как все нормальные люди, определить в .inc эти регистры как адреса памяти, а ассемблер научить при обработке команд обращения к IO регистрам самостоятельно вычитать эти $20 и помещать результат в соответствующее 5-битное поле в команде.
Тогда эти определения можно смело использовать повсюду в программе, в любых командах, а про несчастные $20 вообще нигде ни писать в программе ни упоминать в документации нет необходимости, разве что при описании формата команд.
Да ещё и проконтролировать можно будет, выдать ошибку при попытке использовать IO-команды для доступа к регистрам за пределами области IO.
Вместо этого какой-то цирк с конями на ровном месте.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:25
Рейтинг@Mail.ru


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