Страница 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 - чего-то не пойму:

Код: Выделить всё

   mov  Temp, Pin
   ldi Temp, 0
первая команда абсолютно бесполезна, т.к. следующая затирает значение 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
А Вы в Фаре работайте, будут белые на синем. :wink: