Страница 1 из 2
Проблема с прерыванием INT0.
Добавлено: Пт янв 25, 2008 00:56:43
DimAnoiD
Здравствуйте! Во-первых хочу поблагодарить и сказать Спасибо за хороший сайт, за понятную и простую обучалку и за все остальное!

Почитал курс и осмелился приобрести контроллер и поработать вживую как говорится. ) Собрал я значит на макетке все самое необходимое для мигания четырьмя светодиодами (больше не нашел

). Все работает. И одним помигал, и всеми и туда-сюда помигал. Теперь решил с кнопкой на внешнее прерывание поработать. Контроллер у меня... извините за выражение - AT90S1200.

(Скоро приобрету тини2313) Алгоритм таков: мигает первый светодиод, после нажатия кнопки он отключается и начинает мигать следующий, еще нажал - второй отключился, третий замигал и так далее по кольцу. Написал, прошил работает. Но, когда отпускашь кнопку ИНОГДА происходит "перескакивание" мигания с одного на другой или даже два сразу пропускаются. Думаю проблема в дребезге контактов при их размыкании, но как мне это программно решить - не знаю, поэтому и прошу помощи. Ниже прикрепляю исходник. Заранее благодарю!
Добавлено: Чт янв 31, 2008 01:10:56
DimAnoiD
После сбоя в работе форума все сообщения темы удалились, но ничего... Главное наконец-то проблема решена! :

Конечно же с вашей помощью и помощи многоуважаемого
ARV. ) Сначала добавил конденсатор 0,1мкф параллельно кнопке - работа улучшилась, но несмотря на нажатия, не происходило переключеня с третьего светодиода на четвертый. В подпрограмму обработчика, добавил MOV Temp,Pin , несмотря на то что эта команда существует в основном цикле программы - заработало... Смутным мне остается причина возникновения этого сбоя, физически не могу представить... Ниже немного измененный, рабочий на данный момент исходник. Всем Спасибо!

Добавлено: Чт янв 31, 2008 08:59:32
ARV
И тем не менее в своем коде ты не устранил указанный мной недочет: не сохраняешь SREG в обработчике прерывания. Это плохо, даже если сейчас работает. Посеешь наплевательское отношение к SREG - пожнешь кучу проблем в настоящих программах.
Еще недочеты: конденсатор на входе INT не нужен. Флаг запроса прерывания на выходе из обработчика не сбрасываешь - это плохо. Команда, стоящая прямо на метке loop - бесполезная, ее смело можно выкинуть. Какая тактовая частота? Для гарантии защиты от дребезга нужна задерка не менее 10 мс. Если тактовая частота высокая - задержки в 256 повторов цикла (в обработчике) может не хватить для получения 10 мс.
Причина этих сбоев (уверен - в текущем варианте программы не устраненная полностью) кроется в том, что пока ты делаешь задержку в своем прерывании, из-за дребезга может снова установиться флаг запроса, который ты не сбрасываешь. Т.е. после завершения прерывания мгновенно возникнет новое (но еще от старого нажатия кнопки) - и твой огонь перескочит через одну позицию.
Добавлено: Чт янв 31, 2008 18:55:05
DimAnoiD
Тактовая частота 4МГц. Флага внешнего прерывания INT0 в микроконтроллере AT90S1200 нет. Я вообще-то сделал как вы сказали насчет сохранения регистра SREG, но после того как заработало, убрал эти команды, верну обязательно. Задержка в обработчике 6,4мс, сделаю больше десяти... Вобщем, доработаю с вашими рекомендациями и как закончу выложу сюда...
Добавлено: Чт янв 31, 2008 22:15:13
DimAnoiD
Если убрать команду возле метки
loop: mov Temp,Pin
то нарушается работа программы. Можно поставить туда
ldi Temp,0x01, но в этом случае вызов прерывания ничего не изменит - будет мигать только первый светодиод. Сохранил SREG в стеке:
in Temp5,SREG
push Temp5
...
...
pop Temp5
out SREG,Temp5
Компилятор ругнулся на отсуствие стека как такового... В этом МК нет ОЗУ, но как написано в даташите есть аппаратный трехуровневый стек, который использует сам контроллер - "Для обработки прерываний и подпрограмм..." Так что это тоже не прокатило... Из изменений. Увеличил время цикла антидребезга до 16мс, а остальное все осталось как прежде... На этом думаю тему можно закрыть - так как основная цель достигнута, все работает без проблем и сбоев... Спасибо!

Добавлено: Чт янв 31, 2008 22:39:52
ARV
мда, не учел я в своих советах материально-техническую базу

но сохранять можно и в свободном регистре. а на счет команды
mov Temp, Pin - чего-то не пойму:
первая команда абсолютно бесполезна, т.к. следующая затирает значение Temp нулем. К чему пересылка???
Добавлено: Чт янв 31, 2008 23:00:57
DimAnoiD
Ни в одном из приведенных мной исходников такого нет... Если вы имеете ввиду мое последнее собщение, то я имел ввиду
замену, а не добавление еще одной команды...

Добавлено: Пт фев 01, 2008 06:35:00
ARV
DimAnoiD писал(а):Ни в одном из приведенных мной исходников такого нет... Если вы имеете ввиду мое последнее собщение, то я имел ввиду
замену, а не добавление еще одной команды...

Вот кусок из последнего размещенного тут твоего исходника:
Код: Выделить всё
loop: mov Temp,Pin ;цикл мигания светодиодом
ldi Temp,0x00
rcall Delay
ldi Temp,0x00
rcall Delay
rjmp loop
по-твоему, первая и вторая строчки - это не то, о чем я говорю?
Добавлено: Пт фев 01, 2008 12:05:58
DimAnoiD
Ааа! Ну теперь понятно..

При копированиии из окна AVRStudio в Блокнот, из-за большого количества табуляций, вид исходника бывает нереальный для восприятия. И когда я удалял эти больший пробелы в строках, допустил вот такую ошибку, вы можете заметить в строке с меткой
loop: после комментария идет команда вызова подпрограммы задержки
rcall Delay...

На всякий случай выкладываю нормально отредактированный код.
Добавлено: Пт фев 01, 2008 12:19:32
ARV
DimAnoiD писал(а):Ааа! Ну теперь понятно..
Ааа! Ну теперь понятно..

Добавлено: Ср апр 16, 2008 18:37:20
nicname
Попробовал вот эту среду :
http://www.matrixmultimedia.com/Flowcode3a-X.php ... Здорово - просто и сердито для простых программ !!! Кто знает , как оформить тут прерывание от Int0 ?

Добавлено: Ср апр 16, 2008 18:46:54
tych
Позырить в примерах. Наверняка есть и в хелпе еще. Механизм работы прерывания раскрыт на стр 3 под кнопкой ВВВ ниже.
Добавлено: Ср апр 16, 2008 19:09:15
nicname
Ну , в хелпе только для таймера ...
А тут чего писать ?

Добавлено: Ср апр 16, 2008 19:12:30
tych
Добавлено: Ср апр 16, 2008 19:19:09
nicname
Да они есть у меня , только , там чего-то надо для просмотра картинок ещё устанавливать , да и сама программа крякнутая ... Так и непонятно , чего делать-то ?
Добавлено: Ср апр 16, 2008 19:38:24
tych
nicname писал(а):Да они есть у меня , только , там чего-то надо для просмотра картинок ещё устанавливать , да и сама программа крякнутая ... Так и непонятно , чего делать-то ?
Почитайте как устроены прерывания на стр 3 под кнопкой

ниже и в диалоге на вашем скриншоте сделайте настройки.
Добавлено: Ср апр 16, 2008 20:55:21
nicname
Нет у меня ни страниц , ни Go! -
P.S. Ларчик просто открывался ....

Добавлено: Пн апр 21, 2008 11:13:38
MetEl
Блин, здоровская програмулина!
На днях поюзаю!
Пасиба.
Добавлено: Пн апр 21, 2008 12:13:26
Дон Амброзио
Какие красивые картинки.. Почему у меня таких нет
Что это за программы такие? Может сказать гже качнуть? Тоже хачу такую красотищу. А то в нотепаде только черные буквы на белом фоне... Никакой красоты

Добавлено: Пн апр 21, 2008 14:02:01
Aheir
А Вы в Фаре работайте, будут белые на синем.
