Например TDA7294

Форум РадиоКот • Просмотр темы - Вопрос по программированию задержки внутри прерывания
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Сб июн 21, 2025 00:16:17

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 171 ]  1, , , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 09:15:30 
Друг Кота
Аватар пользователя

Карма: 5
Рейтинг сообщений: 61
Зарегистрирован: Ср сен 30, 2020 16:51:47
Сообщений: 4614
Откуда: РФ
Рейтинг сообщения: 0
Доброго времени суток уважаемые коты.

Сам я в программировании специалистом совсем не являюсь, поэтому хочу спросить мнение у специалистов. Накропал для Ардуины вот такой код:

Спойлер
Код:
#include <lgt328p.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // Подключаем дисплей

volatile bool intFlag = false;
unsigned long delayFront;  // Переменная для времени задержки включения выхода

void setup() {
  interrupts();
  lcd.init();                     
  lcd.backlight();// Включаем подсветку дисплея
  lcd.clear(); // очистить дисплей
  lcd.setCursor(0,0);
  lcd.print("Setting  A");
  lcd.setCursor(0,1);
  lcd.print("Delay   mS");
  lcd.setCursor(0,2);
  lcd.print("Voltage  V");
  lcd.setCursor(0,3);
  lcd.print("Carrent  A");
  delayFront == 0;
  Serial.begin(9600);
  pinMode(2,INPUT);
  pinMode(3,OUTPUT);
  pinMode(7,INPUT);
  pinMode(8,INPUT);
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  digitalWrite(3,LOW);
  attachInterrupt(0, event, RISING);
}

void event() {intFlag = true;}

void loop() {
   if(digitalRead(7)==HIGH)delayFront=1; if(digitalRead(8)==HIGH)delayFront=2; if(digitalRead(9)==HIGH)delayFront=5; if(digitalRead(10)==HIGH)delayFront=10;
   Serial.println(delayFront);
   lcd.setCursor (12, 1);
   lcd.print(delayFront);
   lcd.print("  ");
   if (intFlag) {
   intFlag = false;    // сбрасываем флаг
   ЗДЕСЬ ДОЛЖНА БЫТЬ ФУНКЦИЯ ЗАДЕРЖКИ НА [b]delayFront[/b] МИЛЛИСЕКУНД
   digitalWrite(3,HIGH); // включение выхода
   Serial.println("Interrupt!");
   }



Этот код должен делать вот что. После прихода фронта импульса на цифровой вход 2, возникшее прерывание с задержкой на delayFront миллисекунд должно включить цифровой выход 3. В статьях по программированию Ардуины пишут, что при выполнении прерываний функции времени работают с некими ограничениями. Какую функцию программирования мне следует использовать для того чтоб получать необходимую задержку включения выхода?

P.S. Задержка включения выхода нужна на десятки и даже сотни миллисекунд. Поэтому delayMicroseconds(time) получается что не подходит.


Последний раз редактировалось electroget Сб янв 11, 2025 11:12:41, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 10:51:08 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 450
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1615
Откуда: KN34PC, Болгария
Рейтинг сообщения: 1
delay() не работает в interrupt, а micros() и millis() не меняет свое значение в interrupt, но все три функции работает вне interrupt.
Насколько критично время импульса? Также обработайте ситуацию: в течение времени после прерывания произошло новое прерывание (в зависимости от алгоритма вашего устройства: 1. оно должно или 2. не должно продлить время или проигнорировать новое прерывание). В первом варианте снова пропустите временной период, а во втором случае можете просто остановить прерывания cli(); и продолжить позже sei();.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 11:01:08 
Друг Кота
Аватар пользователя

Карма: 5
Рейтинг сообщений: 61
Зарегистрирован: Ср сен 30, 2020 16:51:47
Сообщений: 4614
Откуда: РФ
Рейтинг сообщения: 0
delay() не работает в interrupt, а micros() и millis() не меняет свое значение в interrupt, но все три функции работает вне interrupt.


То есть, если я уже после обработки прерывания вставлю код с функцией millis() и после этого дам команду digitalWrite(3, HIGH); то межу прерыванием и включением выхода 3 получится необходимый мне интервал времени задержки?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 11:04:54 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 450
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1615
Откуда: KN34PC, Болгария
Рейтинг сообщения: 1
Да.
При наличии флага в прерывании реакця будет задержана на несколько такт, пока не войдет в loop. Вот почему спросил о критичности времени. Есть вариации на включения в прерывание и выключения в цикле по истечении времени. Выбирайте согласно своему алгоритму.
---
Реакция мог бы быть с задержки - вижу, что пшете сообщения в Serial в цикле без каких-либо условий.


Последний раз редактировалось veso74 Сб янв 11, 2025 11:10:50, всего редактировалось 1 раз.

Вернуться наверх
 
В продаже новые LED-драйверы XLC компании MEAN WELL с диммингом нового поколения

Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 11:10:30 
Друг Кота
Аватар пользователя

Карма: 5
Рейтинг сообщений: 61
Зарегистрирован: Ср сен 30, 2020 16:51:47
Сообщений: 4614
Откуда: РФ
Рейтинг сообщения: 0
veso74,
Точность вообще не критична. Это делается для установки времени задержки срабатывания электронного предохранителя. Интервалы будут задаваться внешним переключателем: 1,2,5,10,50,100,200 миллисекунд.
Скажите, а выполнение прерывания нужно обязательно специальной командой останавливать? В каком месте кода её нужно вставлять?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 11:13:45 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 450
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1615
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Для предохранителя: измените проверки if .. if ... if на if ... else if ... else if ... или на switch-case. И lcd.print и Serial.println() - ето медленные функции. Напишите их хотя бы с условием, что не пишет каждой раз в loop.

Одно сообщение не даст объяснения :). Необходимо чтение и понимание и множество тестов и проверок, пока не установите на место в первый раз.


