Dimon456, насколько я понял ARV, вопрос в том, можно ли погасить светодиод при нажатой кнопке...
И в общем случае ответ - нет. А если последовательно с кнопкой включить резистор, в несколько раз меньший сопротивления при светодиоде (но такой, который не сожжет порт МК при выводе единички в порт), то можно.
А так - да, задача решаема динамическим опросом состояния кнопки.
Я в больнице, ищите мои сообщения на этом форуме и на easyelectronics.ru. Demiurg1978. Есть видео некоторых моих поделок на ютубе. Во всех проектах я использую описанный подход. Вкратце, логическое разделение на модули, автоматное программирование, дробление всех процессов. Условиями, флагами, состояниями. Суть, все процессы дробятся, чтобы итерация основного цикла с запасом выполнялась за один системный тик. И да, программные таймеры. Последнюю версию я выложил в сообществе easyelectronics.ru. ссылка
а в теме все время ведутся разговоры про таймеры и, соответственно, про прерывания от таймеров.
для данной простой задачи не надо быть гением.
мне это видится так:
все необходимые тайминги отсчитываем программно, с помощью той же _delay(us).
для мигания диода с частотой 100 Гц отсчитываем по 10 мс и переключаем выход диода.
одновременно увеличиваем счетчик переключений диода.
когда счетчик набрал 100 (1 секунду), счетчик сбрасываем и начинаем отправлять телеграмму по NEC-протоколу.
внутри передачи протокола продолжаем рассчитывать тайминги программно.
если передача всей телеграммы занимает больше 10 мс, то по прошествии очередных 10 мс в соответствующих местах переключаем выход диода. и так каждые 10 мс, пока не передадим весь пакет. и во время передачи пакета не забываем увеличивать счетчик переключений диода (по 10 мс который).
после окончания передачи пакета переходим на цикл только управления диодом.
ВСЁ! и никаких прерываний нет вообще!
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
да все верно вы, Starichok51, говорите, только вот подсчитать точные тайминги операторов Си далеко не тривиальная задача. да и бессмысленная, ибо другой компилятор (даже другая версия того же) сведет все старания к нулю.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
[uquote="ARV",url="/forum/viewtopic.php?p=3687495#p3687495"]да все верно вы, Starichok51, говорите, только вот подсчитать точные тайминги операторов Си далеко не тривиальная задача. да и бессмысленная, ибо другой компилятор (даже другая версия того же) сведет все старания к нулю.[/uquote]
Посмотрите мой пример. Там есть вариант использования программных таймеров без прерывания. Главное условие дробление процессов. Тогда разбег на единицы, десятки и даже сотню мкс не критичны. Программные таймеры используются в некритичных модулях. Опрос кнопок, помигать светодиодов, обновление дисплея. А это все человеко интерфейсы.
Starichok51, И использование таймера не обязательно тянет за собой прерывание....
Можно в цикле просто отлавливать флаг события таймера.. На асме это вообще в две команды укладывается - SBRS, RJMP....
Потому что отсчитывать тайминги - задача неблагодарная. Реализуема только на асме. И с трудом расширяема.
Принцип бесконечного цикла с периодичностью "системного тика" и дроблением задач на атомарные короткие участки в этом плане более красив и удобен. Особенно, если писать на каком то ЯВУ, что большинству удобнее и проще (да, я знаю вашу позицию про асм и ЯВУ на МК).
Опрос кнопок и вывод инфы - человекозависимы.
А отправка команд по протоколу пульта - хоть и с допусками, но все же достаточно жесткая в плане таймингов.
Мигание светодиодом в 100 герц тоже должно придерживаться этих 100 герц....
Никто не спорит по поводу подходов к программированию. Мало того, разные позиции приветствуются.
Просто в этом случае выдерживать достаточно жесткие тайминги, отсчитывая такты, как мне кажется, будет менее удобно, нежели иметь какое то периодическое событие, к которому можно привязаться.
А а вообще - эта задача сильно похожа на сферического коня в вакууме....
И топикстартер слился еще 2 дня назад.... Даже не указав, на каком языке ему нужно реализовать задачу, с какой точностью и т.д.
Алгоритмов ему уже накидали вагон.
спасибо, не надо я для себя выбор сделал давно, и менять его не собираюсь: бритва Оккама. пользуйтесь ею, и 99% вопросов вам задавать не захочется вообще, а значит, и искать ответы на них.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
[uquote="goldenandy",url="/forum/viewtopic.php?p=3687525#p3687525"]Starichok51, И использование таймера не обязательно тянет за собой прерывание....[/uquote]
Не увидел в предложенном алгоритме прерываний, пока это единственное нормальное предложение, согласно требовариям ТС:
ВСЁ! и никаких прерываний нет вообще!
думаю и не сферический конь, судя по коментарию в программе ТС:
указание на каком языке тоже есть в первом посте - явно си и диалект тоже понятен по инклудам.
В данном си можно легко использовать ассемблерные подпрограммы, как - достаточно посмотреть, например исходники японца Чена (тот который всемирно известный FatFs)
з.ы. тоже бы слился, будучи новичком, прочитав коменты местных "умников" не по теме
goldenandy писал(а):Можно в цикле просто отлавливать флаг события таймера.
именно использование флага события таймера приведено в исходнике работающей программы в первом посте. я даже разглядел в этом исходнике два таймера. но почему-то ТС не устраивает эта работающая программа.
goldenandy писал(а):отсчитывать тайминги - задача неблагодарная
я прекрасно это понимаю. но без прерываний по таймеру я другого пути не вижу.
ребята, задания, выдаваемые в учебном процессе, иногда, прямо скажем, выглядят идиотскими. но учебный процесс призван развивать сообразительность и умение логически мыслить.
понятно, что данное задание противоречит здравому смыслу при решении подобных задач. использование таймеров позволяет решить эту задачу без проблем, что мы и видим в исходнике из первого поста. поэтому не остается ничего другого, как отрабатывать каждый тайминг программным способом.
да, Си и компиляторы не позволяют точно отрабатывать задержки (тайминги). но и в условии задачи не оговорена точность выдерживания временных интервалов.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Воть чего я всегда нявчу - алгоритм подбирается ПОД КОНКРЕТНУЮ СХЕМКУ И ЗАДАЧУ.
Иначе будет огроменное количество правильных решений со таким же количеством спорящих о том,
что лучше.
(при том, что каждый из участников обсуждения предлагает правильное решение).
oleg110592, обычно если задача практическая - то человек описывает, что ему нужно и для каких целей. А не просто вопрос- как сделать это и это при таких условиях.
Ибо вообще какая то непонятка. Пульт от 100этажного лифта? Зачем там светодиод 100 гц передача команды по НЕК-протоколу?
Ладно, это внешний ИК-пульт управления с вводом числа от 1 до 100 и отправки этого по нек протоколу.
Зачем тогда еще 100 гц мигание?
И если это ИК-пульт (иначе зачем модуляция 36 кгц и протокол НЕК), то как , чемодан с батарейками прилагается в комплекте? оно ж от 5 вольт да на 8 мгц жрать будет 10-15 ма....
Вобщем, с учетом отсутствия подробностей и ТЗ - задача - сферический пульт в вакууме.
Добавлено after 6 minutes 42 seconds:
Из того что я понял из вопроса топикстартера - как в его готовый листинг вкорячить еще мигание 100 гц....
И, кстати, в задаче не 2 параллельных процесса, а 3.
Мигание 100 гц, опрос кнопок, отправка кода кнопки по НЕКу
[uquote="goldenandy",url="/forum/viewtopic.php?p=3687603#p3687603"]обычно если задача практическая - то человек описывает, что ему нужно и для каких целей[/uquote]
задача тоже описана - имхо не практическая (см. 2 пост ТС):
я учусь в освоении AVR, не все идеально, но я и не претендую на звание "гуру м/к"
начинающему простительно неумение написать четкое Т.З., задача "умников" помочь, и в этом тоже (имхо)
oleg110592 писал(а):задача "умников" помочь, и в этом тоже (имхо)
в таком случае это, хоть и несколько грубо, было сделано в первом же ответе топикстартеру: не маяться дурью и использовать прерывания. в таком ключе ТЗ делает задачу не простой, а очень простой.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
[uquote="BOB51",url="/forum/viewtopic.php?p=3687601#p3687601"]Воть чего я всегда нявчу - алгоритм подбирается ПОД КОНКРЕТНУЮ СХЕМКУ И ЗАДАЧУ.[/uquote]
На практике, любой проект базируется на уже имеющихся наработках. Чем универсальней эти наработки - тем быстрее реализуется проект, меньше его себестоимость, а значит больше шансы выиграть в тендере. При московских расценках в 2-3 тыс. рублей без НДС за час работы разаработчика, каждый час имеет значение для клиента.
Вот человек хочет научиться.
Похвально.
Не хочет использовать прерывания. Может, боится... Или не умеет... (Или таки это лабораторка и прихоть препода)
Но зачем тогда подключать interrupt.h и разрешать прерывания sei() при запуске ?!
По алгоритму много вопросов... Слать нек-команды каждую секунду все время или только при нажатой кнопке?
Если слать все время, а кнопка не нажата - что слать? И т.д.
И писать надо честно.
Если хочу научиться - то надо или обосновать запрет прерываний (не умею, боюсь, нужны для другой задачи) или честно сказать - вот препод озадачил.... я нек осилил, а как 100 гц прикрутить - не знаю....
А так - не понятно... Тут уже накидали идей. Как с прерываниями, так и без. И на просчетах таймингов и большом цикле.
Пусть ТС отзовется и решает, что ему надо. А то общественность переживает.