Наверно все-таки CJEQ, а не CJQE, хотя назвать можно хоть COMPJMPIFEQU, главное потом при вызове не опечататься...
wixa писал(а):
А циклы будут такого вида:
или так:
-?
Ну очевидно что RJMP нужен, так? Значит либо вносим его в макрос, либо пишем каждый раз отдельно, после вызова макроса. Макрос, это ведь просто подстановка внутримакросного кода в месте его вызова.
Как раз понял пока ждал ответа что правильный второй вариант
Как я понял из инета, BRNE работает, только там, где между BRNE и вызываемой функцией, не больше 127 машинных тактов.... если больше нужно уже идти через RJMP.... Правильно ?
Правда я пока не понимаю как работают циклы, и не могу посчитать сколько они занимают этих тактов
wixa писал(а):Как я понял из инета, BRNE работает, только там, где между BRNE и вызываемой функцией, не больше 127 машинных тактов....
Только не тактов, а адресов программной памяти.
wixa писал(а):если больше нужно уже идти через RJMP.... Правильно ?
А если и RJMP не хватает (+- 2К), то тогда JMP. Но это в контроллерах с более чем 8К памяти.
wixa писал(а):
Правда я пока не понимаю как работают циклы, и не могу посчитать сколько они занимают этих тактов
Ищите за сколько тактов выполняется каждая команда и умножайте на количество выполнений Большинство команд выполняются за 1 такт, это RISC архитектура.
Считается так же как и такты - по количеству команд. В справке на каждую команду написано, за сколько тактов она выполняется и сколько памяти занимает. Большинство команд занимают одно слово (2 байта). Счетчик команд работает со словами, а адресация в командах BRxx - 7 разрядная (по опкоду с той-же справке видно), вот и получается что больше чем на 63 шага (слова) назад и больше чем на 64 вперед она перепрыгнуть не может.
Обычно так и получается, пишется программа, отлаживается, что-то добавляется и в какой-то момент может возникнуть ситуация когда приходится BRNE заменять на противоположную команду+RJMP, или наоборот.
Адреса можно посмотреть, если включить в настройках project-assembler oprions -create list file. В файле lst в первой колонке будет адрес. Если например у метки RES будет адрес 0x2C, то достать до нее можно максимум из строки с адресом 0x2C+0x3F=0x6B. А если поставить BRNE на нее позднее и вылезет та самая ошибка.
Последний раз редактировалось Engineer_Keen Пт апр 27, 2012 10:43:44, всего редактировалось 1 раз.
Да хоть в самой студии курсор на команду поставить и F1 нажать
wixa писал(а):
Когда последовательно написаны команды, вроде понятно, а вот как считать внутри цикла, считаются все проходки по циклу, или только одна?
Если считаем занятую память, то один проход, а если задержку в тактах, тогда конечно все проходы, причем нужно учитывать, что например BRNE в случае невыполнения условия выполняется за 1 такт (просто переход на следующую команду), а в случае выполнения условия - за 2 такта (прыжок на назначенный адрес), это в справке есть.
Engineer_Keen писал(а):
Да хоть в самой студии курсор на команду поставить и F1 нажать
Видимо у меня как то она плохо настроена Может какую то онлайн посоветуете? или справочник какой то скачать ?
Engineer_Keen писал(а):
Когда последовательно написаны команды, вроде понятно, а вот как считать внутри цикла, считаются все проходки по циклу, или только одна?
Если считаем занятую память, то один проход, а если задержку в тактах, тогда конечно все проходы, причем нужно учитывать, что например BRNE в случае невыполнения условия выполняется за 1 такт (просто переход на следующую команду), а в случае выполнения условия - за 2 такта (прыжок на назначенный адрес), это в справке есть.
С каждым разом становится всё интереснее и интереснее Да в Си как то скучнее....