Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: sbis SREG, SREG_Z и Operand 1 out of range x3f
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
shevek
Компилятор ругается на вот эту инструкцию

sbis SREG, SREG_Z

Operand 1 out of range 0x3f

Битый час не пойму в чем дело. Наверное надо идти спать.
Potter
Цитата(shevek @ Jul 2 2006, 23:22) *
Компилятор ругается на вот эту инструкцию

sbis SREG, SREG_Z

Operand 1 out of range 0x3f

Битый час не пойму в чем дело. Наверное надо идти спать.


Я вообщето эту комаднду не знаю никогда ей не пользовался.... Посмотрел на нее описание..... поидее на месте SREG должен быть каойнибудь порт... типа PORTD, а на месте SREG_Z номер бита порта.... типа 0x1. Что в программе побразумевается под SREG и SREG_Z?
aaarrr
Как я понял, нужно пропустить следующую инструкцию, если в SREG установлен флаг Z. В таком случае аналогом этой конструкции будет "BREQ PC+2", если следующая за ней команда состоит из одного слова, или "BREQ PC+3" - если из двух.

А ругается компилятор совершенно справедливо: команды sbic и sbis работают в диапазоне адресов 00..1F, куда SREG ни разу не попадает.
shevek
Спасибо.
beer_warrior
Кристалл какой? Компилятор ругается на то, что SREG за пределами IOspace. Соответсвенно cbi/sbi с этими адресами не работает.
PS Посмотрел, то что появилось одновременно со мной. Проверьте опрделение SREG/
shevek
А я то торможу и ругаюсь на атмелов, что бранч по Z не предусмотрели,а он смотрит прямо на меня, только называется Branch if equal в кратком описании команд, посмотрел полное описание и все сразу прояснилось.

Спасибо еще раз.
shevek
beer_warrior

Посмотрел, то что появилось одновременно со мной. Проверьте опрделение SREG
SREG адрес 0x3F
Определение из стандартного заголовочного для tiny26 врятли там ошибки.

Совет aaarrr помог решить проблему.

Хотя у меня остались смутные сомнения что я где-то видел уже конструкцию
sbis SREG,SBIS_Z
Nanobyte
smile.gif Эту конструкцию можно увидеть разве-что на [banned] курсе smile.gif smile.gif smile.gif
_Bill
Цитата(aaarrr @ Jul 3 2006, 00:08) *
Как я понял, нужно пропустить следующую инструкцию, если в SREG установлен флаг Z. В таком случае аналогом этой конструкции будет "BREQ PC+2", если следующая за ней команда состоит из одного слова, или "BREQ PC+3" - если из двух.

Так лучше не делать. Для этих целей существуют метки.
aaarrr
Цитата
Так лучше не делать. Для этих целей существуют метки.

Плодить сотни меток тоже не дело. Нужно выбирать разумный компромисс.
CDT
Цитата(aaarrr @ Jul 3 2006, 20:43) *
Плодить сотни меток тоже не дело.

А в чем проблема, если их разумно называть?
aaarrr
Цитата(CDT @ Jul 4 2006, 07:31) *
А в чем проблема, если их разумно называть?

Проблема исключительно в лени. Представьте себе: для того, чтобы заменить
запись BREQ PC+0x02 нужно придумать и написать (два раза!) осмысленную метку.

Использование BREQ PC+0x02 ничем не отличается от использования SBRS/SBRC,
за исключением того, что просто нужно быть чуть внимательнее.
_Bill
Цитата(aaarrr @ Jul 4 2006, 15:55) *
Цитата(CDT @ Jul 4 2006, 07:31) *

А в чем проблема, если их разумно называть?

Проблема исключительно в лени. Представьте себе: для того, чтобы заменить
запись BREQ PC+0x02 нужно придумать и написать (два раза!) осмысленную метку.

Использование BREQ PC+0x02 ничем не отличается от использования SBRS/SBRC,
за исключением того, что просто нужно быть чуть внимательнее.

Все правильно, только случаи BREQ PC+0x02 встречаются достаточно редко, а вычислять переходы вручную довольно хлопотно (я предоставляю это делать ассемблеру). Поэтому, если такая конструкция вдруг встретится, я предпочту добавить просто метку. Опять же, к сожалению, IAR не допускает локальных меток. Поэтому, чтобы не утруждать себя придумывать подобные метки, я просто использую в качестве меток иденификаторы типа ?0, ?1, ...
CDT
Цитата(_Bill @ Jul 4 2006, 16:07) *
Цитата(aaarrr @ Jul 4 2006, 15:55) *

Цитата(CDT @ Jul 4 2006, 07:31) *

А в чем проблема, если их разумно называть?

Проблема исключительно в лени. Представьте себе: для того, чтобы заменить
запись BREQ PC+0x02 нужно придумать и написать (два раза!) осмысленную метку.

Использование BREQ PC+0x02 ничем не отличается от использования SBRS/SBRC,
за исключением того, что просто нужно быть чуть внимательнее.

Все правильно, только случаи BREQ PC+0x02 встречаются достаточно редко, а вычислять переходы вручную довольно хлопотно (я предоставляю это делать ассемблеру). Поэтому, если такая конструкция вдруг встретится, я предпочту добавить просто метку. Опять же, к сожалению, IAR не допускает локальных меток. Поэтому, чтобы не утруждать себя придумывать подобные метки, я просто использую в качестве меток иденификаторы типа ?0, ?1, ...

А я делаю внятное имя модуля:
Код
Divider10ms:

Далее внутри его сокращаю, добавляя номера с интервалом:
Код
Div10ms1:
Div10ms3:

Если интервал исчерпан поправками, расширяю его также с интервалами:
Код
Div10ms1:
Div10ms13:
Div10ms17:
Div10ms2:

Больше 4-х разрядов еще не получалось, придумывать надо один раз на модуль, а для ускорения писания использую Ctrl-C/Ctrl-V. Всегда знаю что за метка и где ее искать.
Может у кого еще есть симпатичные придумки на эту тему?
vet
Использовать ассемблер с локальными метками.
При неимении - написать препроцессор, таковые предоставляющий.
При нежелании - разбивать проект на файлы помельче (имеет смысл, если ассемблер видит метку только в пределах модуля).
Ну, и BREQ PC+2 весьма удобно, что бы ни говорили.
IgorKossak
Цитата(vet @ Jul 5 2006, 08:18) *
Ну, и BREQ PC+2 весьма удобно, что бы ни говорили.

Разве что осторожность надо проявлять всякий раз при редактировании инструкции после BREQ PC+...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.