Проблема с прерыванием INT0.
Проблема с прерыванием INT0.
Здравствуйте! Во-первых хочу поблагодарить и сказать Спасибо за хороший сайт, за понятную и простую обучалку и за все остальное!
Почитал курс и осмелился приобрести контроллер и поработать вживую как говорится. ) Собрал я значит на макетке все самое необходимое для мигания четырьмя светодиодами (больше не нашел
). Все работает. И одним помигал, и всеми и туда-сюда помигал. Теперь решил с кнопкой на внешнее прерывание поработать. Контроллер у меня... извините за выражение - AT90S1200.
(Скоро приобрету тини2313) Алгоритм таков: мигает первый светодиод, после нажатия кнопки он отключается и начинает мигать следующий, еще нажал - второй отключился, третий замигал и так далее по кольцу. Написал, прошил работает. Но, когда отпускашь кнопку ИНОГДА происходит "перескакивание" мигания с одного на другой или даже два сразу пропускаются. Думаю проблема в дребезге контактов при их размыкании, но как мне это программно решить - не знаю, поэтому и прошу помощи. Ниже прикрепляю исходник. Заранее благодарю!
- Вложения
-
- source.asm
- Исходник программы.
- (1.55 КБ) 601 скачивание
После сбоя в работе форума все сообщения темы удалились, но ничего... Главное наконец-то проблема решена! :
Конечно же с вашей помощью и помощи многоуважаемого ARV. ) Сначала добавил конденсатор 0,1мкф параллельно кнопке - работа улучшилась, но несмотря на нажатия, не происходило переключеня с третьего светодиода на четвертый. В подпрограмму обработчика, добавил MOV Temp,Pin , несмотря на то что эта команда существует в основном цикле программы - заработало... Смутным мне остается причина возникновения этого сбоя, физически не могу представить... Ниже немного измененный, рабочий на данный момент исходник. Всем Спасибо! 
- Вложения
-
- SourceL.asm
- (1.78 КБ) 334 скачивания
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
И тем не менее в своем коде ты не устранил указанный мной недочет: не сохраняешь SREG в обработчике прерывания. Это плохо, даже если сейчас работает. Посеешь наплевательское отношение к SREG - пожнешь кучу проблем в настоящих программах.
Еще недочеты: конденсатор на входе INT не нужен. Флаг запроса прерывания на выходе из обработчика не сбрасываешь - это плохо. Команда, стоящая прямо на метке loop - бесполезная, ее смело можно выкинуть. Какая тактовая частота? Для гарантии защиты от дребезга нужна задерка не менее 10 мс. Если тактовая частота высокая - задержки в 256 повторов цикла (в обработчике) может не хватить для получения 10 мс.
Причина этих сбоев (уверен - в текущем варианте программы не устраненная полностью) кроется в том, что пока ты делаешь задержку в своем прерывании, из-за дребезга может снова установиться флаг запроса, который ты не сбрасываешь. Т.е. после завершения прерывания мгновенно возникнет новое (но еще от старого нажатия кнопки) - и твой огонь перескочит через одну позицию.
Еще недочеты: конденсатор на входе INT не нужен. Флаг запроса прерывания на выходе из обработчика не сбрасываешь - это плохо. Команда, стоящая прямо на метке loop - бесполезная, ее смело можно выкинуть. Какая тактовая частота? Для гарантии защиты от дребезга нужна задерка не менее 10 мс. Если тактовая частота высокая - задержки в 256 повторов цикла (в обработчике) может не хватить для получения 10 мс.
Причина этих сбоев (уверен - в текущем варианте программы не устраненная полностью) кроется в том, что пока ты делаешь задержку в своем прерывании, из-за дребезга может снова установиться флаг запроса, который ты не сбрасываешь. Т.е. после завершения прерывания мгновенно возникнет новое (но еще от старого нажатия кнопки) - и твой огонь перескочит через одну позицию.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Тактовая частота 4МГц. Флага внешнего прерывания INT0 в микроконтроллере AT90S1200 нет. Я вообще-то сделал как вы сказали насчет сохранения регистра SREG, но после того как заработало, убрал эти команды, верну обязательно. Задержка в обработчике 6,4мс, сделаю больше десяти... Вобщем, доработаю с вашими рекомендациями и как закончу выложу сюда...
Если убрать команду возле метки 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мс, а остальное все осталось как прежде... На этом думаю тему можно закрыть - так как основная цель достигнута, все работает без проблем и сбоев... Спасибо!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
мда, не учел я в своих советах материально-техническую базу
но сохранять можно и в свободном регистре. а на счет команды mov Temp, Pin - чего-то не пойму:
первая команда абсолютно бесполезна, т.к. следующая затирает значение Temp нулем. К чему пересылка???
Код: Выделить всё
mov Temp, Pin
ldi Temp, 0если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
DimAnoiD писал(а):Ни в одном из приведенных мной исходников такого нет... Если вы имеете ввиду мое последнее собщение, то я имел ввиду замену, а не добавление еще одной команды...
Вот кусок из последнего размещенного тут твоего исходника:
Код: Выделить всё
loop: mov Temp,Pin ;цикл мигания светодиодом
ldi Temp,0x00
rcall Delay
ldi Temp,0x00
rcall Delay
rjmp loop
по-твоему, первая и вторая строчки - это не то, о чем я говорю?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ааа! Ну теперь понятно..
При копированиии из окна AVRStudio в Блокнот, из-за большого количества табуляций, вид исходника бывает нереальный для восприятия. И когда я удалял эти больший пробелы в строках, допустил вот такую ошибку, вы можете заметить в строке с меткой loop: после комментария идет команда вызова подпрограммы задержки rcall Delay...
На всякий случай выкладываю нормально отредактированный код.
- Вложения
-
- Source3.asm
- (2.08 КБ) 570 скачиваний
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Ааа! Ну теперь понятно..DimAnoiD писал(а):Ааа! Ну теперь понятно..![]()
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Попробовал вот эту среду : http://www.matrixmultimedia.com/Flowcode3a-X.php ... Здорово - просто и сердито для простых программ !!! Кто знает , как оформить тут прерывание от Int0 ?


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