Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.59/136: Рейтинг темы: голосов - 136, средняя оценка - 4.59
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
1

Макрос: сложение регистровой пары и одного регистра

24.04.2015, 00:37. Просмотров 24619. Ответов 43
Метки нет (Все метки)

Подскажите пожалуйста, как лучше сложить, скажем пару Z и R0. Естественно с минимальным количеством кода и тактов. Сходу написал:
add zl, r0
sbci zh, (-1)

А когда уже начал тестить увидел, что оно не работает)))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2015, 00:37
Ответы с готовыми решениями:

Как записать информацию из 16 битного регистра в два регистра по 8 бит
Как записать информацию из 16 битного регистра в два регистра по 8 бит. (То...

Сложение числа и регистровой пары
Как к получившемуся числу в DX:AX при умножении прибавить число? DX:AX + 1 =...

Сложение регистровой пары и двух байтов
Помогите с задачкой) Разработать программу которая производит сложение...

Сложение половинок регистра
Объясните плз как работает такое сложение и что находится в al и dh Какое...

Написать макрос сравнения без учета регистра
Пож, подскажите, есть макрос для сравнения текста двух ячеек, учитывающий...

43
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
25.04.2015, 13:01 21
Цитата Сообщение от rymomtsofto
Начал на си писать, накидал шаблончик, принялся считать - а там жопа) Ничего, нигде я не успеваю.
Ну если вы только шаблончик накидали и у вас уже проблемы - значит вы просто не умеете писать на Си... ну или не правильно планируете ресурсы контроллера...

Цитата Сообщение от rymomtsofto
А прожект такой, что границ не видно.
Вот тут (если проект будет большим) как раз таки писать на асме - утопия... т.к. по мере увеличения объема проекта, его продвижение начнет замедлятся в геометрической прогрессии (возможно - это не касается редкостных ассемблерных маньяков))))...
Я уже не говорю о перспективах изменения\доработки проекта, через определенное время...

Цитата Сообщение от rymomtsofto
Там, может, еще датчик температуры добавить, датчик освещенности, функционал какой походу допилить. Нужно чтобы место осталось (время).
Это все такие тривиальные задачи, что вообще не понятно почему тут идет речь о том что Си не в теме ???

Может вы бы лучше кинули тут список функционала вашего устройства, и хотя бы у остальных сложилась примерная картина, действительно ли выши опасения насчет использования Си - оправданы... я чет в этом очень сомневаюсь...

Цитата Сообщение от rymomtsofto
Вот мне, к примеру, нужен автомат подергать ножкой (мигалка). Будет у него три состояния - горит, не горит, выключен. Как мне его инициализировать и вызывать потом?
Помомему я не ошибся насчет вашей компетенции в программиировании))) Ну, только без обид... (Все мы задавли когда то такие вопросы...)
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
25.04.2015, 13:26 22
В общем как-то так, шаблон ядра конечного автомата на асме:
Код
//========================================================================
#define tab_h(x) HIGH(x), LOW(x)
#define tab_l(x) LOW(x), HIGH(x)
//========================================================================

//========================================================================
.macro   pushiwl
ldi      r16, LOW(@0)
push   r16
ldi      r16, HIGH(@0)
push   r16
.endmacro
//========================================================================

.cseg

//========================================================================
.macro Proc_FSM
ldz      @0*2
rjmp   _Proc_FSM
.endmacro

_Proc_FSM:
lpm      XH, Z+ ; Считывание старшего байта адреса состояния автомата.
lpm      XL, Z+ ; Считывание младшего байта адреса состояния автомата.
ld      r16, X ; Считывание состояния автомата.
lpm      r17, Z+ ; Считывание количества состояний автомата.
cp      r16, r17
brsh   Process_Errors_FSM
lpm      XH, Z+ ; Считывание адреса начала таблицы обработчиков состояний.
lpm      XL, Z
movw   ZH:ZL, XH:XL
add      ZL, r16 ; Смещение по индексу переменной состояния.
adc      ZH, RCLR
shiftlwz ; Выравнивание соттветственно пословной адресации.
lpm      r17, Z+ ; Считывание адреса обработчика состояния..
lpm      r16, Z
movw   ZH:ZL, r17:r16
ijmp ; Индексный переход.
Process_Errors_FSM:
cli ; немедленный запрет прерываний.
odyw   ZL, 2
lpm      r16, Z ; Считывание ID ошибки.
rjmp   Proc_Errors ; переход на обработчик ошибок.
//========================================================================

//========================================================================
.def   FSM_STATE             = r20
//========================================================================

//========================================================================
.equ   ERR_ID_FSM_1_MAX_STATES = 1
//========================================================================

.dseg

//========================================================================
_FSM_1_STATE: // Состояние автомата.
.byte   1
//========================================================================

//========================================================================
Proc_FSM_1_Save_State:
sts     _FSM_1_STATE, FSM_STATE
ret
//========================================================================

//========================================================================
Proc_FSM_1:
pushiwl      Proc_FSM_1_Save_State // Стек на сохранение переменных

lds         FSM_STATE, _FSM_1_STATE ; Считывание состояния.

