Вы неправильно меня поняли... Я не использую команды положить/извлечь. Прерывания, подпрограммы естессно присутствуют. Как же без них? И никаких недоразумений со стеком не было... Кстати ещё вот что. Были непонятные баги когда прерывания срабатывали во время операций положить/извлечь в ОЗУ.
Вот это-то и непонятно - как можно использовать прерывания ( подпрограммы еще с трудом могу представить ) без положить/извлечь ( push/pop ) ? Ведь начало любого прерывания - это
push r16 in r16,SREG push r16 ...... В отличие от x86 и многих других процессоров, AVR при входе в прерывание не сохраняет слово состояния, и это надо делать ручками, иначе после возврата из прерывания можем получить измененные N Z V C с непредсказуемыми последствиями. Ну и какими-то регистрами в обработчике Вы пользуетесь - после возврата им надо отдать прежнее содержимое. Мне неловко говорить Вам банальные вещи, наверняка вы это знаете, но как тогда без push/pop в обработчике ? Может, и проблемы с записью/чтением памяти тоже с этим связаны? За 15 лет занятий микроконтроллерами всякого было у меня, но такого - никогда.
nsl2004 писал(а):
Протеус рулит.
И не только он Штатная Studio от Atmel`a рулит ничуть не хуже. А сколько я тут наслушался историй про баги в Протеусе... В Студии такого не замечалось. Ну что ж - каждому овощу - свой фрукт.
Вот это-то и непонятно - как можно использовать прерывания ( подпрограммы еще с трудом могу представить ) без положить/извлечь ( push/pop ) ? Ведь начало любого прерывания - это
push r16 in r16,SREG push r16 ...... В отличие от x86 и многих других процессоров, AVR при входе в прерывание не сохраняет слово состояния, и это надо делать ручками, иначе после возврата из прерывания можем получить измененные N Z V C с непредсказуемыми последствиями. Ну и какими-то регистрами в обработчике Вы пользуетесь - после возврата им надо отдать прежнее содержимое. Мне неловко говорить Вам банальные вещи, наверняка вы это знаете, но как тогда без push/pop в обработчике ? Может, и проблемы с записью/чтением памяти тоже с этим связаны? За 15 лет занятий микроконтроллерами всякого было у меня, но такого - никогда.
На счёт непредсказуемого изменения флагов вы абсолютно правы, плюс это вроде как хороший тон программирования на ассемблере. Но я занимаюсь МК АВР относительно недавно, поэтому некоторые шалости допускаю. Что же касается проблем с записью/чтением, то я так и не понял почему они возникали, т.к. этот кусок кода был расположен не в подпрограммах(там и в прерываниях проблем не было), а в основном цикле. Оффтоп, конечно. Но надеюсь поможет кому-то.
Ведь начало любого прерывания - это push r16 in r16,SREG push r16
А я использую вместо стека для хранения SREG свободный регистр (если таковой имеется), так и стек не используется и быстрее код выполняется (in-out, вместо push,in,push-pop,out,pop).
Ведь начало любого прерывания - это push r16 in r16,SREG push r16
А я использую вместо стека для хранения SREG свободный регистр (если таковой имеется), так и стек не используется и быстрее код выполняется (in-out, вместо push,in,push-pop,out,pop).
Тоже вариант. Но надо быть уверенным, что этот регистр не изменится не только программой, но и самим железом в процессе работы. А выигрыша я что-то не вижу : IO в IO напрямую не перекинешь, все равно через РОН - в чем выигрыш?
Что же касается проблем с записью/чтением, то я так и не понял почему они возникали, т.к. этот кусок кода был расположен не в подпрограммах(там и в прерываниях проблем не было), а в основном цикле. Оффтоп, конечно. Но надеюсь поможет кому-то.
А ему пофиг, где расположена инструкция - в основном цикле или в п/п. Прерывание - штука асинкронная, и где застанет, там и прервет, и если обработчик накосячен, то и в основном цикле бед натворит - будь здоров.
Тоже вариант. Но надо быть уверенным, что этот регистр не изменится не только программой, но и самим железом в процессе работы.
Ну так я и говорю, если есть свободный регистр. И контроль за неизменяемостью естественно обязателен. Но например прерывания друг друга не прерывают (если не извращаться с многоуровневыми) и в каждом обработчике можно спокойно это использовать.
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 такта
Здраствуйте, Подскажите, что не так смоделировано в proteuse дозатор жидкости индикация есть, предустановки литров выставляются , а счет не идет? Проект в proteuse прилагаю.
_________________ Некакого перимирия, Некаких мирных шагов навстречу и периговоров.
Подскажите, что не так смоделировано в proteuse дозатор жидкости индикация есть, предустановки литров выставляются , а счет не идет?
1. В схеме нет четкого формирования импульсов. Это может быть критично для симуляции, в реальном устройстве должно работать. 2. Чтобы накапал литр должно поступить некоторое количество импульсов. В Ваш проект добавил генератор импульсов (для наглядности 10 Гц) и счет работает.
С генератором стало понятно, что у меня не получалось. На вход PD4 должно быть подано 40 импульсов , и тогда счёт уменьшается на единицу. Устройство нормально моделируется. Спасибо.
_________________ Некакого перимирия, Некаких мирных шагов навстречу и периговоров.
Ну так я и говорю, если есть свободный регистр. И контроль за неизменяемостью естественно обязателен.
О, я сразу не въехал - я думал, речь идет о регистре НЕИСПОЛЬЗУЕМОГО ВНЕШНЕГО УСТРОЙСТВА ( я как-то и такой изврат пытался замутить, не помню уже - из каких побуждений ), а не о неиспользуемом РОН. Но тут нужно бдительно следить, потому что если приходится модифицировать код, можно забыть, что этот регистр "горячий" , и будет трудноуловимая бага. И выигрыш пару тактов может аукнуться. Впрочем, в моем "творчестве" был период, когда я группу регистров выделил в разряд "мальчиков на побегушках", ничего глобального сквозь всю программу в них, конечно, не передавалось, а мои библиотечные подпрограммы имели их как хотели.
Я думаю, нам простят, что слегка отклонились от Протеуса, но в конце-то концов - мы ведь не про футбол и не про девочек
Вообще-то для протеуса отдельная тема есть... Но ладно. 8-я по счету пиктограмма слева - terminals mode, в ней выбираем power, ставим в схему, в свойствах пишем "+12V", все.
Вообще-то для протеуса отдельная тема есть... Но ладно. 8-я по счету пиктограмма слева - terminals mode, в ней выбираем power, ставим в схему, в свойствах пишем "+12V", все.
Это та я знаю но там нет пункта свойства! Нашел батарею... Спасибо
У всех есть, а у Вас нету. Все по Proteus задают вопросы в специально созданной теме, а Вы новую заводите для вопроса, требующего ответа в несколько слов... Какая-то система уже вырисовывается...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения