Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
1

Как вызвать функцию через промежуток времени?

06.01.2020, 06:09. Показов 2725. Ответов 65
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Даже не то чтобы вызвать, а две булевые переменные чтобы сбрасывались/устанавливались через 40000мс и 20000мс.
40000мс true потом 40000мс false, и т.д.

Я понял, что можно считать в main, да только там занято и непонятно сколько времени тратится на обработку кода в цикле.
Гуглил, есть способ с использованием счётчиков таймеров, но тут тоже что-то используется.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#if defined(AT168_COMPATIBLE)
#define mustPollControllers()   (TIFR2 & (1 << OCF2A))
#define clrPollControllers()    do {TIFR2 = 1 << OCF2A;} while(0)
#else
#define mustPollControllers()   (TIFR & (1 << OCF2))
#define clrPollControllers()    do {TIFR = 1 << OCF2;} while(0)
#endif
 
int main(void)
{
    //...
    while(1)
    {
        //...
        if(mustPollControllers())
        {
            clrPollControllers();
            //...
        }
        //...
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2020, 06:09
Ответы с готовыми решениями:

Как вызывать метод (функцию) в определенный промежуток времени?
То есть каким способом можно вызывать функцию, например, раз в секунду. Предположим есть цикл...

Как вывести строку через промежуток времени?
Здравствуйте! как вывести строку через промежуток времени? пр: 1) $f = @fopen(&quot;1.txt&quot;, &quot;r&quot;); ...

Как повторять действие через промежуток времени?
Доброго времени суток. Как повторять действие, к примеру обновлять веб страницу WebBrowser каждые 5...

Как менять случайное число через какой-то промежуток времени?
как менять случайное число через какой то промежуток времени на C# ? Добавлено через 31 минуту...

65
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
15.01.2020, 14:08 41
Author24 — интернет-сервис помощи студентам
Знаете, я почему-то не хочу верить во всякую чушь, тем более на слово. Интересно, с чего бы...
IDE это ни разу не автоматизация. Интеграция (объединение инструментов написания кода, отладки, прошивки,...) - да, коллекция шаблонов (настройки для десктопного приложения, консольного, библиотеки,...) - да.
А автоматизация это среда, где последовательностью операций можно управлять. То есть набор утилит и какой-то скриптовый язык для их связи.
1
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
15.01.2020, 17:57 42
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Знаете, я почему-то не хочу верить во всякую чушь, тем более на слово. Интересно, с чего бы...
IDE это ни разу не автоматизация.
Я написал
Цитата Сообщение от locm Посмотреть сообщение
Вот, считайте что IDE это автоматизация для gdb.
Ключевое слово считайте.
А если не хотите верить на слово, гифка-видео несколькими сообщениями выше.
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
15.01.2020, 20:28  [ТС] 43
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это может быть тон вопроса: когда в коде совершенно дурацкая ошибка, но при этом непрекращающиеся обвинения всего окружающего.
А может быть неуважение к окружающим: когда выкладывается здоровенная простыня с сотней зависимостей, даже без попытки привести ее к минимально возможному виду, на котором ошибка проявляется.
По крайней мере в этой теме, ни первое ни второе ко мне не подходит.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот и выкладывать на форум надо факты, а не свою эмоциональную интерпретацию. А прежде чем выкладывать, попробовать локализовать ошибку самостоятельно. В вашем же примере можно было заменить таймер на задержку, чтобы проверить в нем ли дело.
Каюсь, эмоциональный понос бывает.
Так я вроде как и создал отдельный проект, чтобы проверить, в чём дело, в таймере, в его использовании или протеусе.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
#define F_CPU 12000000UL - этого в коде быть не должно. Это задается флагами компилятора. В крайнем случае, общим заголовочным файлом, что-то вроде board.h, который обязательно подключается ко всем файлам исходного кода чтобы в них всех были одинаковые настройки. Но через флаги компиляции все же проще.
Ну во флагах компиляции мне лень разбираться, а заголовочный файл я в проекте создал на этапе "лишь бы скомпилировать"(первоначально проблема была проект вообще открыть), т.к. требовалось в 2х файлах.
А на счёт правильности, кому как нравится, я это делаю только для себя.
А уж пропишет это компилятор или я - да без разницы.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
TCCR0 = (1 << CS22) | (1 << CS20); // Таймер0 - 8 бит. .Считать на подьёме. - хотел было похвалить за правильную запись, но не выйдет. Если у вас Timer0, то почему выставляете флаги Timer2? Комментарий тоже было бы неплохо поправить.
Я конечно подправлю.
Комментарий остался неизменным с самого начала, до того как я понял, что можно либо использовать делитель на 1024 такта, либо изменить момент счёта(на спаде или на подъёме).
На счёт макросов, для меня я 3дня назад(по времени, которое я уделил этому) скачал Atmel Studio, и вообще начал знакомство с мегой. Названия макросов мне совершенно ни о чём не говорят, я делал по аналогии с другим таймером, посмотрел их значение и оставил нужное.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А вы вообще какой таймер настраиваете? То вы в OCR0 пишете CS2x, потом настраиваете OCR2, потом проверяете TCNT0
DDRD = 0b00000001; - DDRD = (1<<0);
if(TCNT0 > 233) // Если насчитало 234 раза по 1024 такта - 0.02с. - таймеры на то и таймеры, чтобы работать асинхронно относительно кода. Не стоит лезть руками в счетные регистры.
Если счет идет до 233, зачем настраивали OCR2 в 196? Нет, режим CTC вы не выставили, да и таймеры разные, так что на логику это не повлияло... Тем более зачем?!
Таймер 0, путаница получилась из-за моей невнимательности, я не сразу понял какие макросы включаются именно в моём случае. Автор проекта разрабатывал так же и под другие версии микроконтроллеров.
OCR0 я вообще ни разу не упоминал, зачем вы вводите меня в путаницу, я и так запутался.
Я понимаю что таймеры считаются где-то "там", но не в функции майн.
В счётный регистр я полез потому, что мне нужен промежуток в 233*1024 такта.
Зачем мне городить какие-то костыли, чтобы как-то посчитать также 233 изменения регистра счётчика, особенно после того, как на 266й раз он будет равен 0.
Обнуляю я его и всё.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
if(PIND3 == 1) - про cvavr'ную логику уже говорили (там действительно разрешено обращаться к битам как PIND.3, но стандарту Си это все равно не соответствует). Правильная запись (PIND & (1<<3)) либо (!(PIND & (1<<3))). Если освоите макросы, можно будет переписать через них, например так:
#define BTN D,3,1
if( PIN_ON( BTN ) ){...}
Вот тут уж точно не перепутаешь. При том что это макрос, он разворачивается в то же (PIND & (1<<3)), которое, в свою очередь, в одну ассемблерную инструкцию sbic / sbis
PORTD &= ~0b00000001; - PORTD &=~ (1<<0);
Всё это "удобство" я не одобряю, много лишней информации.
Работать с одним байтом не настолько сложно, чтобы написать кучу макросов для того, чтобы работать побитово.
Я так написал, потому, что ещё не врубился, где функция, а где макрос.
У вас наверное сразу появился вопрос, не дальтоник ли я, ведь функция черным а макрос сиреневым.
Я просто последний раз лез в программирование 2 года назад - подзабыл всё.
Плюс незнакомый стиль оформления.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
16.01.2020, 09:35 44
Цитата Сообщение от locm Посмотреть сообщение
Вот, считайте что IDE это автоматизация для gdb.
...
А если не хотите верить на слово, гифка-видео несколькими сообщениями выше.
То есть под автоматизацией вы понимаете ручную работу с регистрами. Скорее всего, имелось в виду что-то другое, но сказали вы именно это.
Цитата Сообщение от артист Посмотреть сообщение
OCR0 я вообще ни разу не упоминал, зачем вы вводите меня в путаницу, я и так запутался.
Я комментировал только оформление вашего алгоритма. Запутались вы без моей помощи.
Цитата Сообщение от артист Посмотреть сообщение
В счётный регистр я полез потому, что мне нужен промежуток в 233*1024 такта.
Для этого используется режим таймера CTC (сброс при совпадении). Поскольку таймер работает независимо от ядра, чем больше логики вы ему отдадите, тем лучше. И рассинхронизации не будет, и производительность не снизится.
Цитата Сообщение от артист Посмотреть сообщение
Всё это "удобство" я не одобряю, много лишней информации.
Работать с одним байтом не настолько сложно, чтобы написать кучу макросов для того, чтобы работать побитово.
Пока речь идет об отдельных светодиодах действительно можно не заморачиваться. Удобство таких макросов начинается во время разводки платы, когда бывает удобно перекинуть кнопки, светодиоды и прочее с одних выводов на другие, причем в коде это меняется в одном месте, а не в десятке. Но пока необходимости не возникло, вряд ли оцените.
Цитата Сообщение от артист Посмотреть сообщение
Я конечно подправлю.
Комментарий остался неизменным с самого начала, до того как я понял, что можно либо использовать делитель на 1024 такта, либо изменить момент счёта(на спаде или на подъёме).
Не надо оправдываться, просто учтите замечания на будущее. И воздержитесь от негативной эмоциональной оценки когда задаете вопросы.
1
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
16.01.2020, 12:31 45
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть под автоматизацией вы понимаете ручную работу с регистрами.
Я думал понято что я имел в виду. У GDB консольный интерфейс с текстовым управлением. Это мягко говоря не очень удобно. IDE значительно упрощает работу с отладчиком предоставляя понятный графический интерфейс. Не нужно знать команды GDB. Просто ставим точки останова кликая мышкой по строке кода, наводим мышку на переменную и узнаем значение в ней и т. д. Нажимаем F10 на клавиатуре и пошагово выполняем программу.
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
17.01.2020, 05:37  [ТС] 46
Вот нашел пример использования CTC.
C
1
2
3
4
5
6
7
8
 /*инициализация таймера*/
TCCR0 = 0;
TCCR0 = (0<<COM01)|(0<<COM00)|(1<<WGM01)|(0<<WGM00);
TCNT0 = 0;
OCR0 = 113;
TIFR = (1<<OCIE0);
TIMSK = (1<<OCIE0);
TCCR0 |= (0<<CS02)|(0<<CS01)|(1<<CS00);
Почему здесь 3 раза дергается TCCR0?
Так нельзя сделать?
C
1
TCCR0 = (0<<COM01)|(0<<COM00)|(1<<WGM01)|(0<<WGM00)|(0<<CS02)|(0<<CS01)|(1<<CS00);
Добавлено через 7 минут
И нужно ли вообще трогать TIFR и TIMSK?
Я так понял это настройка прерываний для всех таймеров, не собьётся ли тот который уже используется?
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
17.01.2020, 10:22 47
Цитата Сообщение от locm Посмотреть сообщение
У GDB консольный интерфейс с текстовым управлением.
Я даже больше скажу: именно через gdb обычно реализуется отладка. То есть все ваши костыли не сами ходят к железке / программе, а через gdb.
Цитата Сообщение от locm Посмотреть сообщение
консольный интерфейс с текстовым управлением. Это мягко говоря не очень удобно.
Кому-то и в иконки удобнее тыкать, чем набрать короткую команду в консоли. Ну вот не хотят они потратить немного времени, чтобы потом работать быстрее.
Цитата Сообщение от артист Посмотреть сообщение
Почему здесь 3 раза дергается TCCR0?
Так нельзя сделать?
Если этот код изначально был так записан, то это странно. Еще можно понять, когда он разбит на блоки:
C
1
2
3
TCCR0 = 0;
...
TCCR0 |= (0b001 << CS00) | (1<<WGM01 | 0<<WGM00);
Даже если разбить последнюю строчку - можно найти логику:
C
1
2
TCCR0 |= (0b001 << CS00);
TCCR0 |= (1<<WGM01 | 0<<WGM00);
Но именно в вашем варианте смысла не вижу.
Цитата Сообщение от артист Посмотреть сообщение
TCCR0 = (0<<COM01)|(0<<COM00)|(1<<WGM01)|(0<<WGM00)|(0<<CS02)|(0<<CS01)|(1<<CS00);
Старайтесь избегать записи (0<<x), это создает ложное ощущение записи нуля. Надеюсь, вы понимаете, почему оператор |= не записывает нули. Исключение - когда бит связан с другими, как те же WGM0x. Но вот если COM0x не используются вообще, какой смысл акцентировать на них внимание?
Цитата Сообщение от артист Посмотреть сообщение
И нужно ли вообще трогать TIFR и TIMSK?
Если бы они были совсем бесполезны для программиста, их бы не выставили наружу, очевидно.
TIMSK, если я правильно помню, это разрешение прерываний. То есть если вы хотите использовать прерывания, вам придется лазить в TIMSK. Если хотите менять условие возникновения прерываний, лазить туда придется не только при инициализации, но и во время работы.
TIFR придется трогать только если хотите обрабатывать события от таймера программно, без прерываний. То есть досчитал, скажем, таймер, до максимума, выставил TOVF0 - а прерывание запрещено. Вместо этого вы в основном цикле проверяете флаг, обрабатываете его и сбрасываете. Такой подход тоже иногда используется.
1
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
17.01.2020, 19:48 48
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Кому-то и в иконки удобнее тыкать, чем набрать короткую команду в консоли.
Вы же сами попросили.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Осталось воспроизвести на обычном gdb и без IDE, будет совсем хорошо.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
набрать короткую команду в консоли.
Отлаживать вводя команды в консоль? Нет, спасибо.
Покажите несколько "коротких команд", допустим для пошаговой отладки и просмотра переменных. Посмотрим насколько это проще чем кликнув парой раз по кнопкам/менюшкам сделать тоже самое.
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
17.01.2020, 21:24 49
locm, я же сразу сказал что предпочитаю обычную отладку, через отладочный вывод, логи и т.п.
1
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
17.01.2020, 21:34 50
Цитата Сообщение от locm Посмотреть сообщение
Покажите несколько "коротких команд", допустим для пошаговой отладки и просмотра переменных. Посмотрим насколько это проще чем кликнув парой раз по кнопкам/менюшкам сделать тоже самое.
Статья или глава одной из книг покойного Криса Касперски вполне наглядны.
1
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
17.01.2020, 23:55 51
Это все равно что отказаться от винды и вернутся в DOS.
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
18.01.2020, 02:13 52
locm, идея попробовать что-то кроме винды в любом случае хорошая.
Например, освоить работу в консоли, и осознать, что она гораздо эффективнее похода по менюшкам. Разумеется, в современной консоли, а не виндовой или тем более досовской.
1
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
18.01.2020, 02:25 53
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Например, освоить работу в консоли, и осознать, что она гораздо эффективнее похода по менюшкам.
Как вы выразились "поход по менюшкам" я выкладывал Как вызвать функцию через промежуток времени?
Покажите что-то аналогичное сделано через консоль. Посмотрим насколько будет эффективно.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Разумеется, в современной консоли, а не виндовой
Можете привести пример? Чтобы не было недопонимания.
1
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
18.01.2020, 08:17 54
locm, а Вы отладку делаете функциональными клавишами и их сочетаниями (F5, F7, F8, Shift+F5 и т.п.) или жмакаете на иконки в инструментальной панели?
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
18.01.2020, 11:14 55
Цитата Сообщение от locm Посмотреть сообщение
Покажите что-то аналогичное сделано через консоль. Посмотрим насколько будет эффективно.
Через код, естественно, без отладчика. То есть в консоли это будет make && make prog
Цитата Сообщение от locm Посмотреть сообщение
Можете привести пример? Чтобы не было недопонимания.
bash, zsh и подобные для работы на уровне ОС.
В специализированных программах свои реализации, например AutoCAD, LibreCAD (выбор команды и координаты можно задавать с клавиатуры, часто это удобнее, чем мышкой).
Запись формул в Writer или Tex в текстовом виде по сравнению с тыканьем в иконки в MS Word. Между прочим, специально проверял, где-то тут на форуме есть результат:
https://www.cyberforum.ru/cgi-bin/latex.cgi?y=\lim_{x\rightarrow 0} {\frac{sin x}{x}} + \sum_{i=0}^{N} {a_i^{2 \cdot i+1}}
tex: 35 сек y=\lim_{x\rightarrow 0} {\frac{sin x}{x}} + \sum_{i=0}^{N} {a_i^{2 \cdot i+1}}
writer: 30 сек y=lim from {x->0} {{sin x}over x} + sum from {i=0} to {N} {a_i^{2 cdot i +1}}
word: 60 сек
Ну и так далее.
1
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
18.01.2020, 14:41 56
Цитата Сообщение от sharpey Посмотреть сообщение
Вы отладку делаете функциональными клавишами и их сочетаниями (F5, F7, F8, Shift+F5 и т.п.) или жмакаете на иконки в инструментальной панели?
Можно кнопками клавиатуры или экраными на панели инструментов. Как удобнее.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Через код, естественно, без отладчика.
Речь про аппаратный отладчик если не забыли.
Вы писали про GDB и отладку консольными командами.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
bash, zsh и подобные для работы на уровне ОС.
В специализированных программах свои реализации, например AutoCAD, LibreCAD (выбор команды и координаты можно задавать с клавиатуры, часто это удобнее, чем мышкой).
Запись формул в Writer или Tex в текстовом виде по сравнению с тыканьем в иконки в MS Word. Между прочим, специально проверял, где-то тут на форуме есть результат:
И как это связанно с GDB про который шла речь?
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
18.01.2020, 18:11 57
Цитата Сообщение от locm Посмотреть сообщение
Речь про аппаратный отладчик если не забыли.
Угу, вот только не про использование, а про необходимость. Которой нет, как видите.
Цитата Сообщение от locm Посмотреть сообщение
И как это связанно с GDB про который шла речь?
Никак, естественно. Вопрос-то был про GUI vs CLI.
1
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
18.01.2020, 18:22 58
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Угу, вот только не про использование, а про необходимость. Которой нет, как видите.
Нет? Вот объясните ТС как пошагово выполнить код вашим методом чтобы найти место где он выполняется не так как должен? Выводить в USART номер каждой строки не самое лучшее решение. Это не очень наглядно и требует добавления кода в каждую строку. После отладки этот код становится не нужен и программу придется чистить от него.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Никак, естественно. Вопрос-то был про GUI vs CLI.
Тогда зачем было об этом писать?
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
18.01.2020, 19:50 59
Цитата Сообщение от locm Посмотреть сообщение
Нет? Вот объясните ТС как пошагово выполнить код вашим методом чтобы найти место где он выполняется не так как должен?
Вы уже в который раз требуете от меня что-то реализовать вашим способом. Не поверите, если бы я считал вашу точку зрения единственно верной, я бы с ней не спорил.
А про отладку уже говорили - отладочный вывод (хотя бы зажигание светодиода) в ключевых точках.
Цитата Сообщение от locm Посмотреть сообщение
Тогда зачем было об этом писать?
Везде перед своим ответом я привожу цитату, на которую отвечаю.
1
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
18.01.2020, 20:01 60
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А про отладку уже говорили - отладочный вывод (хотя бы зажигание светодиода) в ключевых точках.
Неэффективно по времени и ресурсах.
Вы предлагаете изучать предметы на ощупь с закрытыми глазами, а же предлагаю на них смотреть. Это более информативно и проще понять что перед нами.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Везде перед своим ответом я привожу цитату, на которую отвечаю.
Это не ответ на мой вопрос.
1
18.01.2020, 20:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2020, 20:01
Помогаю со студенческими работами здесь

Архивирование записей из БД, через определённый промежуток времени. Как лучше сделать?
Предположим есть БД, в которую сервер сливает данные из большого кол-ва однотипных источников....

Как изменить фоновое изображение формы через какой-то промежуток времени?
Как изменить фоновое изображение формы в С# через какой то промежуток времени

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

Как сделать так чтобы диалоговое окно закрывалось через определенный промежуток времени?
Как сделать так что бы диалоговое окно закрывалось через определенный промежуток времени ? К...

Как сделать так чтобы картинка могла меняться через определенный промежуток времени?
как сделать так чтобы картинка могла меняться через определенный промежуток времени на C# Windows...

Как сделать, чтобы текст выводился поочередно буква за буквой через определенный промежуток времени?
Еще раз доброго времени суток! Задача такая: есть текст, который нужно выводить плавно, буква за...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru