Вы не вошли.
... это всего лишь запрос. В AVR эти флаги сбрасываются автоматически при осуществлении перехода на обработчик прерывания.
То есть, для каждогоиз прерываний есть СВОЙ СОБСТВЕННЫЙ вектор?
В AVR ..... существуют биты разрешения отдельных прерываний и еще бит глобального разрешения прерываний. Обработка прерывания может произойти только в том случае, если оба они установлены.
Ну сорри! Не написал, что в ПИК-е есть GIE (Global), PIE (Peripherial) (эт "колхозные" (в смысле общие)) и биты хххE(nable) для каждого из прерываний в отдельности.
Кроме того, функция приоритетов тоже может быть включена/выключена по желанию писателя.
Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....
Вне форума
2 Liv
Леонид Иванович, вы мое письмо получили??
......There is someone in my head, but it's not me.......
Вне форума
То есть, для каждого из прерываний есть СВОЙ СОБСТВЕННЫЙ вектор?
Да. Так и в AVR, и в MCS-51.
мое письмо получили?
Плучил исходник программы. А что с ним надо сделать?
Вне форума
В AVR при получении прерывания снимается маска данного прерывания (дабы второй раз не пойти на это-же прерывание) и флаг глобального разрешения прерываний (это делается для того чтобы не переполнить стек там где его нет), но если у вас есть стек и вы уверены что до переполнения вам "не дожить" вы можете установить флаг глобального разрешения прерываний записью бита ( не используйте sei если передней небыло cli, обращайтесь именно к биту, и будет вам полноценный контроллер прерываний и счастье ИМХО.
Смешно!!!, с всемирной тупостью бороться!!!
Вне форума
Плучил исходник программы. А что с ним надо сделать?
Если Вам не трудно, его надо проверить. Особенно на предмет правильности описания прерывания по переполнению ТС0. Просто я написал, вроде все правильно (на мой взгляд), а оно не работает. Ваша программа со светодиодом (там же все аналогично) работает. Что-то там не то...
......There is someone in my head, but it's not me.......
Вне форума
В AVR при получении прерывания снимается маска данного прерывания (дабы второй раз не пойти на это-же прерывание)
Это неправильно. Когда происходит обработка прерывания, сбрасывается всего лишь флаг данного прерывания и бит I. А бит разрешения данного прерывания (его еще называют маской прерывания) остается установленным. По этой причине можно поиметь проблемы в виде многократных вызовов обработчика одного и того же прерывания при разрешении вложенных прерываний (например, в случае внешнего прерывания по уровню). Такие ситуации нужно разруливать вручную.
не используйте sei если передней небыло cli
Какие глупости. Команды SEI и CLI только то и делают, что устанавливают или сбрасывают бит I соответственно. Это ничем не отличается от установки или сброса бита I другими способами. Так и команда RETI представляет собой RET + SEI и больше не делает ничего особенного. Её можно использовать в любом месте программы для замены этих двух команд (но не нужно, так как это дурной стиль).
Вне форума
всё выше сказанное вполне возможно и в то же время если всё предусмотреть (а я не могу сказать слежу ли я за этим тщательно или нет, просто такой стиль) то всё работает нормально, и даже создаётся впечатление нормального арбитража прерываний
RE> Так и команда RETI представляет собой RET + SEI и...
не просто дурной стиль а попытка переполнения стека прерываний!!!
Я понимаеш институтов не кончал и может чего не знаю но на собственной шкуре всё проверил
Смешно!!!, с всемирной тупостью бороться!!!
Вне форума
RE> Так и команда RETI представляет собой RET + SEI и...
не просто дурной стиль а попытка переполнения стека прерываний!!!
Что такое "стек прерываний"? Стек - он один, что для обработчиков прерываний, что для вызова подпрограмм. Там хранятся адреса возврата. Если Вы вызвали подпрограмму, то можете её завершить как командой RET, так и командой RETI. Во втором случае дополнительно будут разрешены прерывания, если они были до этого запрещены. Но если следовать хорошему стилю, то команду RETI нужно применять только для выхода из обработчиков прерывания.
Вне форума
2 Liv
Вы мне писали про то, как подавить дребезг кнопки:
1. Опрашивается состояние кнопки.
2. Если состояние не изменилось, то переход на 1.
3. Если состояние изменилось, запоминаем его.
4. Формируем задержку ~20 мс.
5. Опять опрашиваем кнопку.
6. Если состояние изменилось, запоминаем его и
возвращаемся на 1.
7. Если состояние не изменилось и состояние
соответствует нажатому, делаем действие (on/off) и
возвращаемся на 1.
В 6-м пункте "состояние изменилось" относительно чего? Того, что запомнили в пункте 3 ? Т.е. тут ситуация: опрашиваем, если изменилось сотояние, ждем 20 мс и смотрим, не изменилось ли оно снова. Если нет (юзер кнопку держит нажатой, и контакты замкнулись) то все ок, работаем дальше. Если да, то делаем вывод, что она дребезжит, и все повторяем до тех пор, пока она не не закончит дребезжать. Так?
А нельзя проще? Просто дать задержку 20 мс, и выполнять дальнейшее действие. Не будет же она вечно дребезжать. У Вас в статье про РА-9000 (кажется) был график процессов, происходящих при срабатывание реле. Там дребезг контактов длился намного меньше, чем 20мс. Я думаю, для кнопок похожая ситуация...
......There is someone in my head, but it's not me.......
Вне форума
Всё верно. Окончанием дребезга можно считать неизменное состояние кнопки в течение 20 мс. Для разных типов кнопок время дребезга разное, экспериментально установлено, что 20 мс хватает всем. Можно установить меньше, 10 мс обычно тоже хватает.
Просто дать задержку нельзя, так как считанное состояние может быть вызвано дребезгом и отличаться от установившегося. Нужно убедиться, что состояние кнопки не меняется некоторое время, и только после этого можно производить действие.
Вне форума
[ Сгенерировано за 0.058 сек, 8 запросов выполнено - Использовано памяти: 621.7 Кбайт (Пик: 672.07 Кбайт) ]