Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Станьте Детективом! Решайте логические головоломки, чтобы найти преступника! 
Множество уровней и интересных историй! События и задачи дня!

Тебе предстоит раскрывать массу разных дел, в этом тебе поможет известный всем сыщикам метод дедукции.

Детектив - логические головоломки

Головоломки, Казуальные, Логическая

Играть

Топ прошлой недели

  • Oskanov Oskanov 8 постов
  • alekseyJHL alekseyJHL 6 постов
  • XpyMy XpyMy 1 пост
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Прерывания

7 постов сначала свежее
lolyn
5 лет назад

Системные прерывания⁠⁠

мне нужна помощь я не знаю что делать.Всегда когда я играю есть случаи когда просто секунд 20 лагает и в диспетчере задач проц грузит проц на 100 процентов.А процесс называется системные прерывания.Я через программу DPC Latency Checker понял что это видео карта(когда я её отключил в диспетчере устройств и у меня всё стало зелёным в программе это означало что всё решено).Так вот я пытался уже любыми способами это исправить ну ведь без видюхи я не могу играть.Я и переустанавливал драйвера все, и всё чистой установкой драйвера устанавливал ничего не помогал.Так вот мне нужна ваша помощь я не знаю что мне ещё делать надеюсь что вы мне поможите если что видеокарта gtx 1050 ti от GIBABYTE и виндовс 10.(я только в крайнем случае буду виндовс перестанавливать)

Системные прерывания Прерывания Geforce GTX 1050 ti Nvidia 1050 Windows 10 Текст
7
151
vivaos
vivaos
5 лет назад
Arduino & Pi

Считываем кнопки и датчики не смотря на длительные задержки в программе - Аппаратные прерывания - Arduino для начинающих⁠⁠

Продолжаем рубрику для начинающих ардуинщиков :)


На этот раз поговорим об аппаратных (внутренних) прерываниях в Arduino (ATmega328P).

Например, они пригодятся для ситуаций, когда у вас большая программа с кучей функций delay и других задержек (что ужасно), но вам никак нельзя пропускать определенные события - нажатия кнопок, срабатывания датчиков и т.д.


Краткая выжимка из видео:

- Что такое аппаратные прерывания и как они работают (0:33)

- Смотрим информацию о прерываниях в datasheet на микроконтроллер ATmega328p (2:38)

- Пишем программу для внешнего прерывания по кнопке (6:24)

- Наблюдаем дребезг контактов на графике осциллографа (14:47)

- Пишем простую программу для борьбы с дребезгом контактов (16:00)

- Получаем домашнее задание (22:30)


Программа с настройкой прерываний по кнопке, позволяющая обойти дребезг контактов: Google Drive

Удачных компиляций! :)


P.S.: Если вы еще не состоите в сообществе "Arduino & Pi", милости просим сюда.

Показать полностью
[моё] Arduino Прерывания Дребезг Кнопка Урок Программирование Видео
20
111
Scrypto
Scrypto
6 лет назад
Arduino & Pi

Подключение нескольких кнопок к одному прерыванию Arduino⁠⁠

[моё] Arduino Кнопка Прерывания Видео
73
21
SCratORS
SCratORS
7 лет назад
Arduino & Pi

Светомузыка с Arduino. Сезон 2 Часть 3⁠⁠

Часть 1 https://pikabu.ru/story/svetomuzyika_s_arduino_sezon_2_chast...

Часть 2 https://pikabu.ru/story/svetomuzyika_s_arduino_sezon_2_chast...


Продолжаем ковырять прерывания и таймеры.

Поговорим о делителях частоты и зачем они нужны. Делители - тупо уменьшают системную частоту, зачем - да фиг его знает, но зачем то нужны. В прошлом посте я пришёл к тому, что цикл прерывания работает, и не мешают работе ШИМ, но вот чот не так быстро как хотелось бы. Напомню, что время между тактами составляло порядка 2 миллисекунд, а надо микросекунды. Будем отключать делитель.

У адруины нано есть вот такие варианты:

1. таймер/Счетчик выключен;

2. Тактовый генератор;

3. Делитель на 8;

4. Делитель на 64;

5. Делитель на 256;

6. Делитель на 1024.

По умолчанию, в частности на таймере 2, делитель установлен на 64. Посчитаем:

Ардуина работает на 16 МГц, следовательно 16 000 000 / 64 = 250 000, т.е. 250 кГц, т.е. 250 000 раз в секунду.

Далее посмотрим, сколько времени требуется на такт: 1 / 250 000 = 0, 000004 сек, или 4 микросекунды. Счетчик таймеры 2 считает до 255, а значит прерывание срабатывает 1 раз за 256 тактов (0 - 255), значит прерывание срабатывает каждые 4 * 256 = 1024 мкс, или 1,024 миллисекунды,...


Отступление: многие мануалы, которые я прочитал,пытаются заставить работать прерывание со сбросом при совпадении, и настраивают его на работу в 1 миллисекунду, но при выборе режима работы допускают маленькую ошибку, и получают время 1,024 - на практике это особо не заметно, и их светодиоды работают вроде бы как надо, но отличить глазом разницу в 24 мкс - не реально, и типа ок. А когда я стал с этим разбираться, тайминги не совпадали, и ничего не работало как надо.


Ок, вернемся к нашим баранам.

1,024 миллисекунды - слишком медленно,... будем выключать делители. Посмотрим как это делать: (картинка с видео)

Светомузыка с Arduino. Сезон 2 Часть 3 Arduino, Таймер, Прерывания, Совет, Длиннопост

Как видим, какие-то мутные регистры, но ничего сложного:

Все настройки делаются в блоке setup!

CS00, CS01, CS02 - Разбираемся: CS - Регистры, просто запоминаем. первая цифра - номер таймера, Нам нужен 2. Вторая цифра - управляющий бит. Итак, нам надо тактовый генератор на канале B таймера 2, а значит надо установить регистры CS20 = 1, CS21 = 0, CS22 = 0 в регистр таймера 2 канал B

В программном виде это выглядит так:

TCCR2B |= 1<<CS20;

TCCR2B &= ~((1<<CS22)|(1<<CS21));

, где

TCCR2B - Регистр таймера 2, канал B (Соответственно может быть TCCR0А, TCCR0B, TCCR1A, TCCR1B, TCCR2A, TCCR2B - Думаю понятно что тут и где).

Первой строчкой через оператор OR устанавливаю 1 на регистр CS20, второй строчкой устанавливаю нули в регистры CS21 и CS22 используя операторы AND и Инвертирование от OR.

Для тех кто не знает:

| - это оператор OR (логиеское или). Принцип работы: имеем биты А и Б, Про себя проговариваем: Если А или Б = 1, то на выходе 1. т.е. если хотя бы один из битов = 1, то на выходе 1. Соответственно, если оба = 0, то на выходе 0.

& - это оператор AND (логическое и). Принцип работы: имеем биты А и Б, Про себя проговариваем: Если А и Б = 1, то на выходе 1. т.е. если хотя бы один из битов = 0, то на выходе 0. Соответственно, если оба = 0, то на выходе тоже 0. Чуишь разницу?

~ - это оператор NOT (логическое не). Принцип работы: Имеем бит А. Про себя проговариваем: Если А = 0, то на выходе не 0, и наоборот. Грубо говоря, просто инвертируем значение.

<< - Операция побитового смещения влево, То есть, было у нас 3 бита = 001, смещаем их влево на 1 знак, получаем 010, Еще разок сместим - 100, еще разок сместим 000. ну и вправо смещать тоже можно аналогично.


Как работает вся эта конструкция в целом - да не особо важно, если будет ты туда залез, и тебе это нужно - разобраться будет не сложно.


Итак. Делители выключили, посчитаем: 1 секунда / 16 000 000 Гц = 0,0625 мкс, * 256 = 16 мкс. Во, уже просто супер! Теперь можно хреначить цикл работы с микрухой анализатора.

Изменение частоты делителя, никак не влияет на работу ШИМ, - так как подняв частоту ШИМ, мы не меняем скважность сигнала (процентное соотношение времени вкл и выкл) - это как частоту на мониторе поднять, просто мерцать меньше будет.


В общем и целом,что можно сделать на ардуине:

7 типа параллельных потоков:

один цикл - Основной LOOP, - очень шустрый, менее 1 мкс на круг.

еще два цикла - на таймере 2 каналы A и B - довольно шустрые по 16 мкс на круг.

еще два цикла - на таймере 1 каналы A и B - помедленнее, так как они до 1024 считаю, т.е. 64 мкс на круг.

и еще два - на таймере 0, но тут частоту менять не надо, то есть 1024 мкс на круг.


Далее, если нам не надо ШИМ или всякие Delay, micros, millis, и прочие (в зависимости от таймеров и каналов), можно поставить в прерывании по таймеру сброс счетчика, и в регистр сравнения записать 1, таким образом, прерывание будет вызываться в каждый такт: т.е. получим скорость как у основного цикла LOOP, = 0,0625 мкс.

Посмотрим как это делать:

Светомузыка с Arduino. Сезон 2 Часть 3 Arduino, Таймер, Прерывания, Совет, Длиннопост

Видим, что надо задавать регистры WGM, где первая цифра - это номер таймера, вторая - задающий бит (У таймера 1 немного иначе - имейте ввиду). То есть надо сделать так:

TCCR2B = 1<<WGM21;

По умолчанию установлен режим Нормальный, то есть биты стоят в 0. поэтому дополнительных манипуляций не требуется, просто берем и устанавливаем единицу в нужный регистр.

Обращаю внимание что оператор | (OR) перед знаком равенства не используется! Я фиг знает почему так, - логично что надо бы, но если его поставить, то нифига не работает. Ну и соответственно, эту строчку надо бы размещать перед другими настройками этого бита (TCCR2B в данном случае).

Если надо установить в оба бита, то делаем так: TCCR2B = ((1<<WGM21)|(1<<WGM20));

Итак: в конечном виде это выглядит так:

TCCR2B = 1<<WGM21;  Режим Сброс при совпадении

TCCR2B |= 1<<CS20;  Режим работы по генератору 16 МГц

TCCR2B &= ~((1<<CS22)|(1<<CS21));  Делители выключаем.

OCR2B = 1;  Число для сравнения с счетчиком, пущай каждый такт прерывание фигачит

TIMSK2 |= (1 << OCIE2B);  Разрешаем прерывание при совпадении

В коде функции прерывания, напишем немного кода, что бы посчитать время. И на мониторе порта посмотрим результат: 30 мкс... Сабака, так быстро тикает, что пропускает такты, или micros не успевает считать. Ок,.. поставим Счетчик подальше, OCR2B = 127 и... 15 мкс

Вывод: Без делителей, смысла использовать режим Сброса при совпадении - особо нет. Да и ШИМ перестает работать - нахер эту ерунду. Оставляем режим в "нормальном", вырубаем делители, и получаем и ШИМ и 16 мкс на круг. Всё, можно писать прошивку для Светомузыки с  микросхемой анализатора.


Продолжение следует.... со скоростью китайско-русской почты. Жду посылку с микрухой.

Показать полностью 2
[моё] Arduino Таймер Прерывания Совет Длиннопост
10
8
SCratORS
SCratORS
7 лет назад

Светомузыка с Arduino. Сезон 2 Часть 2⁠⁠

Часть 1 https://pikabu.ru/story/svetomuzyika_s_arduino_sezon_2_chast...

Закончил на вопросе о том все таймеры прерываний у меня заняты, чтож мы не шиком лыты, будем думать.

Как работает ШИМ на ардуино? А очень просто:

Что бы это понять расскажу о таймерах и как оно устроено:

Таймер - это такая штука, которая тикает с определенным временным промежутком, который задается генератором частоты (или резонатором, хер его знает как это правильно назвать - нам это не важно), у Ардуины нано он составляет 16МГц, т.е. тикает 16 млн. раз в секунду.

Счетчик таймера - это такая своего рода переменная, которую таймер увеличивает на 1 с каждым тактом (тиком). Для каждого таймера свой счетчик, - таким образом имеем 3 счетчика и 3 таймера. Каждый счетчик имеет свою разрядность (то максимальное число, до которого можно досчитать). Счетчик таймера 0 может сосчитать от 0 до 255. Счетчик таймера 1 от 0 до 1023, Счетчик таймера 2 от 0 до 255.

Так же для каждого таймера есть две переменные для сравнения, называется она - а хер его знает как они правильно называются, назову их канал А и Б.

На практике оно обзывается так:

TCNT0, TCNT1, TCNT2 - Счетчики таймеров 0, 1, 2.

OCR0A, OCR0B, OCR1A, OCR1B, OCR2A, OCR2B - каналы А и Б для каждого счетчика таймера.

Когда счетчик досчитывает до максимального своего значения - он обнуляется.

Теперь о ШИМ:

Когда передаешь в функцию analogWtite значение ШИМ, то запускается такой вот механизм:

(Канал таймера выбирается кодом функции analogWtite)

На примере таймера 2

Светомузыка с Arduino. Сезон 2 Часть 2 Arduino, Таймер, Прерывания, Совет, Длиннопост, Шим

Допустим записываем в D3 значение 93 - analogWrite(3, 93), если посмотреть в код функции, то там можно увидеть что этому пину ШИМ соответствует Счетчик таймера 2, канал B.

Счетчик таймера 2 может считать до 255, что отображено на шкале. С каждым тактом таймера, счетчик TCNT2 увеличивает свое значение на 1, И до тех пор пока счетчик не досчитает до 93, на выходе D3 будет 5 вольт (вкл, высокий уровень). Как только счетчик досчитает до 93, то на выходе D3 будет 0 (выкл, низкий уровень). Досчитав до 255, счетчик обнулится, и все начинается сначала.

Аналогично с пином D11 - это Счетчик таймера 2, канал А.


Таким образом, как можно сделать задуманное не повредив работу ШИМ? Можно использовать прерывание, но никаких манипуляций со Счетчиками или каналами делать нельзя. Хорошо, попробуем:

В блоке setup поставим разрешение на прерывание

TIMSK2 |= (1 << OCIE2B);

, где:

TIMSK2 - Это Выбор Таймера 2, (выбор из : TIMSK0, TIMSK1, TIMSK2 - собсно таймеры)

OCIE2B - Прерывание по счетчику таймера 2 на канал В (Выбор из: OCIE0A,OCIE0B, OCIE1A, OCIE1B, OCIE2A, OCIE2B - Думаю объяснять не надо, что тут к чему относится).

А функция которая будет вызываться - это


ISR (TIMER2_COMPB_vect) {

... тут код

}

, где

ISR - это грубо говоря тип функций для прерываний, а в скобках описывается что за прерывание.

TIMER2 - Ну таймер 2,

COMPB - Сокращение от COMPARE B, сравнение с каналом В, Есть другие, читаем гугл.

Собственно если надо другое - меняем номер таймера или канала.

Теперь это выглядит так:

Светомузыка с Arduino. Сезон 2 Часть 2 Arduino, Таймер, Прерывания, Совет, Длиннопост, Шим

Да, оно работает, - прерывание вызывается, ШИМ работает. То есть имеем что то типа 2 потоков, один работает самостоятельно в цикле LOOP, второй на выбранном прерывании. правда есть две небольших особенности:

1. В цикле по прерыванию, НЕЛЬЗЯ просто так использовать задержки и вообще нагружать цикл чем-то тяжелым, Но например помигать светодиодом, или дернуть микруху стробом или считать значение - можно.

2. Это прерывание, в рамках таймингов микросхемы вызывается не так часто как хотелось бы, т.е. если померить промежуток времени между прерываниями, то получается что-то порядка 2 миллисекунд.... а тайминги микросхемы идут в микросекундах.


Итого, 1 особенность - мне не мешает, да и при умении, она легко обходится.

2 особенность связана с тем что помимо частоты работы есть еще так называемые делители частоты, которые используются в этих таймерах. - От этого и есть много интересных статей по увеличению частоты ШИМ и прочие радости. А значит решить эту проблемку можно подняв частоту ШИМ.


Почему я использую таймер 2, а не другие:

Во первых, он 8 разрядный, т.е. считает до 255, - т.е. прерывание будет вызываться чаще чем таймер 1, который считает до 1023.

Во вторых, Таймер 0 - он хоть и тоже 8 разрядный, но на нём работают помимо ШИМ еще функции delay, micros и тому подобные, а функция micros мне нужна. То есть, если я буду поднимать чатоту ШИМ на таймере 0, то функция micros и другие тоже начнут работать не корректно.


Итак имеем. Понятие как работает ШИМ, что такое Таймеры, счетчики и прерывания, Запустили дополнительный цикл параллельно основному, но пока медленный.

Можно конечно все рассказать в одном посте - но будет слишком много информации, поэтому разбиваю на несколько частей примерно по темам.


Далее я кратко расскажу что такое делители частоты, как ими пользоваться, и немного о режиме счетчика CLC (сброс при совпадении). Продолжение следует.

Показать полностью 2
[моё] Arduino Таймер Прерывания Совет Длиннопост Шим
2
511
vivaos
vivaos
7 лет назад
Arduino & Pi

Arduino для начинающих - Прерывания по таймеру в Arduino (AVR). Создаем многозадачное устройство⁠⁠

Вот и подоспел 11-й выпуск из серии "Arduino для начинающих"!😊

В этом видео мы будем говорить о прерываниях. А конкретно, о прерываниях по таймеру. О том, как сделать ваши программы более гибкими и избавиться от пресловутой функции delay(), которая, по сути, останавливает работу всего микроконтроллера.

Материалы к видео находятся здесь.


Список остальных выпусков:

#0 Введение в курс. Чего ожидать от этой серии для начинающих.

#1 Немного электроники и схемотехники – без них никуда.

#2 Знакомство с Arduino. Основные компоненты для начала работы.

#3 Arduino изнутри - структура, составляющие и их назначение. Микроконтроллер Atmega328P

#4 Arduino IDE Настройка и установка драйверов. Проверка работоспособности платы Arduino

#5 Первая программа – работаем со светодиодом и кнопкой.

#6 Условные операторы и циклы.

#7 Логические операции И, НЕ, ИЛИ.

#8 Функции и их применение.

#9 Библиотеки - как с ними работать и создать свою собственную.

#10 Передача и прием данных. Библиотека Serial и коды ASCII


Удачных компиляций! :)


P.S.: Если вы еще не состоите в сообществе "Arduino & Pi", милости просим сюда.

Показать полностью
[моё] Arduino Прерывания Atmega328 Многозадачность Урок Видео
40
59
vivaos
vivaos
9 лет назад

Очередное видео для подписчиков. Говорим о прерываниях на Arduino.⁠⁠

В этом видео Вы познакомитесь с прерываниями микроконтроллеров, их назначением и применением на примере кнопки звонка, при нажатии на которую воспроизводится звуковой сигнал. 

p.s.: Всех с наступающим Новым годом и Рождеством! :)

[моё] Arduino Программирование Прерывания Видео Кво Для подписчиков
19
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии