Ассемблер (ASM) для AVR в вопросах и ответах
но ведь ret используется при выходе из подпрограммы( ф-ции), а мы говорим о прерываниях......, ничего не пойму...., каламбур какой-то 
Tell Me The Truth
- Реклама
Да никакого каламбура.
Если в подпрограмме понадобилось выключить прерывание, а по выходе включить, можно использовать такой код:
А можно такой:
В последнем случае экономим одну команду.
Так же и внутри прерывания можно принудительно включить прерывания, и выходить из него через ret. Однако вложенные прерывания использовать не советую.
Так же из любого участка кода через ret или reti можно выйти совсем не туда, откуда пришли, а совсем в другое место, предварительно заменив на стеке адрес возврата
Если в подпрограмме понадобилось выключить прерывание, а по выходе включить, можно использовать такой код:
Код: Выделить всё
my_func:
cli() ; отключили прерывания
....
тут мой код
....
sei() ;включили
ret ;выходимКод: Выделить всё
my_func:
cli() ; отключили прерывания
....
тут мой код
....
reti ; Включили и выходимТак же и внутри прерывания можно принудительно включить прерывания, и выходить из него через ret. Однако вложенные прерывания использовать не советую.
Так же из любого участка кода через ret или reti можно выйти совсем не туда, откуда пришли, а совсем в другое место, предварительно заменив на стеке адрес возврата
зачем тогда вообще придумывали ret ?ploop писал(а):В последнем случае экономим одну команду.
или может быть случай когда при выходе из подпрограммы нам не надо включать прерывания ?
хотя я такого не встречал....., обычно при входе в подпрограмму мы запрещаем прерывания
Tell Me The Truth
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
- Реклама
Протеус?
Docendo discimus
Смотря какие, от протеуса там DSN, PWI и DBK, от AVR-студии APS, AWS, avrbuild.bat, остальные - файлы с исходным кодом на асме.
Ну вот и здорово! Что и желал узнать!Engineer_Keen писал(а):Смотря какие
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
- Сообщения: 21
- Зарегистрирован: Пт май 27, 2011 10:46:45
Дорогие "Коты". Поделитесь пожалуйста тем, кто как формирует задержки в асме при подключении lcd (wh0802a). А то без этого не хочет запускаться индикатор. И как правильно их рассчитывать?
на асме задержки делают тупыми циклами:
вызов:
Если задержка нужна длиннее, вставляют вложенные циклы.
Величина задержки считается по количеству тактов (1 такт = 1/Fclk).
Код: Выделить всё
DELAY:DEC R16 ;(1 такт * количество проходов)
BRNE DELAY ;(2 такта по количеству проходов-1 + еще один такт)
RET ;(4 такта)
Код: Выделить всё
LDI R16,100 (100 - задержка в условных единицах (количество проходов цикла)
RCALL DELAY
Величина задержки считается по количеству тактов (1 такт = 1/Fclk).
Или через прерывания по времени, тиками.
Docendo discimus
- Сообщения: 21
- Зарегистрирован: Пт май 27, 2011 10:46:45
Вот, надыбал еще инфу если кому интересно:
http://cxem.net/mc/mc89.php
И таймеры как-то жалко использовать, так как они будут для другой цели включены
.
Наверное придется подключать к ноге вывод RW и читать бит готовности BF что опять таки не удобно
.
http://cxem.net/mc/mc89.php
И таймеры как-то жалко использовать, так как они будут для другой цели включены
Наверное придется подключать к ноге вывод RW и читать бит готовности BF что опять таки не удобно
Верно, таймерами через прерывания очень удобно, особенно если нужно много различных программных таймеров и задержек с кратными интервалами. Но это немного сложнее для новичков, нужно настраивать таймер, писать процедуру прерывания и как-то организовывать задание интервалов (если задержка одна, то просто настройкой OCR, а если много, то это кучка счетчиков и флагов состояния в памяти).
По ссылке тоже таймер используется, но тупо как счетчик, без прерываний, так конечно тоже можно, но не интересно...
По ссылке тоже таймер используется, но тупо как счетчик, без прерываний, так конечно тоже можно, но не интересно...
Почему с таймерами ,таймер один на все задержки - FREE TIMER
Ну я и имел ввиду один, просто выразился более общей фразой...
любой код операции занимает 4 бита ?
Tell Me The Truth
Docendo discimus
спасибо...., но мне не понятно почему код операции имеет разную длину ?
с чем это связано ?
допустим, если мы имеем в системе команд AVR всего 64 разные операции....., то для их кодирования нам понадобится всего 6 бит
с чем это связано ?
допустим, если мы имеем в системе команд AVR всего 64 разные операции....., то для их кодирования нам понадобится всего 6 бит
Tell Me The Truth
И десять останется для параметров? А этого хватит?
Для разных операций нужны разные параметры. Сами посудите: для копирования регистров (MOV) нужно 2 адреса по 5 бит, остается 6 бит на сам код, а для загрузки константы (LDI) нужно 4 бита (верхние R16-R31) и 8 бит константы - для кода остается 4 бита, и т.д.
Для разных операций нужны разные параметры. Сами посудите: для копирования регистров (MOV) нужно 2 адреса по 5 бит, остается 6 бит на сам код, а для загрузки константы (LDI) нужно 4 бита (верхние R16-R31) и 8 бит константы - для кода остается 4 бита, и т.д.
Engineer_Keen, насколько я в курсе то инструкция может заниматьне не только одно но и два слова
и если наши 64 операции ми кодируем 6 битами то в случае нехватки мы можем использовать 2 слова
или я в чем-то заблуждаюсь ?
и если наши 64 операции ми кодируем 6 битами то в случае нехватки мы можем использовать 2 слова
или я в чем-то заблуждаюсь ?
Tell Me The Truth


