Страница 1 из 3

2 цикла одновременно

Добавлено: Вс сен 02, 2018 14:25:49
danilka468
хочу сделать на АВР чтоб один светодиод постоянно мигал и совместо выполнялся другой код

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 14:32:49
ARV
похвальное желание :) только тут стариков Хоттабычей и волшебных Щук нет, так что только рассказывать о своих хотелках маловато будет...

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 14:38:52
danilka468
[uquote="ARV",url="/forum/viewtopic.php?p=3448806#p3448806"]похвальное желание :) только тут стариков Хоттабычей и волшебных Щук нет, так что только рассказывать о своих хотелках маловато будет...[/uquote]
мне лишь подсказка нужна)) как это сделать через таймеры ? или прерывания

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 14:48:04
ARV
ну само собой через таймеры и прерывания (хотя если это увидит досикус, он обязательно скжажет через DMA без прерываний).
настройте таймер на нужный вам интервал мигания, в обработчике прерываний этого таймера пропишите изменение состояния бита, соответствующего порту вашего светодиода, вот и все. а в главном цикле делайте, что вам хочется - вот и выйдет два цикла параллельно :)))

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 18:17:55
pyzhman
Вариант:

Код: Выделить всё

while(1)
{
PORTx.y= ~PORTx.y; // изменяем состояние светодиода, т.е. мигаем
function(); // другой код
}

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 19:18:23
roman.com
danilka468 писал(а):чтоб один светодиод постоянно мигал и совместо выполнялся другой код
Подключите светодиод к выходу таймера. При этом таймер работает сам по себе, а программа работает сама по себе. Таймер и программа не пересекаются.)) И никаких прерываний))

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 20:01:07
danilka468
[uquote="roman.com",url="/forum/viewtopic.php?p=3449002#p3449002"]
danilka468 писал(а):чтоб один светодиод постоянно мигал и совместо выполнялся другой код
Подключите светодиод к выходу таймера. При этом таймер работает сам по себе, а программа работает сама по себе. Таймер и программа не пересекаются.)) И никаких прерываний))[/uquote]
таймер можно подключить к любой ноге?

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 20:28:06
roman.com
Нет, не к любой, а только к тем что обозначены на схеме. Например в самой дешёвой atmega48 таймеров три штуки. У каждого таймера два вывода. Значит, всего можно подключить шесть светодиодов.
1.jpg
(189.99 КБ) 511 скачиваний
У других МК выводы соответственно будут другие.

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 20:55:12
danilka468
[uquote="roman.com",url="/forum/viewtopic.php?p=3449069#p3449069"]Нет, не к любой, а только к тем что обозначены на схеме. Например в самой дешёвой atmega48 таймеров три штуки. У каждого таймера два вывода. Значит, всего можно подключить шесть светодиодов.
1.jpg
У других МК выводы соответственно будут другие.[/uquote]
где прочесть про выводы таймера у мк?

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 21:09:30
musor
в датшитах вестимо....

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 21:20:02
danilka468
[uquote="musor",url="/forum/viewtopic.php?p=3449101#p3449101"]в датшитах вестимо....[/uquote]
это T0 T1 C1 C2???

Re: 2 цикла одновременно

Добавлено: Вс сен 02, 2018 21:40:17
ARV
Не майтесь ерундой: аппаратный способ мигания в данном случае не универсальный. По прерываниям можно мигать любой ножкой МК, и не только. Это универсальный способ.

Re: 2 цикла одновременно

Добавлено: Пн сен 03, 2018 07:07:35
danilka468
[uquote="ARV",url="/forum/viewtopic.php?p=3449132#p3449132"]Не майтесь ерундой: аппаратный способ мигания в данном случае не универсальный. По прерываниям можно мигать любой ножкой МК, и не только. Это универсальный способ.[/uquote]
как это сделать?

Re: 2 цикла одновременно

Добавлено: Пн сен 03, 2018 07:10:26
ARV
Я ранее вам писал, как.

Re: 2 цикла одновременно

Добавлено: Пн сен 03, 2018 07:48:09
danilka468
[uquote="ARV",url="/forum/viewtopic.php?p=3449315#p3449315"]Я ранее вам писал, как.[/uquote]
тоесть с помощью прерывания я могу сделать :
мигает постоянно светодиод->выполняется другой код
и светодиод не гаснет когда выполняется код

Re: 2 цикла одновременно

Добавлено: Пн сен 03, 2018 08:11:26
BOB51
Конечно можно.
И даже много больше того - учите, книжи читайте, пробуйте на макетах.
8)
Только ежли конкретную консультации просить - уж соизвольте и схемку и текст всей прожки и описание хотелок прикладывать.
:tea:

Re: 2 цикла одновременно

Добавлено: Пн сен 03, 2018 08:46:27
roman.com
danilka468 писал(а):мигает постоянно светодиод->выполняется другой код
Мигание светодиода состоит из двух команд:
1- команда Включить светодиод.
2- команда Выключить светодиод.

Есть несколько способов мигать светодиодом:

1- Мигаем светодиодом в основном цикле программы: Подключаем светодиод к любым выводам МК. Затем добавляем команды в "основную программу": команда 1(Включить светодиод) и команда 2 (Выключить светодиод). При этом выполняется и основная программа и одновременно мигает светодиод.

