что в IDE компаниии IAR при написании программы для той платформы которую она поддерживает программисту не надо заморачиваться со "стандартами" языков разных компиляторов
Со стандартами нигде не надо заморачиваться, на то они и стандарты. IAR хорош тем, что у него во-первых дофига компиляторов для разных архитектур, во-вторых тем, что всё это собрано в одну IDE, и в третьих - с хорошим отладчиком под всё это дело.
Плох - ценой.
но, понимая, что это обучающая программа и она у меня выполняется в AVRSTUDIO 3.21, следует помечать точки переходов как показано выше уважаемым ILYAUL. Возможностями "препроцессора" ассемблера тоже не следует пренебрегать.
на данном примере ему наверное хочется в перспективе научиться заменять не как у вас,а LDI на что то типа LDS
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Помогите разобраться с командами subi,sbci. Чего-то недогоняю конкретно со сложением,совсем путаюсь как там происходит все.
Как контроллер отличает 255 от -1? Если можно,подскажите в столбик и с яркими картинками про дополнительный код.Наверное чего-то упускаю из виду,а что не пойму.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Используя различные сочетания значений R20...R23 и констант, убедитесь, что если значения в R20...R23, констант и результата находятся в области определения разрядной сетки (для 4-х байт от -2147483648 до +2147483647) результат будет правильным.
vek писал(а):Как контроллер отличает 255 от -1?
Ему пофиг. Контроллер выполняет действия в зависимости от используемых условий, которые определяются состоянием флагов регистра SREG.
Спойлер
Чего-то непойму как без директив обойтись,так сказать,саму подноготную арифметики непонимаю.
как к 2-х байтовой переменной прибавляется 1-байтовая константа,
Почему-то не канает если так хочу прибавить 6:
subi REG_L, -6
sbci REG_H, 0
Это мягко говоря не совсем очевидено
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
У меня крокодил не ловиться,не растет кокос. Почему так?
P.S. А вроде понимать начал,это походу из-за того что я себе представляю число "-6" как однобайтное,
При этом пытаюсь его вычесть из двух байт. А надо приводить константу тоже в 2-х байтное значение.Это совсем не похоже на вычитание положительного значения. Нужно из старшей части не 0 вычитать,а -1.
Как-бы действительно не вполне очевидная вещь(и то до конца не понял ).
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Для двухбайтовых констант в пределах 0-63 лучше подходят команды
ADIW Rd+1:Rd,k (adiw rd,k) / SBIW Rd+1:Rd,k (sbiw rd,k) с регистровыми парами 25:24, 27:26, 29:28, 31:30
Ну это понятно,про такие команды мы знаем ,я немного про другое спрашивал:)) Разобрался вроде
Но все равно спасибо
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Здравствуйте, у меня есть некоторая проблема с переносом ассемблерной вставки bp CCG в AVR. Код взят по этой ссылке http://www.mikrocontroller.net/topic/292775, к слову этот код управляет диодами ws2812.
До этого момента с ассемблером не сталкивался, по CCG мануалов достаточно, так что я разобрался, что происходит в коде, а по CVAVR куций хэлп и больше не нашел.
Вот что получилось у меня.
brcc PC+2
cbi r2, r3
brne loop
// : "=&d" (ctr)
// : "r" (curbyte), "I" (ws2812_port), "I" (ws2812_pin)
#endasm
И если честно, даже прочитав Allocation of Variables to Registers в хэлпе я не понял, как правильно осуществляется доступ к глобальным переменным или в какой регистр и как их помещать, компилятор ругается. Где мне найти информацию и как правильно транслировать код в Code Vision?
И еще, тут: http://rurandom.org/justintime/index.ph ... _explained рассматривается какая-то более заковыристая реализация этой задачи, код координально рознится, какому стоит доверять?
Регистры r0-r15 c константами не работают, наверно по-этому компилятор ругается, с константами работают r16-r31, нужно заменить r0,r1,r2,r3 на какие нибудь из r16-r31, но какие из них использует компилятор в своих целях хз, так что с прогой в целом может произойти чтото непонятное, конфликт используемых регистров. Лучше все используемые регистры сохранить в стеке в начале вставки, а по завершении восстановить.
Я пытался засунуть их во все возможные регистры, все равно компилятор ругается, можно привести пример кода или рассказать, где можно посмотреть разбор похожего кода.
Вроде успешно раскидал по регистрам, но выдает ошибку в sbi r22,r23, в r22 записан 0х15, адрес порта С для атмега8, в r23 0x04- 4й порт. Вот еще такой вопрос, если я закрою инлайновую вставку, напишу то же по функционалу выражение, скажем PORTC.4=1, потеряю ли я такты на его исполнение?
Последний раз редактировалось MINSK42 Ср окт 30, 2013 15:59:49, всего редактировалось 1 раз.
MINSK42 писал(а):Вроде успешно раскидал по регистрам, но выдает ошибку в sbi r22,r23
Вы командой установки бита (от 0 до 7) пытаетесь установить бит с номером 23 (адрес регистра r23). SBI не предусматривает переменную в качестве второго аргумента, только константу. Да и первом аргументе должен быть прямой адрес, а не регистр. Так и пишите SBI PORTC,PC3
Получается, мне в сишной части нужно задать эти значения как константы и поместить их в соответствующие регистры r16-r31? что-то в стиле
register const char ws2812_pin=0x15 @16;
или же
const char ws2812_pin;
а потом в инлайновой вставке:
ldi r24,ws2812_pin
чтобы потом использовать sbi ?
Прямой адрес а не регистр? В примере " sbi %2, %3 \n\t", насколько я понимаю используется регистр.
Если у вас конкретный пин конкретного порта, не надо ничего определять, все уже должно быть определено просто пишите как есть SBI PORTC,PC3, если конечно адрес регистра попадает в дозволенный диапазон (иначе компилятор ругнется).
Если в диапазон не попадает, или нужно устанавливать произвольные биты произвольных портов, тогда придется использовать регистровые пары X,Y,Z и команды LD(S), ST(S).
получается в CCG для использования значений из основного кода и вывода из инлайновой вставки используется
: "=&d" (ctr)
: "r" (curbyte), "I" (ws2812_port), "I" (ws2812_pin)
а в CVAVR можно напрямую обращаться к переменным?
Мне бы хотелось разобраться, чтобы в будущем подобные вопросы не возникали.