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

Обсуждаем контроллеры компании Atmel.
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

хочу сделать на АВР чтоб один светодиод постоянно мигал и совместо выполнялся другой код
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

похвальное желание :) только тут стариков Хоттабычей и волшебных Щук нет, так что только рассказывать о своих хотелках маловато будет...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

[uquote="ARV",url="/forum/viewtopic.php?p=3448806#p3448806"]похвальное желание :) только тут стариков Хоттабычей и волшебных Щук нет, так что только рассказывать о своих хотелках маловато будет...[/uquote]
мне лишь подсказка нужна)) как это сделать через таймеры ? или прерывания
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Вариант:

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

while(1)
{
PORTx.y= ~PORTx.y; // изменяем состояние светодиода, т.е. мигаем
function(); // другой код
}
Docendo discimus
Реклама
roman.com
Друг Кота
Сообщения: 9157
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

danilka468 писал(а):чтоб один светодиод постоянно мигал и совместо выполнялся другой код
Подключите светодиод к выходу таймера. При этом таймер работает сам по себе, а программа работает сама по себе. Таймер и программа не пересекаются.)) И никаких прерываний))
Реклама
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

[uquote="roman.com",url="/forum/viewtopic.php?p=3449002#p3449002"]
danilka468 писал(а):чтоб один светодиод постоянно мигал и совместо выполнялся другой код
Подключите светодиод к выходу таймера. При этом таймер работает сам по себе, а программа работает сама по себе. Таймер и программа не пересекаются.)) И никаких прерываний))[/uquote]
таймер можно подключить к любой ноге?
roman.com
Друг Кота
Сообщения: 9157
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

Нет, не к любой, а только к тем что обозначены на схеме. Например в самой дешёвой atmega48 таймеров три штуки. У каждого таймера два вывода. Значит, всего можно подключить шесть светодиодов.
1.jpg
(189.99 КБ) 509 скачиваний
У других МК выводы соответственно будут другие.
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

[uquote="roman.com",url="/forum/viewtopic.php?p=3449069#p3449069"]Нет, не к любой, а только к тем что обозначены на схеме. Например в самой дешёвой atmega48 таймеров три штуки. У каждого таймера два вывода. Значит, всего можно подключить шесть светодиодов.
1.jpg
У других МК выводы соответственно будут другие.[/uquote]
где прочесть про выводы таймера у мк?
Аватара пользователя
musor
Друг Кота
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

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

Сообщение musor »

в датшитах вестимо....
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

[uquote="musor",url="/forum/viewtopic.php?p=3449101#p3449101"]в датшитах вестимо....[/uquote]
это T0 T1 C1 C2???
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Не майтесь ерундой: аппаратный способ мигания в данном случае не универсальный. По прерываниям можно мигать любой ножкой МК, и не только. Это универсальный способ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

[uquote="ARV",url="/forum/viewtopic.php?p=3449132#p3449132"]Не майтесь ерундой: аппаратный способ мигания в данном случае не универсальный. По прерываниям можно мигать любой ножкой МК, и не только. Это универсальный способ.[/uquote]
как это сделать?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Я ранее вам писал, как.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

[uquote="ARV",url="/forum/viewtopic.php?p=3449315#p3449315"]Я ранее вам писал, как.[/uquote]
тоесть с помощью прерывания я могу сделать :
мигает постоянно светодиод->выполняется другой код
и светодиод не гаснет когда выполняется код
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Конечно можно.
И даже много больше того - учите, книжи читайте, пробуйте на макетах.
8)
Только ежли конкретную консультации просить - уж соизвольте и схемку и текст всей прожки и описание хотелок прикладывать.
:tea:
roman.com
Друг Кота
Сообщения: 9157
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение 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
Правда на видео есть некоторые неточности... но для общего понимания процесса пойдёт))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
roman.com
Друг Кота
Сообщения: 9157
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

ARV писал(а):и мигание светодиода меняется при любых изменениях в "остальной части" кода.
Не зависит, если главный цикл привязан к таймеру:

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

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

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

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

Сообщение 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?
Ответить

Вернуться в «AVR»