Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Можно и так. В а вообще делается так:
SUBI XL,-1
SBCI XH, -1
BRNE ...
В tiny2313 и в tiny13 команды ADIW и SBIW работают
Да, в 2313 точно есть.
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

ploop писал(а):Можно и так. В а вообще делается так:
SUBI XL,-1
SBCI XH, -1
BRNE ...
Прошу пардону, но

Код: Выделить всё

SBCI XH, -1
при СY вычтет сразу "2", соббсно перенос и 1

зы я чёйто не понял про "-1"
Последний раз редактировалось GP1 Чт май 24, 2012 14:56:22, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Упс... SBC конечно, без "I". Я просто для этих целей держу нулевой регистр.
зы я чёйто не понял про "-1"
Просто в этом году ничего не писал на ассемблере. Это сложение :)

SUBI XL,1
SBCI XH,0

или

SBC XH,null (где null - регистр с нулём)
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

во, а то я уже подумал что по старости отстал от жизни и надо минус ставить

дополню, ну чисто из-за занудства :)))
я бы ещё эти два оператора между cli...sei поместил, так на всякий случай, вдруг прерывание, вдруг sreg забыл про пуш-попить :)))
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

GP1 писал(а):во, а то я уже подумал что по старости отстал от жизни и надо минус ставить
:)))
GP1 писал(а):я бы ещё эти два оператора между cli...sei поместил, так на всякий случай, вдруг прерывание, вдруг sreg забыл про пуш-попить :)))
Да уж лучше один раз sreg про пуш-попить, чем каждый раз cli-sei ставить :)
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

shads писал(а):Да уж лучше один раз sreg про пуш-попить
Согласен, но в каждом обработчике :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Про атомарность операций - отдельная тема, и, похоже, только ассемблерщики про неё помнят. Кстати, как там в Си с этим дело обстоит? Компилятор за это отвечает?
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Зуб дает. Дажеть свой стек данных под это дело отводит.
Docendo discimus
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

А, ну тады хорошо :)
Друг Кота
Аватара пользователя
Сообщения: 15613
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

... мня...
а про "вложенные" счетчики народ похоже забыл Сивсем... :cry:
time:
ldi cnth,40
time1:
ldi cntl,250
time2:
dec cntl
brne time2
dec cnth
brne time1
где cntl и cnth любые из r16-r31
возможно константы досчета подбирать прийдется, если это задержка по времени
:beer:
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Раз уж пошла такая песня, то начинаем с nop'ов и заканчиваем таймерами(железными).
Docendo discimus
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

BOB51 писал(а):... мня...
а про "вложенные" счетчики народ похоже забыл Сивсем... :cry:
:beer:
А зачем они , если всегда найдётся свободный таймер, только проц зря занимает. Ну на крайний случай , можно и прерывания посчитать
Родился
Сообщения: 1
Зарегистрирован: Чт май 24, 2012 20:05:43

Сообщение koksi »

Добрый вечер! Помогите реализовать игральный кубик, с выводом на 7-сегментный индикатор, числа от 1 до 6. При этом что бы одна кнопка останавливала число, а вторая каждые 3-5 сек выводило новое. Вообще как лучше это сделать, просто я начинающий(как неделю) и во всем запутался) Подскажите) (или хотя бы кинуть исходник(пример) как надо делать). Заранее Благодарю! Нарушение п.2.5 Правил Форума. Код оформляйте как вложение
Gudd-Head
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

ILYAUL писал(а): если всегда найдётся свободный таймер...
а у меня, как правило, их не вытает, хоть убейся :kill:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Боже ж ты мой! Это же мой генератор ПСЧ! Правда кто-то похерил комментарий перед тобой:

Код: Выделить всё

;
;X(i+1)= ( A*X(i) + B) mod 65536
;
;A= 77 (A mod 4= 1)
;B= 1 нечетное
;
;
и обозвал TIMER. Милое мое детище! Вэлком бэк! :cry:
Docendo discimus
Контактная информация:
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

А что именно не работает? Я бы добавил инициализацию ГСЧ при первом включении по длительности удержания кнопки включения(запустить таймер по подаче питания, и считать его значение при отпускании кнопки). Иначе, будет довольно прогнозируемый "кубик".

А вообще, зачем этот ГСЧ - просто прокручивай таймер на максимальной скорости и считывай его в момент отпускания кнопки, потом остаток от деления на 6 вывести на индикатор.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

Сообщение MS24 »

shads писал(а):Вернее я делал так:

LDI XL,low(10000)
LDI XH,high(10000)
Y: ........ ; здесь делаем то что нужно в цикле
DEC XL
BRNE Y
DEC XH
BRNE Y

кстати любые можно регистры использовать, не только самые верхние.
Спасибо большое за помощь! вот только один момент, допустим в h и L регистра число 10 000.
В бинарном виде это 10011100010000.
Мы пишем в L 00010000, в H 100111, получается так?
декрементируем оба регистра и получаем в L 00001111, в h 100110.
А это никак не 9999, т.е получается что мы не единицу вычли!
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

А зачем декрементировать ОБА регистра?
BRNE Y после первого декремента вернет нас сразу на начало цикла, и только когда в результате декремента получится НОЛЬ, BRNE не выполнится и произойдет декремент старшего регистра.

Немного корявая логика работы, декремент второго регистра должен происходить при возникновении переноса(переход с 00 на FF) а не нуля иначе декремент старшего регистра произойдет преждевременно на одну итерацию, и цикл скорей всего не досчитается 255 итераций.

Вот досчитали до состояния L=1 H=1, в результате декремента L становится равным нулю, BRNE не выполняется и тут же происходит декремент H = 0, слеующий BRNE так же не выполняется и цикл заканчивается, хотя он должен еще отработать 255 итераций.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15613
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

если уж так хочется дергать регистровую пару, так тягайте любую, кроме индексных (z,y,x) и r0-r1 - эти должны оставаться резервом для использования по назначению :roll:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

BOB51 писал(а):если уж так хочется дергать регистровую пару, так тягайте любую, кроме индексных (z,y,x) и r0-r1 - эти должны оставаться резервом для использования по назначению :roll:
R0 - вроде знаю - чтение из флэш..... а R1 - какое назначение? (или они вместе как регистровая пара имеют какоето назначение?)
Ответить

Вернуться в «AVR»