Последний раз редактировалось veso74 Сб янв 11, 2025 11:21:07, всего редактировалось 1 раз.

Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 11:18:54 
Друг Кота
Аватар пользователя

Карма: 5
Рейтинг сообщений: 61
Зарегистрирован: Ср сен 30, 2020 16:51:47
Сообщений: 4614
Откуда: РФ
Рейтинг сообщения: 0
lcd.print и Serial.println() - ето медленные функции. Напишите их хотя бы с условием, что не пишет каждой раз в loop.


Это я всё конечно уберу когда программа заработает как надо. Вы мне пожалуйста ещё скажите про прекращение работы прерывания. Выполнение прерывания нужно обязательно специальной командой останавливать? В каком месте кода её нужно вставлять?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 11:26:56 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 450
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1615
Откуда: KN34PC, Болгария
Рейтинг сообщения: 1
Это решите сами. Зависит от выбранного алгоритма.
noInterrupts(); или cli(); -> запрещаем прерывания
interrupts(); или sei(); -> разрешаем прерывания


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 11:33:49 
Друг Кота
Аватар пользователя

Карма: 5
Рейтинг сообщений: 61
Зарегистрирован: Ср сен 30, 2020 16:51:47
Сообщений: 4614
Откуда: РФ
Рейтинг сообщения: 0
veso74,
Понял, спасибо. Буду пробовать сделать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 12:38:08 
Мучитель микросхем

Карма: 4
Рейтинг сообщений: 37
Зарегистрирован: Вт фев 09, 2010 17:52:26
Сообщений: 453
Рейтинг сообщения: 0
veso74 писал(а):
delay() не работает в interrupt,

И с каких это пор она не работает в прерывании?
Работает и в прерывании.
Для коротких отрезков времени можете ее использовать,
"the delay() function and many sketches use short delays for such tasks as switch debouncing, the use of delay()

in a sketch has significant drawbacks. No other reading of sensors, mathematical calculations, or pin manipulation can go on during the delay function, so in effect, it brings most other activity to a halt."

https://docs.arduino.cc/language-refere ... ime/delay/


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 12:53:00 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 450
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1615
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
И с каких это пор она не работает в прерывании?
...

wiring.c, строка 83.
Изображение
delay() в interrupt прекратит interrupt. Необходимы и другие корректировки.
Проще использовать собственную задержку вне interrupt.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 12:55:26 
Друг Кота
Аватар пользователя

Карма: 61
Рейтинг сообщений: 1533
Зарегистрирован: Вт окт 22, 2013 04:37:23
Сообщений: 3303
Откуда: Казань
Рейтинг сообщения: 3
Не надо делеить в обработчиках прерываний. Независимо от способа. Это учит плохому. Это будет говнокод.

