Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загадочное число $20 при обращении к РВВ
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
serg_42
В книге А.В.Евстифеева "Микроконтроллеры AVR семеййства Tiny и Mega фирмы ATMEL"
на странице 391 есть любопытный абзац:

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





Сам понять смысл этого действа не смог...
Растолкуйте, пожалуйста, зачем и почему?
Для чего таки надо добовлять эти самые $20 к имени РВВ?
stells
к РВВ можно обратиться как к регистру из пространства ввода-вывода с помощью IN и OUT, так и как к ячейке ОЗУ с помощью ST и LD. во втором случае адрес ячейки нужно сместить на 20
serg_42
Как бы понятно что нужно тупо сместить на 20h...
Непонятно почему, зачем?
Может есть ссылка в даташитах?
stells
Цитата(serg_42 @ Jun 12 2012, 09:17) *
Непонятно почему, зачем?

потому что первые 20 (32) ячеек в пространстве ОЗУ - это РОНы
serg_42
На странице 174 той-же книги нашел ещё одно упоминание про это:



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

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

1)
sts TIMSK0, temp

2)
sts TIMSK0+$20, temp
_Артём_
Цитата(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
serg_42
Ok!
Спасибо большое!
Буду пробовать...
_Артём_
Цитата(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.
RabidRabbit
Всегда пользуюсь in/out. Если компилятор ругается, меняю на lds/sts sm.gif
ILYAUL
Цитата(RabidRabbit @ Jun 13 2012, 11:28) *
Всегда пользуюсь in/out. Если компилятор ругается, меняю на lds/sts sm.gif

Всегда пользуюсь макросами , "забыл" когда нужно использовать in/out ,а когда lds/sts
SSerge
Помнится, эти танцы с бубном вокруг регистров IO меня удивили ещё при первом знакомстве с AVR.

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