| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Ошибка команды относительного перехода brcs. https://radiokot.ru/forum/viewtopic.php?f=20&t=74089 |
Страница 1 из 1 |
| Автор: | Vova777 [ Пт июн 15, 2012 20:14:32 ] |
| Заголовок сообщения: | Ошибка команды относительного перехода brcs. |
Программа из книжки, я ни одной строчки не дописывал в ней, в чем дело? Ошибка "Error 7 Relative branch out of reach" на строчке: Код: ... brcs Start ; ... Так понимаю, относительный переход вне досягаемости. Вот полный фрагмент: Код: ...
Change: in store, PortD ; обновим значение dec counter ; brne LowLoop ; ldi temp, 0x0F ; ldi temp2, 0x00 ; cpi delay1, 0xA0 ; cpc delay2, temp ; cpc delay3, temp2 ; brcs Start ; если да, переходим к метке ldi temp, 0x00 ; ldi temp2, 0x09 ; ldi temp3, 0x3D ; clr lowerbyte ; clr upperbyte ; ... |
|
| Автор: | DX168B [ Пт июн 15, 2012 20:34:04 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
Либо Вы пытаетесь перейти по условию к несуществующей метке, либо она далековато находится. Относительный переход - это переход не по адресу метки, а переход относительно текущего содержимого счетчика команд PC. На более низком уровне выглядит как brcs PC+XX или PC-XX Команды относительного перехода едят меньше памяти, но на них есть такое вот ограничение. Точно не помню, на сколько единиц можно прыгать. То ли +128\-127 , то ли меньше. Ваша метка Start должна быть немного ближе и тогда проблему можно решить. Если быстродействие не критично, то можно часть кода, находящегося между меткой Start и условием brcs Start вынести в виде подпрограммы. Можно так же постараться развернуть алгоритм другим способом (реализовать по другому) |
|
| Автор: | Vova777 [ Пт июн 15, 2012 20:38:55 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
Дело в том, что это программа из книжки, по которой я учусь программировать. Там написано, что эта команда может перейти через не более чем 64 команды. А там их примерно 100. Сократить не могу, потому что: во-первых, не соображаю как это сделать, а во-вторых, если это пример, то он должен быть рабочим. Может эту команду заменить на rjmp, но мне нужно чтобы флаг С обрабатывался тоже. Как можно сделать, скажите пожалуйста? Так можно заменить эту команду: Код: ...
brcc PC + 2 rjmp Start ... |
|
| Автор: | ILYAUL [ Пт июн 15, 2012 20:46:26 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
Что за книга? можно |
|
| Автор: | Vova777 [ Пт июн 15, 2012 20:47:13 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
ILYAUL писал(а): Что за книга? Джон Мортон Микроконтроллеры AVR |
|
| Автор: | DX168B [ Пт июн 15, 2012 20:57:57 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
Возможно, компилятор не понимает, что такое PC+2 (думает, что это метка) Сделайте так: Код: ... brcc Label rjmp Start Label: ... По сути, PC+2 это прыжок через rjmp Start Просто автор книги решил не заморачиваться с метками, и написал так. А компилятор у него другой был. Видать, какой-то из старых TAVRASMов. |
|
| Автор: | ILYAUL [ Пт июн 15, 2012 21:02:52 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
Код: brcs Start ; если да, переходим к метке Там комментарии разнятся с действием |
|
| Автор: | Vova777 [ Пт июн 15, 2012 21:08:51 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
ILYAUL писал(а): Код: brcs Start ; если да, переходим к метке Там комментарии разнятся с действием Описание команды: Цитата: brcs label - проверяет флаг переноса (С) и переходит если он установлен. Я переписал команду "brcs" сейчас сам на это: Цитата: brcc PC + 2 ; rjmp Start ; Компилятор это принял, но в Протеусе работает не так. |
|
| Автор: | DX168B [ Пт июн 15, 2012 21:17:57 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
Млин. Чет я тупанул маленько. В принципе да. Можно и так, RJMP достает дальше. В книге проверяют, установлен ли флаг С в регистре SREG, и если установлен, то переход к началу программы. Мы меняем условие. Проверяем состояние флага на сброс и если флаг сброшен, перепрыгиваем переход к началу и идем далее по программе. А если флаг будет установлен, то условие не выполнится и произойдет переход к началу программы (метка Start) А на счет Протеуса: Может есть еще ошибки в программе? |
|
| Автор: | ILYAUL [ Пт июн 15, 2012 21:19:54 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
Всё , что мы тут обсуждали - написано в самой книге при описании программы |
|
| Автор: | Vova777 [ Пт июн 15, 2012 21:21:26 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
DX168B писал(а): Млин. Чет я тупанул маленько. В принципе да. Можно и так, RJMP достает дальше. В книге проверяют, установлен ли флаг С в регистре SREG, и если установлен, то переход к началу программы. Мы меняем условие. Проверяем состояние флага на сброс и если флаг сброшен, перепрыгиваем переход к началу и идем далее по программе. А если флаг будет установлен, то условие не выполнится и произойдет переход к началу программы (метка Start) Да, компилятор принимает. Но в Протеусе полная каша получается. Я думаю, это уже по моей вине. Где-то есть мелочи, которые нужно исправлять, схему переделывать. С другой стороны, так даже лучше, чем просто тупо перепечатывать код из книги, надо и мозг напрячь, поискать ошибки. |
|
| Автор: | DX168B [ Сб июн 16, 2012 19:43:42 ] |
| Заголовок сообщения: | Re: Ошибка команды относительного перехода brcs. |
AVR Studio 4 понимает. Если Вы в протеусе прикрепили к МК исходник, то лучше попробуйте прицепить к нему скомпилированный в AVR Studio файл прошивки (HEX файл) И проверьте исходники на прочие ошибки. В книгах бывают и опечатки. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


