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

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

И даже много больше того - учите, книжи читайте, пробуйте на макетах.
Только ежли конкретную консультации просить - уж соизвольте и схемку и текст всей прожки и описание хотелок прикладывать.
Мигание светодиода состоит из двух команд: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
Правда на видео есть некоторые неточности... но для общего понимания процесса пойдёт))
не факт. с точки зрения языка Си это может быть и одна команда "изменить уровень пина", что-то типа PORTB ^= LED_PIN; с точки зрения архитектуры это так же может быть одна ассемблерная команда с тем же смыслом.roman.com писал(а):Мигание светодиода состоит из двух команд:
1- команда Включить светодиод.
2- команда Выключить светодиод.
и мигание светодиода меняется при любых изменениях в "остальной части" кода.roman.com писал(а):При этом выполняется и основная программа и одновременно мигает светодиод.
можно с большой долей вероятности предположить, что вы придумали какую-то странную программу.roman.com писал(а):А если программа работает с точностью до машинного такта...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Не зависит, если главный цикл привязан к таймеру:ARV писал(а):и мигание светодиода меняется при любых изменениях в "остальной части" кода.
while (1) { // начало главного цикла
...
while (!(TIFR & 0b00100000)); // ждём флаг переполнения таймера.
TIFR|=0b00100000; // сброс флага.
...
PORTB.1= ~PORTB.1; // мигаем светодиодом.
...
... // "основная программа"
...
}; // конец главного цикла
Если "основная программа" выполняется быстрей, чем переполнится таймер, то светодиод мигает с постоянной частотой (+/- 1 такт на опрос флага таймера). Если мы не знаем сколько тактов быдет выполняться основная программа, значит мы не сможем точно "подогнать" такты... А значит на выходе получим джиттер (несколько тактов). Но думаю для светодиода это не критично))
тайминги... тайминги... тайминги...))
Программа обычная... ))ARV писал(а):вы придумали какую-то странную программу.
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
[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?


