Раскуривание даташита на ATmega32

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

Учусь правильно понимать, что мне нужно найти в даташите и как это там искать. Естесственно, при прочтении английского текста моя голова выдаёт мне русскоязычный перевод. Но, т.к. это всё же тех. документация, а не художественная литература, не могу быть до конца уверенным, что перевод получил верный. Поэтому тут буду выкладывать куски оригинального мануала и то, что я перевёл, с целью проверки.

И попутно буду спрашивать о непонятном. Надеюсь, вы поможете :)

Вот, начало.

Stack Pointer. Страница даташита 12.

Оригинал.
СпойлерStack Pointer The Stack is mainly used for storing temporary data, for storing local variables and for
storing return addresses after interrupts and subroutine calls. The Stack Pointer Register
always points to the top of the Stack. Note that the Stack is implemented as growing
from higher memory locations to lower memory locations. This implies that a Stack
PUSH command decreases the Stack Pointer.
The Stack Pointer points to the data SRAM Stack area where the Subroutine and Interrupt
Stacks are located. This Stack space in the data SRAM must be defined by the
program before any subroutine calls are executed or interrupts are enabled. The Stack
Pointer must be set to point above $60. The Stack Pointer is decremented by one when
data is pushed onto the Stack with the PUSH instruction, and it is decremented by two
when the return address is pushed onto the Stack with subroutine call or interrupt. The
Stack Pointer is incremented by one when data is popped from the Stack with the POP
instruction, and it is incremented by two when data is popped from the Stack with return
from subroutine RET or return from interrupt RETI.
The AVR Stack Pointer is implemented as two 8-bit registers in the I/O space. The number
of bits actually used is implementation dependent. Note that the data space in some
implementations of the AVR architecture is so small that only SPL is needed. In this
case, the SPH Register will not be present.
Перевод.
СпойлерВ основном Стэк используется для хранения временных данных, локальных переменных и адресов прерываний или подпрограмм, для возврата на это место после их обработки.
The Stack Pointer Register (Регистр указателя Стэка) всегда устанавливается в начале стэка.
Обратите внимание, что Стэк реализован от старших ячеек памяти к младшим. Это значит что команда PUSH уменьшает указатель стэка.
Указатель Стэка указывает на область Стэка в ОЗУ, где расположены подпорграммы и прерывания. Это пространство Стэка в ОЗУ должно быть определенно программой до того как будут вызваны какие-либо подпрограммы или прерывания будут разрешены. Указатель стэка должен быть установлен в ячейку выше $60. Указатель стэка уменьшается на один, когда данные помещаются в Стэк инструкцией(командой) PUSH и уменьшается на два, когда адрес возврата помещён в Стэк вызовом подпрограммы или прерыванием.
Указатель Стэка увеличивается на один когда данные взяты из Стэка инструкцией(командой) POP и увеличивается на два, когда данные взяты из Стэка командой выхода из подпрограммы RET или командой завершения обработки прерывания RETI.
В AVR указатель Стэка реализован как два 8ми битных регистра в I/O пространстве. Номера фактически используемых битов зависит от реализации (Оо). Обратите внимание, что порстранство памяти в некоторых реализациях AVR архитектуры настолько малы, что требуется только SPL (Stack Pionter Low – регистр указателя Стека). В этом случае SPH регистр (Stack Pionter High – регистр указателя Стека) не будет присутствовать.
А вопрос, собственно, в ATmege32 SPH тоже не используется, т.к. исходя из первой страницы даташита он тоже 8-битный?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

честно говоря впадлу перепроверять Ваш перевод. есть онлайн переводчик
вот что он выдал:
Указатель вершины стека Стек, главным образом, используется для того, чтобы хранить временные данные, для того, чтобы сохранить локальные переменные и для того, чтобы сохранить обратные адреса после прерываний и вызовов подпрограммы. Регистр Указателя вершины стека всегда указывает на вершину Стека. Обратите внимание на то, что Стек реализован как растущий от более высоких ячеек памяти, чтобы понизить ячейки памяти. Это подразумевает, что команда Stack PUSH уменьшает Указатель вершины стека.
Указатель вершины стека указывает на область SRAM Stack данных, где Стеки Подпрограммы и Прерывания расположены. Это Стековое пространство в данных, SRAM должен быть определен программой перед любыми вызовами подпрограммы, выполняется, или прерывания включены. Указатель вершины стека должен быть установлен указать выше 60$. Указатель вершины стека постепенно уменьшен тем, когда данные продвинуты на Стек с инструкцией НАЖАТИЯ, и это постепенно уменьшено два, когда обратный адрес продвинут на Стек с вызовом подпрограммы или прерыванием. Указатель вершины стека постепенно увеличен тем, когда данные вытолканы от Стека с инструкцией POP, и это постепенно увеличено два, когда данные вытолканы от Стека с возвратом из подпрограммы, МОЧАТ или возвращают из прерывания RETI.
Указатель вершины стека AVR реализован как два 8-разрядных регистра в пространстве ввода-вывода. Число битов, фактически используемых, зависящее от реализации. Обратите внимание на то, что пространство данных в некоторых реализациях архитектуры AVR столь небольшое, что только SPL необходим. В этом случае Регистр SPH не будет присутствовать.
В принципе можно понять, учитывая его топорность.

