- Вложения
-
- source.asm
- Исходник программы.
- (1.55 КБ) 603 скачивания
Проблема с прерыванием INT0.
- Сообщения: 7
- Зарегистрирован: Чт янв 03, 2008 23:04:59
Здравствуйте! Во-первых хочу поблагодарить и сказать Спасибо за хороший сайт, за понятную и простую обучалку и за все остальное!
Почитал курс и осмелился приобрести контроллер и поработать вживую как говорится. ) Собрал я значит на макетке все самое необходимое для мигания четырьмя светодиодами (больше не нашел
). Все работает. И одним помигал, и всеми и туда-сюда помигал. Теперь решил с кнопкой на внешнее прерывание поработать. Контроллер у меня... извините за выражение - AT90S1200.
(Скоро приобрету тини2313) Алгоритм таков: мигает первый светодиод, после нажатия кнопки он отключается и начинает мигать следующий, еще нажал - второй отключился, третий замигал и так далее по кольцу. Написал, прошил работает. Но, когда отпускашь кнопку ИНОГДА происходит "перескакивание" мигания с одного на другой или даже два сразу пропускаются. Думаю проблема в дребезге контактов при их размыкании, но как мне это программно решить - не знаю, поэтому и прошу помощи. Ниже прикрепляю исходник. Заранее благодарю!
- Реклама
- Сообщения: 7
- Зарегистрирован: Чт янв 03, 2008 23:04:59
После сбоя в работе форума все сообщения темы удалились, но ничего... Главное наконец-то проблема решена! :
Конечно же с вашей помощью и помощи многоуважаемого ARV. ) Сначала добавил конденсатор 0,1мкф параллельно кнопке - работа улучшилась, но несмотря на нажатия, не происходило переключеня с третьего светодиода на четвертый. В подпрограмму обработчика, добавил MOV Temp,Pin , несмотря на то что эта команда существует в основном цикле программы - заработало... Смутным мне остается причина возникновения этого сбоя, физически не могу представить... Ниже немного измененный, рабочий на данный момент исходник. Всем Спасибо! 
- Вложения
-
- SourceL.asm
- (1.78 КБ) 336 скачиваний
И тем не менее в своем коде ты не устранил указанный мной недочет: не сохраняешь SREG в обработчике прерывания. Это плохо, даже если сейчас работает. Посеешь наплевательское отношение к SREG - пожнешь кучу проблем в настоящих программах.
Еще недочеты: конденсатор на входе INT не нужен. Флаг запроса прерывания на выходе из обработчика не сбрасываешь - это плохо. Команда, стоящая прямо на метке loop - бесполезная, ее смело можно выкинуть. Какая тактовая частота? Для гарантии защиты от дребезга нужна задерка не менее 10 мс. Если тактовая частота высокая - задержки в 256 повторов цикла (в обработчике) может не хватить для получения 10 мс.
Причина этих сбоев (уверен - в текущем варианте программы не устраненная полностью) кроется в том, что пока ты делаешь задержку в своем прерывании, из-за дребезга может снова установиться флаг запроса, который ты не сбрасываешь. Т.е. после завершения прерывания мгновенно возникнет новое (но еще от старого нажатия кнопки) - и твой огонь перескочит через одну позицию.
Еще недочеты: конденсатор на входе INT не нужен. Флаг запроса прерывания на выходе из обработчика не сбрасываешь - это плохо. Команда, стоящая прямо на метке loop - бесполезная, ее смело можно выкинуть. Какая тактовая частота? Для гарантии защиты от дребезга нужна задерка не менее 10 мс. Если тактовая частота высокая - задержки в 256 повторов цикла (в обработчике) может не хватить для получения 10 мс.
Причина этих сбоев (уверен - в текущем варианте программы не устраненная полностью) кроется в том, что пока ты делаешь задержку в своем прерывании, из-за дребезга может снова установиться флаг запроса, который ты не сбрасываешь. Т.е. после завершения прерывания мгновенно возникнет новое (но еще от старого нажатия кнопки) - и твой огонь перескочит через одну позицию.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 7
- Зарегистрирован: Чт янв 03, 2008 23:04:59
Тактовая частота 4МГц. Флага внешнего прерывания INT0 в микроконтроллере AT90S1200 нет. Я вообще-то сделал как вы сказали насчет сохранения регистра SREG, но после того как заработало, убрал эти команды, верну обязательно. Задержка в обработчике 6,4мс, сделаю больше десяти... Вобщем, доработаю с вашими рекомендациями и как закончу выложу сюда...
- Сообщения: 7
- Зарегистрирован: Чт янв 03, 2008 23:04:59
Если убрать команду возле метки loop: mov Temp,Pin
то нарушается работа программы. Можно поставить туда ldi Temp,0x01, но в этом случае вызов прерывания ничего не изменит - будет мигать только первый светодиод. Сохранил SREG в стеке:
in Temp5,SREG
push Temp5
...
...
pop Temp5
out SREG,Temp5
Компилятор ругнулся на отсуствие стека как такового... В этом МК нет ОЗУ, но как написано в даташите есть аппаратный трехуровневый стек, который использует сам контроллер - "Для обработки прерываний и подпрограмм..." Так что это тоже не прокатило... Из изменений. Увеличил время цикла антидребезга до 16мс, а остальное все осталось как прежде... На этом думаю тему можно закрыть - так как основная цель достигнута, все работает без проблем и сбоев... Спасибо!
то нарушается работа программы. Можно поставить туда ldi Temp,0x01, но в этом случае вызов прерывания ничего не изменит - будет мигать только первый светодиод. Сохранил SREG в стеке:
in Temp5,SREG
push Temp5
...
...
pop Temp5
out SREG,Temp5
Компилятор ругнулся на отсуствие стека как такового... В этом МК нет ОЗУ, но как написано в даташите есть аппаратный трехуровневый стек, который использует сам контроллер - "Для обработки прерываний и подпрограмм..." Так что это тоже не прокатило... Из изменений. Увеличил время цикла антидребезга до 16мс, а остальное все осталось как прежде... На этом думаю тему можно закрыть - так как основная цель достигнута, все работает без проблем и сбоев... Спасибо!
- Реклама
мда, не учел я в своих советах материально-техническую базу
но сохранять можно и в свободном регистре. а на счет команды mov Temp, Pin - чего-то не пойму:
первая команда абсолютно бесполезна, т.к. следующая затирает значение Temp нулем. К чему пересылка???
Код: Выделить всё
mov Temp, Pin
ldi Temp, 0если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 7
- Зарегистрирован: Чт янв 03, 2008 23:04:59
Ни в одном из приведенных мной исходников такого нет... Если вы имеете ввиду мое последнее собщение, то я имел ввиду замену, а не добавление еще одной команды... 
Вот кусок из последнего размещенного тут твоего исходника:DimAnoiD писал(а):Ни в одном из приведенных мной исходников такого нет... Если вы имеете ввиду мое последнее собщение, то я имел ввиду замену, а не добавление еще одной команды...
Код: Выделить всё
loop: mov Temp,Pin ;цикл мигания светодиодом
ldi Temp,0x00
rcall Delay
ldi Temp,0x00
rcall Delay
rjmp loop
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 7
- Зарегистрирован: Чт янв 03, 2008 23:04:59
Ааа! Ну теперь понятно..
При копированиии из окна AVRStudio в Блокнот, из-за большого количества табуляций, вид исходника бывает нереальный для восприятия. И когда я удалял эти больший пробелы в строках, допустил вот такую ошибку, вы можете заметить в строке с меткой loop: после комментария идет команда вызова подпрограммы задержки rcall Delay...
На всякий случай выкладываю нормально отредактированный код.
- Вложения
-
- Source3.asm
- (2.08 КБ) 572 скачивания
Ааа! Ну теперь понятно..DimAnoiD писал(а):Ааа! Ну теперь понятно..![]()
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 22
- Зарегистрирован: Сб дек 16, 2006 22:20:04
Попробовал вот эту среду : http://www.matrixmultimedia.com/Flowcode3a-X.php ... Здорово - просто и сердито для простых программ !!! Кто знает , как оформить тут прерывание от Int0 ?


nicname
Позырить в примерах. Наверняка есть и в хелпе еще. Механизм работы прерывания раскрыт на стр 3 под кнопкой ВВВ ниже.
Последний раз редактировалось tych Ср апр 16, 2008 19:09:23, всего редактировалось 1 раз.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- Сообщения: 22
- Зарегистрирован: Сб дек 16, 2006 22:20:04
Вот их видеокурсы - http://www.matrixmultimedia.com/Learnin ... /index.php
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- Сообщения: 22
- Зарегистрирован: Сб дек 16, 2006 22:20:04
Почитайте как устроены прерывания на стр 3 под кнопкойnicname писал(а):Да они есть у меня , только , там чего-то надо для просмотра картинок ещё устанавливать , да и сама программа крякнутая ... Так и непонятно , чего делать-то ?
ниже и в диалоге на вашем скриншоте сделайте настройки.
Последний раз редактировалось tych Ср апр 16, 2008 22:10:08, всего редактировалось 1 раз.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- Сообщения: 22
- Зарегистрирован: Сб дек 16, 2006 22:20:04
А Вы в Фаре работайте, будут белые на синем. 
Оптимизм х (Опыт + Знания) = const





