Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работает ли Atmega8 команда jmp?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ivstech
Вопрос возник в связи с тем, что по ошибке я в программе написал jmp вместо rjmp. Заметил вот только сейчас, когда разбирался, почему программа сбоит (перестает принимать данные (?) по UART).
Читаю Changes from Rev.
2486K-08/03 to Rev.
2486L-10/03
...
3. Removed instructions CALL and JMP from the datasheet. << убрали просто за ненадобностью или начиная с ревизии K она не работает?
У меня серия процессора 0536I. Команду JMP он отрабатывает
aaarrr
Цитата(ivstech @ Nov 18 2006, 23:58) *
3. Removed instructions CALL and JMP from the datasheet. << убрали просто за ненадобностью или начиная с ревизии K она не работает?
У меня серия процессора 0536I. Команду JMP он отрабатывает

Не путайте ревизию документа и кристалла - две большие разницы. Команду, может быть, и не убирали, но теперь она имеет право не работать.
Dopler
Команда jmp в меге8 не работает. Приведенный вами текст из документации не очем не говорит, просто в примерах там где это было jmp заменили на rjmp. Ориентироваться надо на таблицу Instruction Set Summary, где команды jmp у меги8 нет.
Если попробовать откомпилить проект с jmp для меги8 в AVRStudio, то получите следующее:

error: jmp k: Unsupported instruction on ATmega8
CD_Eater
И не должна работать, т.к. на 8 КБайтах её функциональность полностью покрывается командой rjmp. То есть, разработчикам МК не было смысла реализовывать её.
=GM=
Цитата(CD_Eater @ Nov 20 2006, 04:46) *
И не должна работать, т.к. на 8 КБайтах её функциональность полностью покрывается командой rjmp. То есть, разработчикам МК не было смысла реализовывать её.

Не совсем так. "Функциональность" НЕ "покрывается полностью командой rjmp", поскольку команда относительного перехода работает в пределах +-2Кслова, но в атмеге8 имеется 4Кслова памяти, так что для перехода, скажем, из конца памяти в ее начало потребуется два rjmp, а не один.
ivstech
Всем спасибо, что откликнулись. Поменял JMP на RJMP, ошибка, естественно из программы никуда не ушла. А я так надеялся ;-)
В железе проверял. Команда JMP отрабатывает.
Логично, что в примерах они заменили JMP на RJMP, т.к. в пределах адресного пространства это одно и тоже, при этом всего 2 байта вместо 4-х
CD_Eater
Цитата(=GM= @ Nov 21 2006, 18:04) *
команда относительного перехода работает в пределах +-2Кслова, но в атмеге8 имеется 4Кслова памяти, так что для перехода, скажем, из конца памяти в ее начало потребуется два rjmp, а не один.

Память программ организована циклически на аппаратном уровне (отбрасыванием старших бит), поэтому в любую точку программы можно прыгнуть из любой
А ещё есть флажок компилятора, который позволяет разрешить или запретить такую интерпретацию адреса (но, конечно же, не может запретить её аппаратную реализацию). Странно, что Вы не знали.
Laksus
=GM=
Цитата
Не совсем так. "Функциональность" НЕ "покрывается полностью командой rjmp", поскольку команда относительного перехода работает в пределах +-2Кслова, но в атмеге8 имеется 4Кслова памяти, так что для перехода, скажем, из конца памяти в ее начало потребуется два rjmp, а не один.

Запускаем AVRStudio (4.12.498, у старых тоже должно быть),
отрываем Help-AVR Studio User Guide-Поиск.
Ищем слово wrap.
Находим Assembly project.
Читаем раздел:
Цитата
Wrap relative jumps
The AVR RJMP/RCALL instructions allow a 12-bit PC-relative offset, corresponding to +/-2k words. For devices with 4k words (8k bytes) or less FLASH program memory, the Wrap option causes the assembler's offset calculation to wrap around over the addressable program memory range, enabling the entire program memory to be addressed using these instructions.

For devices with more than 4k words of program memory, using this option may cause unpredictable results and it should be turned off.
If it is left on, the assembler will produce a warning when wrap takes effect:

warning: Wrap rjmp/rcall illegal for device > 4k words - Turn off wrap option and use jmp/call

This diagnostic is given as a warning and not an error to retain compatibility with earlier versions of the assembler, but should be treated as an error by the user. The JMP/CALL 2-word instructions take 22-bit absolute addresses and should be used instead.


То есть, для мега8 ставим галочку в настройках ассемблера:
Project-Assembler Options-Wrap Relative Jumps
и гуляем с помощью rjmp, или rcall по всей флэши.
А если у нас мега16 и выше, то эту галочку надо объязательно убрать.
____________________
Александр
2006 11 21
PS. Вот тут аналогичная тема обсуждалась:
http://www.fulcrum.ru/cgi-bin/bbs/mess_sel...4966&page=1
=GM=
Цитата(Laksus @ Nov 21 2006, 16:11) *
Цитата

Wrap relative jumps
The AVR RJMP/RCALL instructions allow a 12-bit PC-relative offset, corresponding to +/-2k words. For devices with 4k words (8k bytes) or less FLASH program memory, the Wrap option causes the assembler's offset calculation to wrap around over the addressable program memory range, enabling the entire program memory to be addressed using these instructions.

For devices with more than 4k words of program memory, using this option may cause unpredictable results and it should be turned off. If it is left on, the assembler will produce a warning when wrap takes effect:

warning: Wrap rjmp/rcall illegal for device > 4k words - Turn off wrap option and use jmp/call

This diagnostic is given as a warning and not an error to retain compatibility with earlier versions of the assembler, but should be treated as an error by the user. The JMP/CALL 2-word instructions take 22-bit absolute addresses and should be used instead.


То есть, для мега8 ставим галочку в настройках ассемблера: Project-Assembler Options-Wrap Relative Jumps и гуляем с помощью rjmp, или rcall по всей флэши. А если у нас мега16 и выше, то эту галочку надо обязательно убрать

Не знал я, что авр-студия позволяет представлять смещение как беззнаковое (фактически это так), и не учитывать переполнения 12-битного счетчика команд. Теперь буду знать, спасибо, Александр.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.