Proc_FSM   Tab_FSM_1 // Индексный переход. Состояние автомата - индекс обработчиков состояний.
//========================================================================

//========================================================================
Proc_FSM_1_Init:
; bla-bla
Proc_FSM_1_Init_Save_State:
ldi FSM_STATE, _PROC_FSM_1_1
ret
//========================================================================

//========================================================================
Proc_FSM_1_1:
; bla-bla
Proc_FSM_1_1_Save_State:
ldi FSM_STATE, _PROC_FSM_1_OTHER
ret
//========================================================================

//========================================================================
//           STATE          MAX_FSM_STATES    TABLE_HANDLERS

Tab_FSM_1:
.db    tab_h(_FSM_1_STATE), MAX_FSM_1_STATES, tab_h(Tab_Jmp_FSM_1_Homdlers), ERR_ID_FSM_1_MAX_STATES

Tab_Jmp_FSM_1_Homdlers:
// Названия состояний задаем здесь во избежание ошибок.
.equ   MAX_FSM_1_STATES        = 2 // Количество состояний автомата.

.equ   _PROC_FSM_1_INIT        = 0
.db    tab_h(Proc_FSM_1_Init)

.equ   _PROC_FSM_1_1           = 1
.db    tab_h(Proc_FSM_1_1)
//========================================================================
Разъебеснение этой строки:
Код
   pushiwl      Proc_FSM_1_Save_State // Стек на сохранение переменных
В ядре индексный переход на обработчик состояния. ijmp. В конце обработчика установка состояния. Либо текущее остается, либо задается.
Код
Proc_FSM_1_Init_Save_State:
ldi FSM_STATE, _PROC_FSM_1_1
ret
По идее должен быть возврат, откуда вызвали модуль Proc_FSM_1. Но мы подсунули стеку адрес возврата Proc_FSM_1_Save_State. Поэтому сначала будет переход на этот адрес, и потом только возврат к месту вызова модуля.

Накидал на скору руку. Тщательно проверять нет ни времени ни желания. Разбирайтесь, запускайте мой пример в симуляторе студии. Удачи.

Всем желающим один из моих проектов на асме для разбирательства.

[22.77 Кб]
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
25.04.2015, 14:54 23
Dimiurg, только подошел, сейчас буду разбираться, спасибо, что взялись)))) Сейчас пока отвечу Shads.
Основная задача у меня - высокоразрядный BAM. На данный момент у меня получилось написать драйвер для 15 разрядов при частоте 160Гц. Мне хватает. Это значит, что я могу зажигать светодиод на 1/32768 периода. Я не знаю, как это сделать на си.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
25.04.2015, 15:48 24
Цитата Сообщение от YTYOUT
.def zero = R1
clr zero
add zl,r0
adc zh,zero
Можно еще и так
Код
   add    zl, r0
brnc   L1

yms     zh
L1:
Или нет?
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
25.04.2015, 16:04 25
Цитата Сообщение от rymomtsofto
Подскажите пожалуйста, как лучше сложить, скажем пару Z и R0. Естественно с минимальным количеством кода и тактов. Сходу написал:
add zl, r0
sbci zh, (-1)

А когда уже начал тестить увидел, что оно не работает)))
А так работает?
Код
   neg     r0
sub     zl, r0
sbci    -1
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
25.04.2015, 16:46 26
Спасибо, Bytt. Вариантов, как оказалось, много, но все компромиссные. Мне больше всего понравилось с нулевым регистром. Загнал я его на постоянку в шаблон, теперь можно везде укладываться в 2 команды)
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
25.04.2015, 19:54 27
Цитата Сообщение от Bytt
Цитата Сообщение от YTYOUT
.def zero = R1
clr zero
add zl,r0
adc zh,zero
Можно еще и так
Код
   add    zl, r0
brnc   L1

yms     zh
L1:
Или нет?
Нет. Новая команда , не обкатанная ATMEL , хрен ее знает как она себя поведёт. :) Вот brcc или brcs где-то как -то соглашусь.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
26.04.2015, 05:45 28
Цитата Сообщение от YTYOUT
Код:
add zl, r0
brnc L1

yms zh
L1:
Нет. Новая команда , не обкатанная ATMEL , хрен ее знает как она себя поведёт. :) Вот brcc или brcs где-то как -то соглашусь.Да, конечно, исправляю свою ошибку
Код
   add    zl, r0
brcc   L1

yms     zh
L1:
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.04.2015, 07:27 29
Победитель - Bytt. Отличный способ. Не требует дополнительного регистра. И меток.
Код
   ser r30
clr r31
ldi r16, 1

neg r16
sub r30, r16
sbci r31, -1
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
26.04.2015, 08:48 30
Цитата Сообщение от dymyurk1978
Код:
neg r16
sub r30, r16
sbci r31, -1
А вот как аналогичная задача решается на STM8. Требуется к 16-разрядному регистру Y прибавить 8-разрядное число в стеке
Код
          rrwa   y,a       ; yl -> a yh -> yl
add   a,(1,sp)   ; a += (1, sp)
jrnc   2$        ; Если есть перенос
ymsw   y         ; то yl += 1

