2 цикла одновременно
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
2 цикла одновременно
хочу сделать на АВР чтоб один светодиод постоянно мигал и совместо выполнялся другой код
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: 2 цикла одновременно
похвальное желание
только тут стариков Хоттабычей и волшебных Щук нет, так что только рассказывать о своих хотелках маловато будет...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="ARV",url="/forum/viewtopic.php?p=3448806#p3448806"]похвальное желание
только тут стариков Хоттабычей и волшебных Щук нет, так что только рассказывать о своих хотелках маловато будет...[/uquote]
мне лишь подсказка нужна)) как это сделать через таймеры ? или прерывания
мне лишь подсказка нужна)) как это сделать через таймеры ? или прерывания
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: 2 цикла одновременно
ну само собой через таймеры и прерывания (хотя если это увидит досикус, он обязательно скжажет через DMA без прерываний).
настройте таймер на нужный вам интервал мигания, в обработчике прерываний этого таймера пропишите изменение состояния бита, соответствующего порту вашего светодиода, вот и все. а в главном цикле делайте, что вам хочется - вот и выйдет два цикла параллельно
настройте таймер на нужный вам интервал мигания, в обработчике прерываний этого таймера пропишите изменение состояния бита, соответствующего порту вашего светодиода, вот и все. а в главном цикле делайте, что вам хочется - вот и выйдет два цикла параллельно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: 2 цикла одновременно
Вариант:
Код: Выделить всё
while(1)
{
PORTx.y= ~PORTx.y; // изменяем состояние светодиода, т.е. мигаем
function(); // другой код
}
Docendo discimus
- Реклама
Re: 2 цикла одновременно
Подключите светодиод к выходу таймера. При этом таймер работает сам по себе, а программа работает сама по себе. Таймер и программа не пересекаются.)) И никаких прерываний))danilka468 писал(а):чтоб один светодиод постоянно мигал и совместо выполнялся другой код
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="roman.com",url="/forum/viewtopic.php?p=3449002#p3449002"]
таймер можно подключить к любой ноге?
Подключите светодиод к выходу таймера. При этом таймер работает сам по себе, а программа работает сама по себе. Таймер и программа не пересекаются.)) И никаких прерываний))[/uquote]danilka468 писал(а):чтоб один светодиод постоянно мигал и совместо выполнялся другой код
таймер можно подключить к любой ноге?
Re: 2 цикла одновременно
Нет, не к любой, а только к тем что обозначены на схеме. Например в самой дешёвой atmega48 таймеров три штуки. У каждого таймера два вывода. Значит, всего можно подключить шесть светодиодов.
У других МК выводы соответственно будут другие.
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="roman.com",url="/forum/viewtopic.php?p=3449069#p3449069"]Нет, не к любой, а только к тем что обозначены на схеме. Например в самой дешёвой atmega48 таймеров три штуки. У каждого таймера два вывода. Значит, всего можно подключить шесть светодиодов.
У других МК выводы соответственно будут другие.[/uquote]
где прочесть про выводы таймера у мк?
где прочесть про выводы таймера у мк?
- musor
- Друг Кота
- Сообщения: 39197
- Зарегистрирован: Сб сен 13, 2014 16:27:32
- Откуда: СпиртоГонск созвездия Омега
Re: 2 цикла одновременно
в датшитах вестимо....
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="musor",url="/forum/viewtopic.php?p=3449101#p3449101"]в датшитах вестимо....[/uquote]
это T0 T1 C1 C2???
это T0 T1 C1 C2???
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: 2 цикла одновременно
Не майтесь ерундой: аппаратный способ мигания в данном случае не универсальный. По прерываниям можно мигать любой ножкой МК, и не только. Это универсальный способ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="ARV",url="/forum/viewtopic.php?p=3449132#p3449132"]Не майтесь ерундой: аппаратный способ мигания в данном случае не универсальный. По прерываниям можно мигать любой ножкой МК, и не только. Это универсальный способ.[/uquote]
как это сделать?
как это сделать?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: 2 цикла одновременно
Я ранее вам писал, как.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="ARV",url="/forum/viewtopic.php?p=3449315#p3449315"]Я ранее вам писал, как.[/uquote]
тоесть с помощью прерывания я могу сделать :
мигает постоянно светодиод->выполняется другой код
и светодиод не гаснет когда выполняется код
тоесть с помощью прерывания я могу сделать :
мигает постоянно светодиод->выполняется другой код
и светодиод не гаснет когда выполняется код
Re: 2 цикла одновременно
Конечно можно.
И даже много больше того - учите, книжи читайте, пробуйте на макетах.

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

И даже много больше того - учите, книжи читайте, пробуйте на макетах.
Только ежли конкретную консультации просить - уж соизвольте и схемку и текст всей прожки и описание хотелок прикладывать.
Re: 2 цикла одновременно
Мигание светодиода состоит из двух команд: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
Правда на видео есть некоторые неточности... но для общего понимания процесса пойдёт))
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: 2 цикла одновременно
не факт. с точки зрения языка Си это может быть и одна команда "изменить уровень пина", что-то типа PORTB ^= LED_PIN; с точки зрения архитектуры это так же может быть одна ассемблерная команда с тем же смыслом.roman.com писал(а):Мигание светодиода состоит из двух команд:
1- команда Включить светодиод.
2- команда Выключить светодиод.
и мигание светодиода меняется при любых изменениях в "остальной части" кода.roman.com писал(а):При этом выполняется и основная программа и одновременно мигает светодиод.
можно с большой долей вероятности предположить, что вы придумали какую-то странную программу.roman.com писал(а):А если программа работает с точностью до машинного такта...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: 2 цикла одновременно
Не зависит, если главный цикл привязан к таймеру:ARV писал(а):и мигание светодиода меняется при любых изменениях в "остальной части" кода.
while (1) { // начало главного цикла
...
while (!(TIFR & 0b00100000)); // ждём флаг переполнения таймера.
TIFR|=0b00100000; // сброс флага.
...
PORTB.1= ~PORTB.1; // мигаем светодиодом.
...
... // "основная программа"
...
}; // конец главного цикла
Если "основная программа" выполняется быстрей, чем переполнится таймер, то светодиод мигает с постоянной частотой (+/- 1 такт на опрос флага таймера). Если мы не знаем сколько тактов быдет выполняться основная программа, значит мы не сможем точно "подогнать" такты... А значит на выходе получим джиттер (несколько тактов). Но думаю для светодиода это не критично))
тайминги... тайминги... тайминги...))
Программа обычная... ))ARV писал(а):вы придумали какую-то странную программу.
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="roman.com",url="/forum/viewtopic.php?p=3449487#p3449487"]
while (1) { // начало главного цикла
...
while (!(TIFR & 0b00100000)); // ждём флаг переполнения таймера.
TIFR|=0b00100000; // сброс флага.
...
PORTB.1= ~PORTB.1; // мигаем светодиодом.
...
... // "основная программа"
...
}; // конец главного цикла
Если "основная программа" выполняется быстрей, чем переполнится таймер, то светодиод мигает с постоянной частотой (+/- 1 такт на опрос флага таймера). Если мы не знаем сколько тактов быдет выполняться основная программа, значит мы не сможем точно "подогнать" такты... А значит на выходе получим джиттер (несколько тактов). Но думаю для светодиода это не критично))
тайминги... тайминги... тайминги...))
Например программный интерфейс. Синхронная передача/приём данных. Задержка в один такт - ошибка передачи/приёма данных. Ну каждый извращается по своему...))
Нафига это? Ну просто частота у AVR маленькая... Это вам не оверсемплинг на ПЛИС...))[/uquote]
а если просто подключить interrupt?
Не зависит, если главный цикл привязан к таймеру:ARV писал(а):и мигание светодиода меняется при любых изменениях в "остальной части" кода.
while (1) { // начало главного цикла
...
while (!(TIFR & 0b00100000)); // ждём флаг переполнения таймера.
TIFR|=0b00100000; // сброс флага.
...
PORTB.1= ~PORTB.1; // мигаем светодиодом.
...
... // "основная программа"
...
}; // конец главного цикла
Если "основная программа" выполняется быстрей, чем переполнится таймер, то светодиод мигает с постоянной частотой (+/- 1 такт на опрос флага таймера). Если мы не знаем сколько тактов быдет выполняться основная программа, значит мы не сможем точно "подогнать" такты... А значит на выходе получим джиттер (несколько тактов). Но думаю для светодиода это не критично))
тайминги... тайминги... тайминги...))
Программа обычная... ))ARV писал(а):вы придумали какую-то странную программу.
а если просто подключить interrupt?