У Вас я нашел 2 ошибки. Жирным выделен принципиальный момент.
1) Stack Pointer The Stack is mainly used for storing temporary data, for storing local variables and for storing return addresses after interrupts and subroutine calls.
переводится как: В основном стэк используется для хранения временных данных, локальных переменных и адресов возврата из прерываний или подпрограмм, для возврата на это место после их обработки.
В Вашем переводе - адресов прерываний или подпрограмм.

2) The Stack Pointer points to the data SRAM Stack area where the Subroutine and Interrupt Stacks are located.
переводится как: Указатель стека указывает на область стека в ОЗУ, где расположены стеки подпрограмм и прерываний.
В Вашем переводе - подпрограммы и прерывания
в ATmege32 SPH тоже не используется
как следует из перевода, указатель стека (SP) - содержит адрес в ОЗУ.
Он устанавливается в вершину ОЗУ, следовательно, в максимальное значение адреса ОЗУ.
Если объем ОЗУ в микроконтроллере больше чем (256-96) байт, то использовать SPH обязательно!
Объясняю магические числа:
256 - максимальное кол-во различных адресов хранящихся в 8-битной переменной SPL (0...255)
96 ($60) - это размер области служебных регистров микроконтроллера, расположенной в ОЗУ, начиная с самых младших адресов.

Пример:
объем ОЗУ ATtiny2313 - 128 байт, это меньше, чем (256-96=160) => следовательно используем только SPL
объем ОЗУ ATMega32 - 2048 байт, это больше, чем (256-96=160) => следовательно SPH тоже используется
Ставим плюсы: )
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

Большое спасибо, теперь всё понял! :)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Вымогатель припоя
Аватара пользователя
Сообщения: 683
Зарегистрирован: Пт апр 11, 2008 11:24:53
Откуда: Владимир

Сообщение SergeBS »

Нет никаких слов про именно 8 битность. Ни на 1 стр., ни тут. Написано, что стэк МОЖЕТ быть 8-битным в некоторых архитектурах. И в этом случае нет старшего байта.
Атмельщики одинаковые куски описания в кучу описаний разных МК впихивают. Вот и пишут типа "вааще-то указатель 2 байта, но может быть и 1, если 2-й нафиг не нужен".
Это без цифирек, как у ibiza11
Заодно еще 2 уточнения:
Мikа писал(а):Это пространство Стэка в ОЗУ должно быть определенно программой
-> Это пространство Стэка в ОЗУ должно быть определено программой
Лишняя буква.
Обратите внимание, что Стэк реализован от старших ячеек памяти к младшим.
Обратите внимание, что Стэк реализован растущим от старших ячеек памяти к младшим.
Слово пропустил.
Указатель Стэка указывает на область Стэка в ОЗУ
Указатель Стэка указывает на область данных Стэка в ОЗУ
Слово пропустил. И тут оно важно. Без него вопрос возникнет - что за область.

А вообще - на gaw.ru один перевод (кажись ATmega128) уже есть. Может оттуда готовые куски подходят? Для облегчения процесса. Прибавится сравнение как работа, зато набивать текст не надо...
И надо сразу на весь перевод в целом принять решение - либо instruction как команда переводить, либо как инструкция все-таки. 2-е получше - и перевод "слово в слово", и реже "команда" встречается. Но - хозяин-барин.

В целом: если дело дойдет до конца (блин, 347 стр. - здоровенная книга) - ну звание Героя России не дадут, но в историю Кота явно войдешь. Типа "Во какие тут перцы крутые водятся - даташиты одной левой переводят" :).
Ну и сам будешь его почти наизусть знать... Некоторое время...
Кстати - жмахни целиком переведенный кусок статьей. Ну кусок правда изрядный должен быть. И отсылать неграмотных проще, и рыбки авось дадут :) . Это же не гугл будет, а вычитанное - ляпов меньше (теретически :) ).
Вечером я целиком все сравню - может еще что отрою из поправок. Сейчас что-то не идет...
Вот такие мы (я и ibiza11) лентяи: переводить - фигушки, лень. Зато покритиканствовать - и сейчас, и вечером еще потиранствую :).
Человек - это звучит гордо, а обезьяна - объективно...
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Переводить так с лету не стоит, сначала понять что написано на инглише, потом только переводить. Но обычно когда начинаешь понимать, так влом потом переводить "для других".

Вообще, я почему-то уверен что перевод уже давно есть. Поскольку периферия для всех контроллеров одинакова - переводы будут отличаться частностями, такими как наборы периферии для конкретного контроллера и т.п.
Нет смысла включать описание 16-битного таймера для даташита на ATTINY13 и т.п.
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 683
Зарегистрирован: Пт апр 11, 2008 11:24:53
Откуда: Владимир

Сообщение SergeBS »

SergeBS писал(а): А вообще - на gaw.ru один перевод (кажись ATmega128) уже есть.
Человек - это звучит гордо, а обезьяна - объективно...
Реклама
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

я же тебе говорил читать книгу евстифеева, там есть перевод даташита и основы для понимания его на примере меги16
перевод даташита - потеря времени
тематические ответы только в форуме, в приват не пишите
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

Сообщение SmarTrunk »

Да, но можно попрактиковаться в английском. А Евстигнеев - это да. Но ни разу не читал, т.к. технический английский мне ближе непонятных переводов.
Ответить

Вернуться в «AVR»