Re: Proteus: вопросы и ответы
Добавлено: Ср мар 16, 2011 13:34:26
Engineer_Keen & Murka спасибо за помощь.
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Вот это-то и непонятно - как можно использовать прерывания ( подпрограммы еще с трудом могу представить ) без положить/извлечь ( push/pop ) ? Ведь начало любого прерывания - этоRoman Venom писал(а): Вы неправильно меня поняли... Я не использую команды положить/извлечь. Прерывания, подпрограммы естессно присутствуют. Как же без них?И никаких недоразумений со стеком не было... Кстати ещё вот что. Были непонятные баги когда прерывания срабатывали во время операций положить/извлечь в ОЗУ.
И не только онnsl2004 писал(а): Протеус рулит.
На счёт непредсказуемого изменения флагов вы абсолютно правы, плюс это вроде как хороший тон программирования на ассемблере. Но я занимаюсь МК АВР относительно недавно, поэтому некоторые шалости допускаю. Что же касается проблем с записью/чтением, то я так и не понял почему они возникали, т.к. этот кусок кода был расположен не в подпрограммах(там и в прерываниях проблем не было), а в основном цикле.Вот это-то и непонятно - как можно использовать прерывания ( подпрограммы еще с трудом могу представить ) без положить/извлечь ( push/pop ) ? Ведь начало любого прерывания - это
push r16
in r16,SREG
push r16
......
В отличие от x86 и многих других процессоров, AVR при входе в прерывание не сохраняет слово состояния, и это надо делать ручками, иначе после возврата из прерывания можем получить измененные N Z V C с непредсказуемыми последствиями. Ну и какими-то регистрами в обработчике Вы пользуетесь - после возврата им надо отдать прежнее содержимое. Мне неловко говорить Вам банальные вещи, наверняка вы это знаете, но как тогда без push/pop в обработчике ? Может, и проблемы с записью/чтением памяти тоже с этим связаны? За 15 лет занятий микроконтроллерами всякого было у меня, но такого - никогда.
А я использую вместо стека для хранения SREG свободный регистр (если таковой имеется), так и стек не используется и быстрее код выполняется (in-out, вместо push,in,push-pop,out,pop).Jack_A писал(а):Ведь начало любого прерывания - это
push r16
in r16,SREG
push r16
Тоже вариант. Но надо быть уверенным, что этот регистр не изменится не только программой, но и самим железом в процессе работы. А выигрыша я что-то не вижу : IO в IO напрямую не перекинешь, все равно через РОН - в чем выигрыш?Engineer_Keen писал(а):А я использую вместо стека для хранения SREG свободный регистр (если таковой имеется), так и стек не используется и быстрее код выполняется (in-out, вместо push,in,push-pop,out,pop).Jack_A писал(а):Ведь начало любого прерывания - это
push r16
in r16,SREG
push r16
А ему пофиг, где расположена инструкция - в основном цикле или в п/п. Прерывание - штука асинкронная, и где застанет, там и прервет, и если обработчик накосячен, то и в основном цикле бед натворит - будь здоров.Roman Venom писал(а):Что же касается проблем с записью/чтением, то я так и не понял почему они возникали, т.к. этот кусок кода был расположен не в подпрограммах(там и в прерываниях проблем не было), а в основном цикле.
Оффтоп, конечно. Но надеюсь поможет кому-то.
Ну так я и говорю, если есть свободный регистр. И контроль за неизменяемостью естественно обязателен. Но например прерывания друг друга не прерывают (если не извращаться с многоуровневыми) и в каждом обработчике можно спокойно это использовать.Jack_A писал(а): Тоже вариант. Но надо быть уверенным, что этот регистр не изменится не только программой, но и самим железом в процессе работы.
Jack_A писал(а): А выигрыша я что-то не вижу : IO в IO напрямую не перекинешь, все равно через РОН - в чем выигрыш?
Код: Выделить всё
PUSH R16
IN R16,SREG
PUSH R16
...
POP R16
OUT SREG,R16
POP R16
;6 байт, 10 тактов
Код: Выделить всё
IN TMP_S,SREG
...
OUT SREG,TMP_S
;2 байта, 2 такта
1. В схеме нет четкого формирования импульсов. Это может быть критично для симуляции, в реальном устройстве должно работать.Coviraylhik писал(а):Подскажите, что не так смоделировано в proteuse дозатор жидкости индикация есть, предустановки литров выставляются , а счет не идет?
О, я сразу не въехал - я думал, речь идет о регистре НЕИСПОЛЬЗУЕМОГО ВНЕШНЕГО УСТРОЙСТВА ( я как-то и такой изврат пытался замутить, не помню уже - из каких побуждений ), а не о неиспользуемом РОН. Но тут нужно бдительно следить, потому что если приходится модифицировать код, можно забыть, что этот регистр "горячий"Engineer_Keen писал(а): Ну так я и говорю, если есть свободный регистр. И контроль за неизменяемостью естественно обязателен.
Это та я знаю но там нет пункта свойства! Нашел батарею... СпасибоEngineer_Keen писал(а):Вообще-то для протеуса отдельная тема есть... Но ладно. 8-я по счету пиктограмма слева - terminals mode, в ней выбираем power, ставим в схему, в свойствах пишем "+12V", все.
У всех есть, а у Вас нету. Все по Proteus задают вопросы в специально созданной теме, а Вы новую заводите для вопроса, требующего ответа в несколько слов... Какая-то система уже вырисовывается...linch писал(а):Это та я знаю но там нет пункта свойства!
Должно получиться вот так:linch писал(а):...Разберусь.
Давайте уж проект, будем вместе разбираться.linch писал(а):Вот