Ну насчет флагов и их сброса... Или еще интереснее... регистр USISR (та же 2313)... Содержит как флаги, так и USICNT3..0: Counter Value... попытаемся вручную сбить любой из флагов, не нарушив содержимое USICNT3..0
Код:
TEST: CLR R0 STS MCUSR+$20,R0
IN R0,USISR OUT USISR,R0 ; эту операцию можно проводить не всегда. Смотреть DS. RJMP TEST
И снесет усе, которые в 1... А выборочно - поштучно - будет ли обнуление в USICNT3..0 ежли возвернуть байт с единицей только в выбранной позиции? похоже, что вполне реально... ибо в случае таких флаг-регистров со смешанным содержимым при засылке взад байта с единичкой в позиции необходимого к сбросу флага и нулями в остальных похоже срабатывает своя аппаратная начинка...
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт ноя 08, 2016 09:34:01
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
BOB51 писал(а):
А выборочно - поштучно
Код:
IN R16,USISR andi R16,0x0F+(1<<flag) OUT USISR,R16
Добавлено after 3 minutes 19 seconds: В STM32 есть регистры в котором биты одновременно: -только чтение -обычная запись -только сброс записью нулем - инвертирование при записи 1
Вот это настоящий изврат .
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
я, конечно, от ассемблера отошел давно, но что-то мне подсказывает, что команда SBI требует непосредственного указания константы во втором операнде, а значит адрес USISIF будет воспринят, как константа, и результат SBI USISR, USISIF будет не совсем тот, который ожидается...
или речь не об AVR?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт ноя 08, 2016 15:23:25
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Z_h_e писал(а):
Стоит проверить эту команду. Не исключено, что эта команда также работает с маской, только аппаратно.
Сделал в симуляторе атмел студио следующее (мега324): -установил все флаги регистра TIFR0 -сбросил флаг SBI TIFR0,0
Флаг сбросился, остальные остались установленными. И все равно у меня есть сомнение, что в регистр пишется только один бит, а не все слово разом данной командой. Не зря же одна двухтактная.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
IMHO, в регистр наверняка пишется все слово, а не один бит. Другое дело, что так как чтение и запись слова выполняются одной командой, то между ними прерывания произойти не может. Следовательно, операция, с точки зрения программиста, является атомарной, что, собственно говоря, и требуется.
_________________ Не ошибается только то, кто ничего не делает. Тот, кто признает свои ошибки, на них учится. Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт ноя 08, 2016 16:03:02
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Вы не поняли мой мысля. Если данная команда пишет все слово (т.е. выполняет сишное |=), то весьма вероятно произойдет сброс всех флагов. Может конечно декодер команд, до такой степени продвинутый, что умеет писать правильное слово-маску для каждого регистра
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт ноя 08, 2016 16:31:47
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Хоть ссылку бы дали про что Вы. "Хотелось бы, так сказать, в общих чертах понять, что ему нужно". Ну а если это не касается других форумчан, то пишите в личку воспрашаемому.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Уважаемый akl, не могу промяукать ваше предложение. Переделал программу по вашей рекомендации и на выходе usart не вижу команд. 1). inc interrupt cpi interrupt,80 ; breq rst2 BRLO PC+2 ;если interrupt меньше 80, то перепрыгиваем одну команду и сбрасываем interrupt и выходим из прерывания. Но тогда никогда не достигнем 80. SET ;Set T in SREG clr interrupt reti
2). taimer_overflow: ;на эту метку мы возвращались по завершению цикла программы или совпадению interrupt==80. Как ее применять сейчас - не понятно. NOP RJMP START ;Эта команда бросает нас на начальную инициализацию. Но ведь это делается один раз при старте.
Буду благодарен за ответы.
Добавлено after 1 minute 58 seconds:
Z_h_e писал(а):
Хоть ссылку бы дали про что Вы. "Хотелось бы, так сказать, в общих чертах понять, что ему нужно". Ну а если это не касается других форумчан, то пишите в личку воспрашаемому.
Исправился. Был уверен, что нажав на кнопку "Цитата" под сообщением, оно займет соответствующее место, а не выкинет в конец темы. Учту. Спасибо.
1). inc interrupt cpi interrupt,80 BRLO PC+2 ;если interrupt меньше 80, то перепрыгиваем одну команду и сбрасываем interrupt и выходим из прерывания. Но тогда никогда не достигнем 80. SET ;Set T in SREG clr interrupt reti
Да, это ошибка. Нужно Спойлер
Код:
Taimer: inc interrupt cpi interrupt,80 BRLO Taimer_OUT ;PC+3 SET ; ??????? ???? clr interrupt Taimer_OUT: reti
siimao писал(а):
2). taimer_overflow: ;на эту метку мы возвращались по завершению цикла программы или совпадению interrupt==80. Как ее применять сейчас - не понятно.
Значит эта метка не нужна.
siimao писал(а):
RJMP START ;Эта команда бросает нас на начальную инициализацию. Но ведь это делается один раз при старте.
Опыт подсказывает, что периодическая инициализация лишней не бывает. К тому же, это учебный пример, позволяющий зациклить программу, а не стоять в RJMP PC, стартуя каждый раз вручную.
1) - Спасибо. 2) - Метка пригодится, найду ей место для прыжка. 3) - Заранее прошу прощения, что по этому ответу придираюсь за помощью... "периодическая инициализация лишней не бывает". -> Но внутри нее предустанавливаются порты IO. Можно, конечно, еще одну метку установить, чтобы порты не трогать... "это учебный пример, позволяющий зациклить программу, а не стоять в RJMP PC, стартуя каждый раз вручную." -> не понятна концовка "..., стартуя каждый раз вручную". Что имелось ввиду под ручным стартом? А если он не нужен, этот старт?
Ну и пошел переделывать программу. Интересен результат. А в чем advantage этого метода перед использованием 4 x pop?
Изучая asm по книгам и больше на примерах, понял, что при входе в каждую процедуру обработки прерываний в самом начале необходимо сохранять в стек значения переменных, которые задействованы в конкретной процедуре обработки и SREG. Это не применено ни у автора и не предложено Вами.
Последний раз редактировалось siimao Ср ноя 09, 2016 14:54:17, всего редактировалось 1 раз.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср ноя 09, 2016 14:40:57
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
siimao писал(а):
Изучая asm по книгам и больше на примерах, понял, что при входе в каждую процедуру обработки прерываний в самом начале необходимо сохранять в стек значения переменных, которые задействованы в конкретной процедуре обработки. Это не применено ни у автора и не предложено Вами.
Не всегда надо сохранять и сохранять не обязательно на стек. Например, если основной цикл программы ничего не делает, то сохранение не нужно. Иногда реакция на какое-то событие должна быть максимально быстрая. Выделяете регистры, которые не будут использоваться в основном теле программы, в один из регистров сохраняете SREG, остальные сохранять не надо, так как больше нигде не используется. В прерывании можно не сразу сохранять значения, например, включаете порт используя команды не меняющие флаги и регистры, а уж потом сохраняете нужно и выполняете остальное.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср ноя 09, 2016 16:57:02
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Что Вы имеете ввиду говоря "переменная"?
siimao писал(а):
Допускается ли для сохранения SREG и переменных использовать младшие регистры?
Поймите смысл сохранения данных в прерывании. Есть, например, основной цикл программы. Основная программа считывает значение порта в R16, затем проверяет его на равенство с "число" и если равно, то что-то выполняет и есть куча неких прерываний. Если прерывание возникло после считывания порта в R16, в обработчике прерывания Вы его изменили, то на равенство с "числом" после выхода из подпроограммы будет проверяться другое значение. Ушли в прерывания после команды сравнения на равенство с "числом", но не сохранили SREG. Флаги будут изменены подпрограммой и Вы уже не знаете результат сравнения. Основная программа не использует регистры R0-15, т.е. ей без разницы что в них.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Основная программа не использует регистры R0-15, т.е. ей без разницы что в них.
Значит можно использовать эти регистры R0-15 для временного хранения SREG и переменных; или их можно использовать в обработчиках прерываний. Встречал, что есть какие-то ограничения на их применения. Но уже сил нет перечитывать всю литературу... хоть где копать, подскажите. За ликбез о прерываниях - спасибо! А каковы причины переполнения стека? Это как-то связано с этими самыми прерываниями? Я только "первый раз сказал Мяу". Какие вкладки в AVR Studio 4.19 надо открыть, чтобы этот процесс отследить, понять и избежать? Спасибо!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения