Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

но ведь ret используется при выходе из подпрограммы( ф-ции), а мы говорим о прерываниях......, ничего не пойму...., каламбур какой-то :dont_know:
Tell Me The Truth
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Да никакого каламбура.
Если в подпрограмме понадобилось выключить прерывание, а по выходе включить, можно использовать такой код:

Код: Выделить всё

my_func:
cli() ; отключили прерывания
....
тут мой код
....
sei() ;включили
ret   ;выходим
А можно такой:

Код: Выделить всё

my_func:
cli() ; отключили прерывания
....
тут мой код
....
reti ; Включили и выходим
В последнем случае экономим одну команду.
Так же и внутри прерывания можно принудительно включить прерывания, и выходить из него через ret. Однако вложенные прерывания использовать не советую.

Так же из любого участка кода через ret или reti можно выйти совсем не туда, откуда пришли, а совсем в другое место, предварительно заменив на стеке адрес возврата :)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

ploop писал(а):В последнем случае экономим одну команду.
зачем тогда вообще придумывали ret ?
или может быть случай когда при выходе из подпрограммы нам не надо включать прерывания ?
хотя я такого не встречал....., обычно при входе в подпрограмму мы запрещаем прерывания
Tell Me The Truth
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Случаи всякие бывают.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4966
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Привет, парни. В МК пока дуб, поэтому вопрос: какой программе принадлежат эти файлы?
Изображение
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Протеус?
Docendo discimus
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Смотря какие, от протеуса там DSN, PWI и DBK, от AVR-студии APS, AWS, avrbuild.bat, остальные - файлы с исходным кодом на асме.
Друг Кота
Аватара пользователя
Сообщения: 4966
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Engineer_Keen писал(а):Смотря какие
Ну вот и здорово! Что и желал узнать! :beer:
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт май 27, 2011 10:46:45

Сообщение rnd.gen »

Дорогие "Коты". Поделитесь пожалуйста тем, кто как формирует задержки в асме при подключении lcd (wh0802a). А то без этого не хочет запускаться индикатор. И как правильно их рассчитывать?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

на асме задержки делают тупыми циклами:

Код: Выделить всё

          DELAY:DEC R16 ;(1 такт * количество проходов)
          BRNE DELAY      ;(2 такта по количеству проходов-1 + еще один такт)
          RET                   ;(4 такта)
вызов:

Код: Выделить всё

          LDI R16,100 (100 - задержка в условных единицах (количество проходов цикла)
          RCALL DELAY
Если задержка нужна длиннее, вставляют вложенные циклы.
Величина задержки считается по количеству тактов (1 такт = 1/Fclk).
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Или через прерывания по времени, тиками.
Docendo discimus
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт май 27, 2011 10:46:45

Сообщение rnd.gen »

Вот, надыбал еще инфу если кому интересно:
http://cxem.net/mc/mc89.php
И таймеры как-то жалко использовать, так как они будут для другой цели включены :(.
Наверное придется подключать к ноге вывод RW и читать бит готовности BF что опять таки не удобно :(.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Верно, таймерами через прерывания очень удобно, особенно если нужно много различных программных таймеров и задержек с кратными интервалами. Но это немного сложнее для новичков, нужно настраивать таймер, писать процедуру прерывания и как-то организовывать задание интервалов (если задержка одна, то просто настройкой OCR, а если много, то это кучка счетчиков и флагов состояния в памяти).

По ссылке тоже таймер используется, но тупо как счетчик, без прерываний, так конечно тоже можно, но не интересно...
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Почему с таймерами ,таймер один на все задержки - FREE TIMER
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Ну я и имел ввиду один, просто выразился более общей фразой...
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

любой код операции занимает 4 бита ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Docendo discimus
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

спасибо...., но мне не понятно почему код операции имеет разную длину ?
с чем это связано ?
допустим, если мы имеем в системе команд AVR всего 64 разные операции....., то для их кодирования нам понадобится всего 6 бит
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

И десять останется для параметров? А этого хватит?
Для разных операций нужны разные параметры. Сами посудите: для копирования регистров (MOV) нужно 2 адреса по 5 бит, остается 6 бит на сам код, а для загрузки константы (LDI) нужно 4 бита (верхние R16-R31) и 8 бит константы - для кода остается 4 бита, и т.д.
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Engineer_Keen, насколько я в курсе то инструкция может заниматьне не только одно но и два слова
и если наши 64 операции ми кодируем 6 битами то в случае нехватки мы можем использовать 2 слова
или я в чем-то заблуждаюсь ?
Tell Me The Truth
Ответить

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