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

Мой Любимый Кот

Новеллы, Головоломки, Коты

Играть

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

  • AlexKud AlexKud 38 постов
  • Animalrescueed Animalrescueed 36 постов
  • Oskanov Oskanov 7 постов
Посмотреть весь топ

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

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

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

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

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
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
7 лет назад
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
8 лет назад
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
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии