Timer-counter interruptions ATmega8 | Microcontrollers from scratch #15
HTML-код
- Опубликовано: 28 сен 2024
- Interrupts from the timer-counter of the microcontroller can be caused both at overflow of the counter, and at coincidence with the value written down in the register register TCNTx. The use of timer-count interrupts allows you to avoid the use of delays connected by the library delay.h, and thus unload the microcontroller. Settings and connection are made by setting the corresponding bits in the TIMSK register.
Программирование микроконтроллеров. Полный курс для начинающих: diodov.net/programmirovanie-mikrokontrollerov-avr/
Электроника для начинающих. Мощный курс. diodov.net/elektronika-dlya-nachinayushhih/
В обработке прерываний никогда не должно быть сложных математических вычислений и уж тем более таких огромных задержек. При обработке прерываний вы должны забежать в него, быстро выполнить какую либо простую операцию и выйти. И уже в основной программе вы будете оперировать числом, полученным в прерывании. В противном случае, вы получите такое же подвисание основной программы, как видно на видео: светодиоды перестали "бежать" и ждали пока один светодиод проморгается, то есть завершится обработка прерывания.
Прерывание оно на то и прерывание, что всего лишь прерывает выполнение программы, а не берёт все функции вычислений на себя.
А что если прерывание искусственно продлить ( зажать кнопку которая управляет прерыванием) программа зависнет?
"Никогда не должно" - слишком категорично. Да, прерывание останавливает основную программу, но что если так и надо? Что если основная программа не имеет смысла, пока прерывание не обработано?
И если вы возразите, что "так никогда не делают" - делают. Некоторые системы реального времени представляют собой просто кучу прерываний с разными приоритетами. Основной программы может тогда вообще не быть - весь код в прерываниях.
надеюсь выйдет сразу несколько уроков по АВР. Долго ждем. Ну дай Бог тебе свободного времени
Благодарю за очередной урок, здесь все получилось , но почему то в предыдущем уроке микроконтроллер начал ловить помехи и работал через раз! 🎉
немного неправильно все обьясняют про одновременные прерывания , так не бывает в принципе процессор в принципе не может что либо делать одновременно. приоритеты обозначают что если поступило прерывание более высокого приоритета а предыдущее еще не закончило цикл в обработчике то его от туда выкинет, это важно понимать поскольку возможно что прерывание второстепенное несмотря на то что придет первое все равно обработается вторым
Вот это объясняет человек! Спасибо.
Вообще-то sei - это ассемблерная инструкция установки флага I.
Теперь гирлянды на новый год будут точно у всех самодельные)...
Ты с дуба упал ? Задержки ставить в прерываниях ?
А что такого? Да, основная программа (и другие прерывания) не будет выполняться, но что если нам так и нужно?
Это же для общего понимания. Для наглядности работы алгоритма программы.
@@ValeraDXM тогда согласен
народ приветствую вопрос такой если мне нужен прерывния было через 40 секунды как тут быть????
почему то мой протеус не дружит с прерываниями
У него бывает. Мой дружит.
Наверно это урок, типа, как не надо делать.
Это урок - с чего начать хоть как то понимать суть происходящего
С каждым уроком комментариев всё меньше... Многие уже соскочили к этому уроку, всё таки очень сложно...
Да вроде всё не так сложно. Хотя всё зависит от того, человек знает хотя бы немного хоть один язык программирования или нет.
@@splinterkab9007 вы занимаетесь программированием? Работа или просто хобби?
@@олегспирин-р4р я немного занимался ранее для себя. Правда не на C++. Но синтаксис похож. Ну хотя что может быть иначе, if он и в Африке if. Сейчас хотел бы освоить программирование МК для себя. Есть конечно графические программы которые позволяют быстро слепить нужное из блоков. Так конечно проще но код сильно раздувает. Хотя не сравнивал. Думаю лучше перейти на си. Пока тренируюсь. А большинству это ненужно. Вот и комментарии убывают. Да и наверное сложно тем кто никогда не изучал даже basic, Pascal etc.
@@splinterkab9007 просто для себя не могу понять , понадобится мне это в будущем или нет. Где это можно применить? Работаю с электроникой. Освоил недавно ремонт ноутбуков,Но скучновато это стало. Хочется нового , хочется мыслить .
@@олегспирин-р4р ну например я себе сделал плавный розжиг ближнего в авто. Полезно чтоб лампы не перегорали. Еще и таймер туда добавил для отключения после выключения зажигания, просто пару раз забывал выключить. Если нормально изучить тему можно сделать все что угодно. Главное чтоб хватило фантазии и ресурсов МК. Сейчас конечно много чего есть в продаже. Но вдруг понадобится чего с особыми функциями. В сети конечно тоже много чего есть готового. Но мне больше интересно сделать своими руками с нуля. Моё мнение. Это полезно для общего развития. Да и мало ли в будущем работа, заказы, но нужно изучать хорошо. Да и иметь возможность сделать чего под себя не лишняя будет.
Для меня например это вроде просто. Правда практики давно не было. Сижу вспоминаю да с регистрами МК разбираюсь. Он бы разбирал еще более подробно как с регистрами работать. А то умалчивает много. А язык буржуйский я плохо знаю.
В общем советую не бросать и освоить хоть немного, а лучше много.
Здравствуйте когда продолжение? Очень интересно.жду следующее видео.
В прерывания по таймеру можно использовать инкримент и через оператор if можно настраиват задержку.А так абра кадабра.TCNT1=0; до выполнения программы в обработчике прерывания.
Не легче зажигать все светодиоды через умножение на 2 и прибавление 1 через цикл for или while?
как совместить в одной программе прерывания внешние и по таймеру? у меня вместе они не хотят выполнятся.
А распечатку или скетч урока можно под видео выкладывать))?
а можно вообще наверно написать TCCR1B=3 !?
Конечно можно. 3 или 0x03 или 0b11. Можно и так
TCCR1B=(0
@@splinterkab9007 Вы много комментируете и всегда по делу, и не только на этом канале. Подскажите, пожалуйста, почему при прерываниях по переполнению таймера продолжение выполнения кода после этого прерывания происходит с того же места, как и должно быть. А в предыдущем уроке №14 при внешних прерываниях выполнение кода после прерывания начинается заново. Автор канала к огромному сожалению не отвечает на этот неоднократно заданный вопрос. Замена SREG на sei ничего не меняет, что бы там ни писали другие комментаторы.
К автору канала тоже огромная просьба откликнуться и пролить свет на данную непонятку.
Всем за ранее спасибо.
@@digital4ik621 в комментариях к предыдущему видео есть ответ, вот цитата (может он что-то скажет):
В этом примере смысл в том, что когда нажимаешь обычную кнопку
светодиод начинает моргать тогда,когда до него дойдет алгоритм по коду
сверху вниз при условии что будет нажата кнопка.А при нажатии на кнопку
прерывания чтения кода прерывается и сразу переходит на алгоритм
мигания одного светодиода,после его выполнения начинается чтение кода
заново то есть сверху вниз.Что бы работало так как автор показывал в
начале нужно код мигания одного светодиода поместить в функцию и
нажатием кнопки прерывания вызывать эту функцию ,тогда после
отрабатывания функции код продолжит работу до конца.
Возможно ли все это выполнять на телефоне
опять же как я понимаю, к примеру:
TCCR1B=0b00000011
TCCR1B|=(1
Да
Нет, это не одно и тоже, первая команда - обращение ко всему порту, а остальные к отдельный битам нашего байта (порта).
вы классно объясняете по моему как вы никто не учит
Здравствуйте , такой вопрос.
Если указать глобальную переменную для задержки delay();
Допустим int z = 100;
И менять эту переменную только в одном месте , почему компилятор ругается? И не компилирует код?
Тоесть так сделать не получится, почему?
Где-то ошибка, так же делали в предыдущих уроках.
Теже не работает