_________________
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезисты Ordyl Alpha 350 и AM 140.
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльная маска XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 12:58:46 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 450
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1615
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Совершенно верно. Некоторые компиляторы/IDE даже не допускают этого. Они уже "умные" :).
Изображение
Не должно быть и медленные операции, такие как печать на ЖК-дисплее, на другой тип, в Serial порте, а также медленные вычисления, напр. с float, циклами и т. д.


Последний раз редактировалось veso74 Сб янв 11, 2025 13:03:02, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 13:05:34 
Сверлит текстолит когтями

Карма: 12
Рейтинг сообщений: 124
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1213
Рейтинг сообщения: 0
in a sketch has significant drawbacks. No other reading of sensors, mathematical calculations, or pin manipulation can go on during the delay function, so in effect, it brings most other activity to a halt."

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

Добавлено after 4 minutes 3 seconds:
delay() в interrupt прекратит interrupt.

Да ладно! Вы невнимательны.)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 13:06:58 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 1466
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15042
Откуда: ДОНЕЦК
Рейтинг сообщения: 1
Ардуино под Си не ассемблер.
Используем то, что принято в референсе.
Прерывание предпочтительно только под короткие операции с флагами и/или короткие фрагменты программного кода.
Для слишком критичного ко времени исполнения участка подпрограммы-обработчика под ассемблером есть прием "условного возврата" (подстановка адреса возврата через стек).
Возможно нечто похожее можно и под Си (без вставок на ассемблере) получить...
:roll:

А вот этим yield() для простых прожек баловаться как то...
https://alexgyver.ru/lessons/time/
Тем более, что без подключения соответствующей библиотеки ( #include <Scheduler.h> ) yield() работать не будет...
Второе...
"...расположенный внутри неё (yield()) код будет выполняться во время работы любой задержки delay() в программе..."
но это не одно и то же, что
"расположенная внутри функции текущего обработчика прерывания функция delay() будет исполняться"...
8)


Последний раз редактировалось BOB51 Сб янв 11, 2025 13:27:43, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 13:24:47 
Мучитель микросхем

Карма: 4
Рейтинг сообщений: 37
Зарегистрирован: Вт фев 09, 2010 17:52:26
Сообщений: 453
Рейтинг сообщения: 0
veso74 писал(а):
delay() в interrupt прекратит interrupt.

Не прекратит, а CLi не разрешит другие прерывания.
Для точности временной задержки delay заменить на свою задержку.

smacorp писал(а):
Не надо делеить в обработчиках прерываний. Независимо от способа. Это учит плохому. Это будет говнокод.

Если работает, то это никому не мешает.

Добавлено after 3 minutes 51 second:
OKF писал(а):
Внутри delay() есть yield() - функция позднего связывания. Определив её у себя, можно выполнять операции во время работы delay().

Это предупреждение тем (и не мое), которые этого не знают.


Последний раз редактировалось codenamehawk Сб янв 11, 2025 13:27:28, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 13:26:08 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 450
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1615
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Считайте условно нерабочим как происходит действие, которое не было запланировано. (не воспринимайте слово "прекратит" буквально, часто пользуюсь переводчиком).


Последний раз редактировалось veso74 Сб янв 11, 2025 13:35:11, всего редактировалось 3 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 13:29:46 
Мучитель микросхем

Карма: 4
Рейтинг сообщений: 37
Зарегистрирован: Вт фев 09, 2010 17:52:26
Сообщений: 453
Рейтинг сообщения: 0
При входе в прерывание, другие прерывания запрещены и делай их не разрешит, только выход из прерывания или вручную.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 13:40:51 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 1466
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15042
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Тем самым в определенной степени будет нарушена работа устройства.
:tea:
Псевдопараллельный процесс можно организовать как на дополнительном прерывании по COMP_A (у атмег 328 не задействован референсом) так и на сцепке стандартного референса - используя tone и любое из внешних прерываний для подсчета поступающих на вход прерывания импульсов. Правда там два вывода теряем плюс внешняя перемычка.
:tea:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Сб янв 11, 2025 14:07:44 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 38
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
BOB51 писал(а):
Для слишком критичного ко времени исполнения участка подпрограммы-обработчика под ассемблером есть прием "условного возврата" (подстановка адреса возврата через стек).
BOB51, можно это в коде выразить?


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 171 ]  1, , , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y