Обсуждаем контроллеры компании Atmel.
Ответить

Re: Параллельные задачи в ATmega8

Чт авг 22, 2019 18:49:39

Dimon456, насколько я понял ARV, вопрос в том, можно ли погасить светодиод при нажатой кнопке...
И в общем случае ответ - нет. А если последовательно с кнопкой включить резистор, в несколько раз меньший сопротивления при светодиоде (но такой, который не сожжет порт МК при выводе единички в порт), то можно.

А так - да, задача решаема динамическим опросом состояния кнопки.

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 07:20:59

Я в больнице, ищите мои сообщения на этом форуме и на easyelectronics.ru. Demiurg1978. Есть видео некоторых моих поделок на ютубе. Во всех проектах я использую описанный подход. Вкратце, логическое разделение на модули, автоматное программирование, дробление всех процессов. Условиями, флагами, состояниями. Суть, все процессы дробятся, чтобы итерация основного цикла с запасом выполнялась за один системный тик. И да, программные таймеры. Последнюю версию я выложил в сообществе easyelectronics.ru. ссылка

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 07:40:54

читаем первый пост.
Запрещено использовать прерывания.
а в теме все время ведутся разговоры про таймеры и, соответственно, про прерывания от таймеров.
для данной простой задачи не надо быть гением.
мне это видится так:
все необходимые тайминги отсчитываем программно, с помощью той же _delay(us).
для мигания диода с частотой 100 Гц отсчитываем по 10 мс и переключаем выход диода.
одновременно увеличиваем счетчик переключений диода.
когда счетчик набрал 100 (1 секунду), счетчик сбрасываем и начинаем отправлять телеграмму по NEC-протоколу.
внутри передачи протокола продолжаем рассчитывать тайминги программно.
если передача всей телеграммы занимает больше 10 мс, то по прошествии очередных 10 мс в соответствующих местах переключаем выход диода. и так каждые 10 мс, пока не передадим весь пакет. и во время передачи пакета не забываем увеличивать счетчик переключений диода (по 10 мс который).
после окончания передачи пакета переходим на цикл только управления диодом.
ВСЁ! и никаких прерываний нет вообще!

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 07:55:42

да все верно вы, Starichok51, говорите, только вот подсчитать точные тайминги операторов Си далеко не тривиальная задача. да и бессмысленная, ибо другой компилятор (даже другая версия того же) сведет все старания к нулю.

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 08:39:00

да все верно вы, Starichok51, говорите, только вот подсчитать точные тайминги операторов Си далеко не тривиальная задача. да и бессмысленная, ибо другой компилятор (даже другая версия того же) сведет все старания к нулю.

Посмотрите мой пример. Там есть вариант использования программных таймеров без прерывания. Главное условие дробление процессов. Тогда разбег на единицы, десятки и даже сотню мкс не критичны. Программные таймеры используются в некритичных модулях. Опрос кнопок, помигать светодиодов, обновление дисплея. А это все человеко интерфейсы.

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 09:02:34

Starichok51, И использование таймера не обязательно тянет за собой прерывание....
Можно в цикле просто отлавливать флаг события таймера.. На асме это вообще в две команды укладывается - SBRS, RJMP....

Потому что отсчитывать тайминги - задача неблагодарная. Реализуема только на асме. И с трудом расширяема.
Принцип бесконечного цикла с периодичностью "системного тика" и дроблением задач на атомарные короткие участки в этом плане более красив и удобен. Особенно, если писать на каком то ЯВУ, что большинству удобнее и проще (да, я знаю вашу позицию про асм и ЯВУ на МК).

Опрос кнопок и вывод инфы - человекозависимы.
А отправка команд по протоколу пульта - хоть и с допусками, но все же достаточно жесткая в плане таймингов.
Мигание светодиодом в 100 герц тоже должно придерживаться этих 100 герц....

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

А а вообще - эта задача сильно похожа на сферического коня в вакууме....

И топикстартер слился еще 2 дня назад.... Даже не указав, на каком языке ему нужно реализовать задачу, с какой точностью и т.д.
Алгоритмов ему уже накидали вагон.

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 09:34:54

Demiurg писал(а):Посмотрите мой пример.
спасибо, не надо :) я для себя выбор сделал давно, и менять его не собираюсь: бритва Оккама. пользуйтесь ею, и 99% вопросов вам задавать не захочется вообще, а значит, и искать ответы на них.

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 09:49:05

Starichok51, И использование таймера не обязательно тянет за собой прерывание....

Не увидел в предложенном алгоритме прерываний, пока это единственное нормальное предложение, согласно требовариям ТС:
ВСЁ! и никаких прерываний нет вообще!

думаю и не сферический конь, судя по коментарию в программе ТС:
Код:
//вычисление номера этажа

указание на каком языке тоже есть в первом посте - явно си и диалект тоже понятен по инклудам.
В данном си можно легко использовать ассемблерные подпрограммы, как - достаточно посмотреть, например исходники японца Чена (тот который всемирно известный FatFs)
з.ы. тоже бы слился, будучи новичком, прочитав коменты местных "умников" не по теме

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 10:34:35

oleg110592 писал(а):з.ы. тоже бы слился, будучи новичком, прочитав коменты местных "умников" не по теме
зато какова теперь закалка, а? ;) согласитесь, что вам теперь и черт не брат.

извините за оффтоп - не удержался.

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 11:09:17

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

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 11:21:45

Воть чего я всегда нявчу - алгоритм подбирается ПОД КОНКРЕТНУЮ СХЕМКУ И ЗАДАЧУ.
Иначе будет огроменное количество правильных решений со таким же количеством спорящих о том,
что лучше.
(при том, что каждый из участников обсуждения предлагает правильное решение).
:beer: :music:

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 11:29:50

oleg110592, обычно если задача практическая - то человек описывает, что ему нужно и для каких целей. А не просто вопрос- как сделать это и это при таких условиях.

Ибо вообще какая то непонятка. Пульт от 100этажного лифта? Зачем там светодиод 100 гц передача команды по НЕК-протоколу?
Ладно, это внешний ИК-пульт управления с вводом числа от 1 до 100 и отправки этого по нек протоколу.
Зачем тогда еще 100 гц мигание?

И если это ИК-пульт (иначе зачем модуляция 36 кгц и протокол НЕК), то как , чемодан с батарейками прилагается в комплекте? оно ж от 5 вольт да на 8 мгц жрать будет 10-15 ма....

Вобщем, с учетом отсутствия подробностей и ТЗ - задача - сферический пульт в вакууме.

Добавлено after 6 minutes 42 seconds:
Из того что я понял из вопроса топикстартера - как в его готовый листинг вкорячить еще мигание 100 гц....

И, кстати, в задаче не 2 параллельных процесса, а 3.
Мигание 100 гц, опрос кнопок, отправка кода кнопки по НЕКу

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 11:34:31

обычно если задача практическая - то человек описывает, что ему нужно и для каких целей

задача тоже описана - имхо не практическая (см. 2 пост ТС):
я учусь в освоении AVR, не все идеально, но я и не претендую на звание "гуру м/к"

начинающему простительно неумение написать четкое Т.З., задача "умников" помочь, и в этом тоже (имхо)

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 11:45:26

oleg110592 писал(а):задача "умников" помочь, и в этом тоже (имхо)
в таком случае это, хоть и несколько грубо, было сделано в первом же ответе топикстартеру: не маяться дурью и использовать прерывания. в таком ключе ТЗ делает задачу не простой, а очень простой.

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 11:47:11

Воть чего я всегда нявчу - алгоритм подбирается ПОД КОНКРЕТНУЮ СХЕМКУ И ЗАДАЧУ.

На практике, любой проект базируется на уже имеющихся наработках. Чем универсальней эти наработки - тем быстрее реализуется проект, меньше его себестоимость, а значит больше шансы выиграть в тендере. При московских расценках в 2-3 тыс. рублей без НДС за час работы разаработчика, каждый час имеет значение для клиента.

Re: Параллельные задачи в ATmega8

Пт авг 23, 2019 12:40:44

Вот человек хочет научиться.
Похвально.
Не хочет использовать прерывания. Может, боится... Или не умеет... (Или таки это лабораторка и прихоть препода)
Но зачем тогда подключать interrupt.h и разрешать прерывания sei() при запуске ?!

По алгоритму много вопросов... Слать нек-команды каждую секунду все время или только при нажатой кнопке?
Если слать все время, а кнопка не нажата - что слать? И т.д.

И писать надо честно.
Если хочу научиться - то надо или обосновать запрет прерываний (не умею, боюсь, нужны для другой задачи) или честно сказать - вот препод озадачил.... я нек осилил, а как 100 гц прикрутить - не знаю....
А так - не понятно... Тут уже накидали идей. Как с прерываниями, так и без. И на просчетах таймингов и большом цикле.
Пусть ТС отзовется и решает, что ему надо. А то общественность переживает.
Ответить