2$:      rlwa   y,a        ; yh <- yl Yl <- a
Тут побольше команд требуется нежели в AVR.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.04.2015, 09:00 31
Я с пиками не работал, но видел обсуждения на форумах, обратил внимание, что у пиков система команд лучше. Во многих случаях можно обойтись меньшим кол-вом команд, чем у AVR. Было бы неплохо, если бы разработчики внедрили некоторые команды в AVR.
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
26.04.2015, 14:11 32
Цитата Сообщение от dymyurk1978
Победитель - Bytt. Отличный способ. Не требует дополнительного регистра. И меток.
Да, но к сожалению не работает с младшими регистрами и портит вычитаемое. А у меня вот оно - счетчик.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.04.2015, 14:23 33
Код
   mov r16, CNT

neg r16
sub r30, r16
sbci r31, -1
Универсальных решений нет. Каждый случай анализируется и делаются выводы, как быть в каждом конкретном случае.
Обсуждения подобные этому - источник решений. Как быть с этими решениями, решать вам.
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
26.04.2015, 14:36 34
Я очень с Вами солидарен, Dimiurg. В моем ответе нет ни тени недовольства или пренебрежения. Мне нужен был макрос. А он должен быть такой, чтобы не приходилось каждый раз заглядывать, как он там реализован.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.04.2015, 14:43 35
Загляните еще раз в мой архив и обратите внимание, как у меня организована работа с регистрами. Начиная от определений в pattern.yms, заканчивая регистрами в модулях.
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
26.04.2015, 15:04 36
Для того, чтобы понимать, как работают Ваши конструкции (и любые другие), нужно представлять, как они устроены впринципе. То есть нужно умознательно лицезреть абстрактную модель, отображающую основные узлы, ходы. Когда я смотрю в Ваш проект, мне трудно отделить зерна от плевел, где работает сам абстрактный механизм, скелет, а где уже мясо, на него навешанное. Конечно это из-за малого опыта в программировании. Это как в схемах. По началу смотришь и видишь линии, точки, детальки, а потом начинаешь видить стандартные ходы - повторитель, инвертор, полумост, фнч... Если бы Вы рассказали, в частности, про Вашу модель FSM в таком формате: основной код автомата лежит там-то и там-то. В первых трех байтах оперативы по адресу автомата лежит то-то и то-то, а затем адреса переходов и еще что-то. Мне было бы гораздо проще. Но просить об этом я, увы, не могу, потому как от природы очень скромен. Что поделать, буду впитывать по мере возможностей. И озадачивать глупыми вопросами форумчан периодически)
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.04.2015, 15:17 37
Вам дали шаблоны, расписали комментарии и все мало? Простите, но как вы просите, показать где лежит каждый байт, вам никто не подскажет. Во-первых, проекты даже на си тяжело читать, если проект писал не ты. Читать чужие программы написанные на асме, это вообще жесть.
Единственный способ разобраться в чужом коде (не говоря уж о своем...), это запустить программу в симуляторе и пошагово отслеживать, что где делается, что происходит.
Так что, больше, чем вам тут дали, не дадут нигде.
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
26.04.2015, 15:21 38
Я очень за это благодарен! Я неоднократно выражал свое спасибо) Мне вовсе не мало. Я так и сказал, что скромен от природы и не могу просить большего! Ваш Проект в моих запасниках. Буду потихоньку изучать, раз за разом подчерпывая все новые и новые знания.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.04.2015, 15:54 39
Судя по всему, вы сейчас все силы отдали своему проекту. Возможно, программирование хобби, и у вас есть какая-то другая работа. Я вам выскажу свои соображения, а вы решайте как быть дальше. Работа делается быстрее, если есть какая-то база, четкий план действий. База я вижу у вас слабовата. Насчет плана не знаю, но если он есть, то в нем уже заложено слабое звено - база. Отложьте пока свой проект на некоторое время. Понятно, что его хочется сделать побыстрее. Но, у вас гораздо быстрее пойдет проект, если вы разберетесь хотя бы с некоторыми вопросами. Я не знаю на каком вы уровне, какая стоит задача, что вам требуется. Это вам виднее. Ну а дальше, когда вы разберетесь что вам требуется, составите новый план и вперед.
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
26.04.2015, 16:07 40
Да, Вы очень хорошо все поняли. Я сейчас работаю над драйвером шим. После отладки пойдут интерфейсы - там как раз и будут автоматы. Я и хотел разобраться, может стоит писать не так, как раньше, а вот по-вашему. Вплоть до использования диспетчера таймеров. Но сидеть курить два дня Ваш проект терпения не хватает. Вот как дойдет дело - никуда не денусь.
0
26.04.2015, 16:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2015, 16:07

Смена регистра одного символа в строке.
Имееетса строка, нужно в ней сменить регистр нескольких символов. Смотрите в...

Число, занимающее более одного регистра
Собственно, задача такая: вывести объём доступной физической памяти в байтах....

Как переместить информацию из одного регистра в другой
Добрый день. Подскажите пожалуйста как сделать перенос из одного регистра в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru