Хочу щажечь свтоедиод, типо когда идёт нуль,( ну кнопку нажимаю), то вызывается прерывания , где должен гореть светик, и конечно когда я отпускаю кнопку, прога выходит из прерывания и светик не горит. но когда всё проверил в протеусе, почему то программа в прерывания заходит, но не выходит. почему так #include <avr/io.h> #include <avr/interrupt.h> ISR (INT0_vect) { PORTA |=(1«0); }
int main(void) { DDRA =0xFF; PORTA = 0x00; DDRD = 0x08; PORTD = 0xFF;
/* Replace with your application code */ while (1) { MCUCR &=~(1«0); // делаю так чтобы прерывания работало по низкому уровню. типо когда на инте0 будет 0, только тогда перейдё на прерывания GICR |=(1«6); //включаю инт0 . asm("sei");
он из прерывания выходит но ты об этом не знаешь — кто тебе светодиод выключит? (где соответствующая команда?) ещё: настройку прерываний достаточно делать 1 раз (не в цикле)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
он из прерывания выходит но ты об этом не знаешь — кто тебе светодиод выключит? (где соответствующая команда?) ещё: настройку прерываний достаточно делать 1 раз (не в цикле)
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
почти все проблемы кроются в алгоритме. вот у вас: нажали кнопку - возникло прерывание - зажгли светодиод - вышли из прерывания. что происходит, когда кнопку не нажали? в главном цикле все время светодиод гасится - так? т.е. если кнопку нажали, то сначала в прерывании его включили, а когда вышли из обработчика - тут же выключили... зачем вообще прерывания?
как у вас настроен режим прерываний? по вашему коду не понятно, лезть в даташит лениво... если у вас, например, срабатывание по низкому уровню, то работа будет такой: все время, пока кнопка нажата, будет возникать прерывание, т.е. вошли, зажгли, вышли и тут же снова вошли. может получиться так, что момент, когда в главном цикл что-то гасится, вообще будет очень коротким, что и не заметишь.
самое простое и, для начала, самое правильное - не применять прерывания.
Код:
while(1){ if(PIND & _BV(PD3)){ // проверяем кнопку на PD3 - разберитесь, где у вас она на самом деле // кнопка не нажата - гасим } else { // кнопка нажата - зажигаем } }
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
я то думал основная цель не светодиодом мигать а прерывание на зуб попробовать - как оно работает, а светик просто индикатор...
Добавлено after 3 minutes 46 seconds: если от кнопки светик зажигать то и контроллер не нужен...
Добавлено after 8 minutes 47 seconds: я бы и рад копнуть глубже, но урок по телепатическому определению микроконтроллера в своё время прогулял...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
прерывание на зуб попробовать - как оно работает, а светик просто индикатор...
всему своё время. объяснить, почему прерывание для мигания светиком будет со всякими "странными" участками кода будет на данном уровне освоения МК слишком сложно, как мне кажется. но если охота, то в прерывании ставить volatile-флаг, а в главном цикле его анализировать вышеприведенным методом, как я пример показал, только не забывать всякий раз этот флаг сбрасывать.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
я то думал основная цель не светодиодом мигать а прерывание на зуб попробовать - как оно работает, а светик просто индикатор...
Добавлено after 3 minutes 46 seconds: если от кнопки светик зажигать то и контроллер не нужен...
Добавлено after 8 minutes 47 seconds: я бы и рад копнуть глубже, но урок по телепатическому определению микроконтроллера в своё время прогулял...
вот именно я хочу понять, после того как я отжал кнопку он же должен выйти из прерывания и выполнять программу, в которой я гашу светоидиод, но он не выполняет, я не знаю почему.
после того как я отжал кнопку он же должен выйти из прерывания
из прерывания он выходит сразу после того, как выполнит обработчик, в вашем коде нет ничего, что заставило бы "его" ждать отжатия кнопки. а далее - см. мои сообщения выше - в зависимости от настройки процесс либо будет непрерывно повторяться, либо нет.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сама идея - пока нажата кнопка, МК вертится в прерывании по уровню , как собака за собственным хвостом - ущербна. Никакой полезной работы при этом не выполняется. Опрос кнопок проводят обычные люди по таймеру, попутно решая вопрос с дребезгом. Если уж - кровь из носу - реакция нужна молниеносная, наносекунды - организовываем прерывание по перепаду, но тогда уж отслеживать отпускание кнопки нужно в ветке, на которую попадаем из прерывания . Вопрос о том, как из прерывания попасть сразу ( мгновенная реакция ведь нужна! ) на нужную ветку, многократно обсуждался в форуме, но это вопрос не новичкового уровня. Я так думаю. Кстати, интересный вопрос: если попав в прерывание по falling edge мы внутри его меняем условие на rising edge - вроде можем поймать и отпускание кнопки, но я думаю, это трюкачество не достойно серьезного проекта.
_________________
Последний раз редактировалось Jack_A Пн июл 17, 2017 19:54:18, всего редактировалось 1 раз.
Вопрос о том, как из прерывания попасть сразу ( мгновенная реакция ведь нужна! ) на нужную ветку, многократно обсуждался в форуме, но это вопрос не новичкового уровня. Я так думаю.
Эта проблема решается просто. Допустимое время реакции системы?
Я знаю, как оно решается. Допустим, < 1 mks. Можем подменить адрес возврата. Но могут быть неочевидные проблемы. Я говорю о том, что это не уровень, заданный ТС в его вопросе.
по идее пока нажата кнопка светик будет быстро-быстро мигать - т.к. завершив прерывание, мк выйдет обратно в основной цикл и, если мне не изменяет выполнит там хотя бы одну команду (в этом на 100% не уверен) прежде чем опять уйдёт в прерывание, (по крайней мере разбирал один проект с прерыванием по низкому уровню и, как утверждает автор удержание 0 на прерывающей ноге не блокировало остальную программу полностью). при отпущенной кнопке МК будет тушить и тушить светодиод. но это по идее, а почему происходит не так, можно попытаться узнать разглядывая регистры, например проверить что GICR |=(1«6); //действительно включаю инт0 . , но ТС партизан не колется, какой мк пытает, а для разных мк такая запись может означать разное.
Добавлено after 2 minutes 45 seconds: пытался на днях в обработчике захвата сменить условие захвата - с первого раза не взлетело, а второго раза и не понадобилось, нашел способ удобнее.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Я знаю, как оно решается. Допустим, < 1 mks. Можем подменить адрес возврата. Но могут быть неочевидные проблемы. Я говорю о том, что это не уровень, заданный ТС в его вопросе.
Подмена вектора - это уже работа на ассемблере. Но даже в этом случае подмена вектора - выстрелить себе в ногу. Не нужны такие извраты. Если реакция должна быть мгновенной, работаем в прерывании. Если нет, ставим признак обработки прерывания. Если же у вас долгие циклы в программе - это уже ваши проблемы. Учитесь дробить процессы.
Вы никогда не знаете, в какой момент времени сработало прерывание. Кроме одного единственного случая, в глухом цикле. Именно поэтому, подмена возврата - изврат.
Я не собираюсь схоластически спорить на пустом месте вне конкретной задачи - тем более в теме топикстартера, которому эти проблемы пока - за далеким горизонтом.
Хелп ми плиз. Когда я включаю в протеусе, то у меня светодиод не горит, пото нажима. кнопочку, у уменя он загаерается и продолжает почему то гореть не выключаясь, почему он не выходит из прерывания то? я вообще уже какой день мучаюсь понять не могу, вроде всё правильно выставил /* * GccApplication5.c * * Created: 09.08.2017 10:10:45 * Author : HP */ #define F_CPU 8000000L #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h>
ISR (INT0_vect) { PORTC |=(1<<1); } int main(void) { DDRD = 0x00; PORTD = 0xFF; DDRC = 0xFF; PORTC &=~(1<<1); GICR |=(1<<6); MCUCR &=~(1<<ISC01)|(1<<ISC00); sei(); /* Replace with your application code */ while (1) { asm("nop"); } }
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 50
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения