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

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

Alexeyslav писал(а):
Ага, таймер останавливается потому что микроконтроллер переходит в глубокий сон с остановкой тактового генератора, я точно не помню но атмеловске контроллеры имеют несколько режимов сна и они как-то настраиваются. Среди них есть такие режимы которые не останавливают переферию и тактовый генератор, например режим сна для минимизации шумов на время измерения АЦП который останавливает только ядро.

Регистр MCUCR биты SM2..0 определяют режим сна. Тебе поидее нужен режим 000 - Idle.
Ну они ж вроде по умолчанию стоят в нулях, я их и не трогаю. :cry: а ладно, со сном буду позже разбираться, тут вполне прокатывает бесконечный цикл.
Не прокатывает потому что SBI работает только с нижней частью портов. увы.

Но ничто не мешает вам прописать ту конструкцию как макрос и вызывать одной короткой строчкой.

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

Но его несложно самому написать, в хелпе прочитать про директиву .macro и директивы условной компиляции.
ага. Значит и флаг сработки компаратора только через макрос смогу очищать? Или тут еще все хуже? Хотя нет... флаг разрешения прерывания компаратора я же могу выставить прямо. Тогда почему не могу очистить флаг срабатывания?
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Надо читать даташит по этому поводу. Поидее, он сбрасывается записью туда "1", биты равные нулю просто игнорируются.
Из даташита:
• Bit 4 – ACI: Analog Comparator Interrupt Flag
This bit is set by hardware when a comparator output event triggers the interrupt mode defined
by ACIS1 and ACIS0. The Analog Comparator Interrupt routine is executed if the ACIE bit is set
and the I-bit in SREG is set. ACI is cleared by hardware when executing the corresponding inter-
rupt Handling Vector. Alternatively, ACI is cleared by writing a logic one to the flag.
Бит признака прерывания очищается аппаратно после старта процедуры обработки прерывания, либо...
В последней строчке написано что альтернативно бит прерывания может быть очищен записью в него лог.1
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

Alexeyslav писал(а): Бит признака прерывания очищается аппаратно после старта процедуры обработки прерывания, либо...
В последней строчке написано что альтернативно бит прерывания может быть очищен записью в него лог.1
Да, правы Вы, надо внимательно читать даташит. Я-то туда все 0 пытался упихнуть... :oops:
И еще вопрос нарисовался. Почему по reti возвращает не в основной цикл (я же правильно понимаю, что должно возвращать в место, откуда прерывание вызвалось?), а сбрасывает на начальную инициализацию
.org 0 ;Задание нулевого адреса старта программы
rjmp Reset
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Если ты стек установил правильно, то адрес возврата запоминается в RAM при возникновении прерывания, и извлекается командой RETI. Если стек не установлен, или вы что-то нахимичили в процедуре обработки прерывания до вызова RETI - может быть все что угодно.
Как образцовый пример - вызов RETI не из прерывания и/или без инициализации стека.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

Alexeyslav писал(а):вы что-то нахимичили в процедуре обработки прерывания до вызова RETI - может быть все что угодно.
Как образцовый пример - вызов RETI не из прерывания и/или без инициализации стека.
т.е. это срыв стека? Предполагал. Ибо нахимичил :)
Реклама
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

Сообщение MS24 »

Ребят, а как можно сделать на асм счетчик? Т.е на си это выглядело бы так:
i = 10000
while i !=0;
{
--i
{
А число I двухбайтовое, как мне его инкрементировать?
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

sbiw
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

Сообщение MS24 »

GP1 писал(а):sbiw
Я просто просветлел, и как же я сам-то не додумался сразу-то??? Это же все просто, я как увидел эту команду, сразу же все понял!!!
Прям сейчас пойду построю себе космолет с такими знаниями )))
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Ответ правильный, но чересчур лаконичный :-), так что ерничать особо не стоит.
В приведенном фрагменте декремент i, а в вопросе стоит - как его инкрементировать.
Декремент делается вот так :
LDI XL,low(10000)
LDI XH,high(10000)
Y: ........ ; здесь делаем то что нужно в цикле
SBIW XL,1
BRNE Y
Не стоит забывать, что SBIW работает на четырех последних регистровых парах :
R24,R25 ... R30, R31
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

BRNE Y
Просто для сведения: не все ассемблеры пропустят такую метку (совпадает с именем регистровой пары)
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Jack_A писал(а): LDI XL,low(10000)
LDI XH,high(10000)
Блин... Вот что значит век живи — век учись :)))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Эээ... ты не знал про low и high? :)
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Знал... Просто не допирал, что можно автоматически перевести из десятичного в хекс и разбить :oops:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

ploop писал(а):
BRNE Y
Просто для сведения: не все ассемблеры пропустят такую метку (совпадает с именем регистровой пары)
Ну это я для краткости нажатий клавиш и вроде бы радиокот табуляции не пропускает.
А то написал бы
BRNE LOOP1 :)
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Jack_A писал(а):SBIW XL,1
А эта команда на тиньках работает? чтото я не встречал в описаниях тиньки.....
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Надо открыть конкретный даташит и посмотреть. Кажется только на мегах.
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

ploop писал(а):Надо открыть конкретный даташит и посмотреть.
Ну, или Микроконтроллеры AVR семейства Tiny Mega фирмы Atmel А.В.Евстифеева.

В тиньках, как я понимаю, надо будет в 2 приёма — сначала вычитать 1 из младшего байта, потом С (или V?) из старшего.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Gudd-Head писал(а):В тиньках, как я понимаю, надо будет в 2 приёма — сначала вычитать 1 из младшего байта, потом С (или V?) из старшего.
Нормально, будет работать http://www.nikolaew.org/avr_old/u3.htm,
А я все время делал именно так, в 2 приема.....
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

В tiny2313 и в tiny13 команды ADIW и SBIW работают. Чтобы не гадать, лучше
ploop писал(а):...открыть конкретный даташит и посмотреть...
раздел Instruction Set Summary
Последний раз редактировалось akl Чт май 24, 2012 14:33:45, всего редактировалось 1 раз.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Вернее я делал так:

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

кстати любые можно регистры использовать, не только самые верхние.
Ответить

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