2- Мигаем светодиодом с помощью таймера: Подключаем светодиод к специальным выводам МК - выводам таймера. При этом выполняется и основная программа и одновременно мигает светодиод. Причём светодиод мигает независимо от основной программы, потому что таймер работает независимо от основной программы)) Даже если основная программа "зависнет" светодиод проделжит мигать))

3- Мигаем светодиодом по прерыванию: Подключаем светодиод к любым выводам МК. Затем добавляем команды в "обработчик прерывания": команда 1(Включить светодиод) и команда 2 (Выключить светодиод). Обработчик прерываний в нашем случае срабатывает по таймеру. При этом выполняется основная программа и одновременно мигает светодиод. Но у этого способа есть недостаток: Когда выполняется команда 1(Включить светодиод) или команда 2 (Выключить светодиод), то в этот самый момент времени основная программа не выполняется.(!)
"Прерывание" - это прерывание основной программы. А если программа работает с точностью до машинного такта...
...
(NOP)
(NOP)
...
, то весь ваш код летит нафиг ! )) :)))

Конечно, можно написать программу с точностью до машинного такта с учётом работы обработчика прерывания... но только это уже будет не программа, а полное извращение... ))) :)))

Если лень читать книжки, то хоть бы видео посмотрели (для общего понимания).
https://www.youtube.com/watch?v=NP1K_jP ... CqLisJl-W6
Тут этих видео целая пачка)) Специально для начинающих. - viewtopic.php?f=57&t=90631
Правда на видео есть некоторые неточности... но для общего понимания процесса пойдёт))

Re: 2 цикла одновременно

Добавлено: Пн сен 03, 2018 11:27:42
ARV
roman.com писал(а):Мигание светодиода состоит из двух команд:
1- команда Включить светодиод.
2- команда Выключить светодиод.
не факт. с точки зрения языка Си это может быть и одна команда "изменить уровень пина", что-то типа PORTB ^= LED_PIN; с точки зрения архитектуры это так же может быть одна ассемблерная команда с тем же смыслом.
roman.com писал(а):При этом выполняется и основная программа и одновременно мигает светодиод.
и мигание светодиода меняется при любых изменениях в "остальной части" кода.
roman.com писал(а):А если программа работает с точностью до машинного такта...
можно с большой долей вероятности предположить, что вы придумали какую-то странную программу.

Re: 2 цикла одновременно

Добавлено: Пн сен 03, 2018 12:48:00
roman.com
ARV писал(а):и мигание светодиода меняется при любых изменениях в "остальной части" кода.
Не зависит, если главный цикл привязан к таймеру:

while (1) { // начало главного цикла
...
while (!(TIFR & 0b00100000)); // ждём флаг переполнения таймера.
TIFR|=0b00100000; // сброс флага.
...
PORTB.1= ~PORTB.1; // мигаем светодиодом.
...
... // "основная программа"
...
}; // конец главного цикла

Если "основная программа" выполняется быстрей, чем переполнится таймер, то светодиод мигает с постоянной частотой (+/- 1 такт на опрос флага таймера). Если мы не знаем сколько тактов быдет выполняться основная программа, значит мы не сможем точно "подогнать" такты... А значит на выходе получим джиттер (несколько тактов). Но думаю для светодиода это не критично))

тайминги... тайминги... тайминги...))
ARV писал(а):вы придумали какую-то странную программу.
Программа обычная... )) :))) Например программный интерфейс. Синхронная передача/приём данных. Задержка в один такт - ошибка передачи/приёма данных. Ну каждый извращается по своему...)) :))) Нафига это? Ну просто частота у AVR маленькая... Это вам не оверсемплинг на ПЛИС...))

Re: 2 цикла одновременно

Добавлено: Вт сен 04, 2018 08:50:08
danilka468
[uquote="roman.com",url="/forum/viewtopic.php?p=3449487#p3449487"]
ARV писал(а):и мигание светодиода меняется при любых изменениях в "остальной части" кода.
Не зависит, если главный цикл привязан к таймеру:

while (1) { // начало главного цикла
...
while (!(TIFR & 0b00100000)); // ждём флаг переполнения таймера.
TIFR|=0b00100000; // сброс флага.
...
PORTB.1= ~PORTB.1; // мигаем светодиодом.
...
... // "основная программа"
...
}; // конец главного цикла

Если "основная программа" выполняется быстрей, чем переполнится таймер, то светодиод мигает с постоянной частотой (+/- 1 такт на опрос флага таймера). Если мы не знаем сколько тактов быдет выполняться основная программа, значит мы не сможем точно "подогнать" такты... А значит на выходе получим джиттер (несколько тактов). Но думаю для светодиода это не критично))

тайминги... тайминги... тайминги...))
ARV писал(а):вы придумали какую-то странную программу.
Программа обычная... )) :))) Например программный интерфейс. Синхронная передача/приём данных. Задержка в один такт - ошибка передачи/приёма данных. Ну каждый извращается по своему...)) :))) Нафига это? Ну просто частота у AVR маленькая... Это вам не оверсемплинг на ПЛИС...))[/uquote]
а если просто подключить interrupt?