Bill 0 22 января, 2011 Опубликовано 22 января, 2011 (изменено) · Жалоба И все таки туго что-то до меня доходит работа с адресами... что означает следующий код: .DSEG tmp: .byte 1 ... lds ZL,tmp что я заношу в регистр ZL значение байта, который находился в памяти по адресу tmp или что я записываю значение младшего байта самого адреса? :( В регистр 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 Надеюсь, что немного прояснил ситуацию. Или нет? Изменено 22 января, 2011 пользователем _Bill Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HoboTech 0 24 января, 2011 Опубликовано 24 января, 2011 (изменено) · Жалоба Про lds и ldi я понял, спасибо. Не понял что именно загружается (значение или адрес) в этих строках: 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. Мануалы честно читал, но когда дошло до практической реализации - запнулся. Изменено 24 января, 2011 пользователем HoboTech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 24 января, 2011 Опубликовано 24 января, 2011 · Жалоба P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся. Вы считаете это чем-то из ряда вон, что при освоении нового материала надо приложить некоторые усилия? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 24 января, 2011 Опубликовано 24 января, 2011 · Жалоба Не понял что именно загружается (значение или адрес) в этих строках: Для AVR в строках где нет никаких цифирей происходит косвенное обращение к данным (чтение или запись). Адрес сидит внутри регистровой пары и его в коде операции не видно - поэтому такой тип адресации и называется косвенным (через индексные регистры X,Y,Z). Смею предположить, что без такого способа адресации программирования, как мы его сегодня знаем, не существовало. Так что изучите это очень внимательно! Основа основ как-никак:-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 24 января, 2011 Опубликовано 24 января, 2011 · Жалоба В регистр ZL загружается содержимое ячейки памяти с адресом tmp. Если вы хотите загрузить в ZL адрес ячейки, используйте команду LDI. Все ваши проблемы возникают от того, что вы путаете различные методы адресации. В ассемблере AVR различные методы адресации определяются с помощью различных мнемоник. ld r16, Z- ; Автодекрементная (pre decrement) адресация через указатель Z Просто правка LD R16 ,-Z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 24 января, 2011 Опубликовано 24 января, 2011 · Жалоба Про lds и ldi я понял, спасибо. Не понял что именно загружается (значение или адрес) в этих строках: P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся. Методы адресации - это один из трех китов, на которых держится архитектура любого процессора (AVR в том числе). Так что стоит затратить время, чтобы разобраться с адресацией. В дальнейшем эти знания скорее всего вам понадобятся. Что касается семейства AVR, то советую внимательнее почитать сей документ Система команд AVR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 24 января, 2011 Опубликовано 24 января, 2011 · Жалоба Можно , так же открыть Ефремова . Почитать главу "Способы адресации памяти данных" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HoboTech 0 24 января, 2011 Опубликовано 24 января, 2011 · Жалоба Спасибо за ответы. Еще почитаю, наверняка возникнут вопросы, задам их тут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_noise 0 26 января, 2011 Опубликовано 26 января, 2011 · Жалоба Не считая полезным занятием переписывание собственными словами документа "AVR Instruction Set", обратил бы внимание на: ldi XH, high(addr) ldi XL, low(addr) cli ; !!! ld R16, X+ ld R17, X sei ; !!! В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания. Где-то умнее излагается о, но ссылку либо название затрудняюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 26 января, 2011 Опубликовано 26 января, 2011 · Жалоба Не считая полезным занятием переписывание собственными словами документа "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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 7 26 января, 2011 Опубликовано 26 января, 2011 · Жалоба если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания. Где-то умнее излагается о, но ссылку либо название затрудняюсь. Если бы так было, это следовало бы писать красными большими буквами 32 кегля во всех документах, а Атмел давно бы заклевали конкуренты. Так что ссылку в студию, начнем клевать... Может, вы спутали с загрузкой 2-байтных регистров с использованием внутренних защелок и жесткими требованиями к таймингам? Это есть, и во всех pdf-ках есть отдельный параграф про работу с 16-разрядными регистрами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OlegNZH 0 26 января, 2011 Опубликовано 26 января, 2011 (изменено) · Жалоба В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания. Где-то умнее излагается о, но ссылку либо название затрудняюсь. :) ну во-первых , после ld R16, X+ прерывание не может произойти , а во-вторых-что за диверсант будет портить регистр X ? upd.Аааааа - V_G понял откуда ноги растут... :) Цитата... Доступ к 16-разрядным регистрам Регистры TCNTn, OCRnA/B/C и ICRn являются 16-разрядными, поэтому, доступ к ним через 8-разр. шину данных AVR ЦПУ может быть осуществлен с помощью двух инструкций чтения или записи. У каждого 16-разр. таймера имеется свой 8-разр. регистр для временного хранения старшего байта данных. Поэтому, во время доступа к 16-разр. регистрам одного таймера используется один и тот же временный регистр... ...Не все 16-разрядные регистры используют временный регистр для копирования старшего байта. Чтение 16-разр. регистров OCRnA/B/C не связано с использованием временного регистра... ...При этом следует обратить внимание на проблему, которая связана с необходимостью выполнения двух инструкций для получения доступа к 16-разр. регистру. Если после выполнения первой инструкции доступа 16-разр. регистра происходит прерывание и в процедуре обработки прерывания также происходит обновление этого же или другого регистра, но относящегося к тому же таймеру, то по завершении обработки прерывания изменяется содержимое временного регистра и выполнение второй инструкции приведет к некорректному результату. Таким образом, когда и в основной программе и в прерываниях происходит обновление временного регистра, то в основной программе перед инициацией доступа к 16-разр. регистру необходимо запретить прерывания... Конец Цитаты. Изменено 26 января, 2011 пользователем OlegNZH Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 26 января, 2011 Опубликовано 26 января, 2011 (изменено) · Жалоба :) ну во-первых , после ld R16, X+ прерывание не может произойти , а во-вторых-что за диверсант будет портить регистр X ? upd.Аааааа - я понял откуда ноги растут... Ну, во-первых, прерывание может произойти когда угодно, но переход к прерыванию начинается только после выполнения текущей инструкции. Что касается доступа к 16-разрядным портам ВВ, то это совсем другая история. Изменено 26 января, 2011 пользователем _Bill Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OlegNZH 0 26 января, 2011 Опубликовано 26 января, 2011 · Жалоба Ну, во-первых, прерывание может произойти когда угодно, но переход к прерыванию начинается только после выполнения текущей инструкции. Что касается доступа к 16-разрядным портам ВВ, то это совсем другая история. Вообще-то я- про конкретную конструкцию говорил cli ; !!! ld R16, X+ А регистры XYZ к прерываниям никаким боком...Здесь речь может идти только о регистрах ВВ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 26 января, 2011 Опубликовано 26 января, 2011 (изменено) · Жалоба Вообще-то я- про конкретную конструкцию говорил cli ; !!! ld R16, X+ На целостность выполнения инструкции ld R16, X+ запрет или разрешение прерываний никоим образом не повлияют. С таким же успехом можно использовать и такую конструкцию sei ; !!! ld R16, X+ Изменено 26 января, 2011 пользователем _Bill Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться