если тебе нужна единичная и непериодическая задержка, тогда да, перед запуском таймера нужно обнулить его счетные регистры. Но в данной программе тебе нужно периодически отсчитывать одни и теже интервалы. Значит настраиваешь таймер на сработку прерываний на нужный интервал, и при каждом срабатывании счетный регистр будет автоматически обнуляться. Для того чтоб он сам обнулялся нужно использовать прерывания либо по переполнению счетчика, либо по совпадению но в режиме СТС.
в твоей программе есть задержки 150 и 1000мкс. можно настроить таймер на сработку 1 раз в 50мкс, а внутри прерывания вставить такое
Код:
х++: if(x== ) x=0; switch (x) { case __: тут зажигаешь первый режим светофора break; . . тут по очереди зажигаешь остальные режимы светофора . . case __: тут зажигаешь последний режим светофора break; }
конкретные, нужные тебе значения х - посчитай сам. переменная х должна быть либо глобальной. или локальной но static.
Подскажите, что я делаю не так? Вот счетчик нажатий кнопки: У меня такая задача: задержки как можно меньше (должно успевать считать быстро), но не использовать прерываний.
Код:
if (PIND.3==1) { delay_ms(10); if (PIND.3==1) { while(PIND.3==1) {}; // ожидание отпускания кнопки sw2=sw2+1; delay_ms(15); } }
В Proteus работает правильно, а в железе реально: если кнопку держать - считает бесконечное количество раз (пока держится кнопка). Почему так, из-за дребезга?
Вместо кнопки реально будет фотодиод оптического датчика, подключенный вот таким образом: http://easyelectronics.ru/img/starters/fotodetector/fotodetect.GIF Но изменение его яркости будет достаточно резкое, по этому сильного "дребезга" в этом случае надеюсь не будет.
_________________ Не променяю медь на ржавую несгорайку!
Программу светофора я запустил, таймер тикает раз в секунду. Но вот я нажал кнопку, цикл остановился, а таймер дальше считает. Получается, что перед повторным запуском цикла (нажатии другой кнопки) таймер будет считать не с нуля а с некоторого значения. Вот мне и нужно перезапустить таймер, чтобы счет начался сначала.
P.S.
Может я что-то не правильно понял в работе таймера, поправьте если что...
_________________ Опыт растет прямо пропорционально выведенному из строя оборудованию...
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
КАШАК Все правильно понял. А из того что я писал выше чтото понял? там описано что тебе нужно. в твоем случаи обнулять ничего не нужно. таймер считает сам по себе, и когда отсчитывает нужный кусок времени, срабатывает прерывание, в обработчике которого ты зажигаешь нужные лампочки. а таймер в это время, сам обнуляется, и начинает считать с нуля. И когда снова отсчитывает заданный интервал, снова происходит прерывание, в котором ты загигаешь уже другие лампочки, а таймер обнуляется и тикает дальше. И снова все повторяется по кругку. Единственное что тебе нужно сделать чтоб таймер сам обнулялся, это настроить его в режим СТС. Если ты используешь прерывание по переполнению, то СТС ненужен.
Написал небольшую програмку для расчета времени задержки таймера. Кому интересно, качайте AVR_Калькулятор (обменник бесплатный, никакого времени ожидания, кодов и т.п.)
_________________ Опыт растет прямо пропорционально выведенному из строя оборудованию...
Молодец если раньше программировать не пробовал, то очень не плохо за три дня разобрался. я буксовал на этом этапе месяц По проге я бы сделал так. во первых повесил бы все лампочки на один порт, на 3 младших разряда. таймер настроил бы на прерывание на самый маленький интервал, и кучу if заменил бы на один switch. переменную а обнулять можно тоже в этом же switch
Код:
switch (a) { case 0: PORTA=0b00000xxx; break; case __: PORTA=0b00000xxx; break; case __: PORTA=0b00000xxx; break; case (__ || __): PORTA=0b00000xxx; break; case (__ || __ || __ || __.....): PORTA=0b00000xxx; break; case __: а=0; }
С кнопками тоже можно чтото оптимизировать. но у тебя и у самого не плохо получается
До этого контроллеры вообще не программировал, писал только на С++ Вот и программку по быстрому сделал, чтобы с калькулятором не сидеть Ваши замечания обязательно учту. А на лампочки на разные порты повесил, чтобы в Proteus удобнее собирать было . Теперь хотелось бы научиться работать с ШИМ и АЦП...
_________________ Опыт растет прямо пропорционально выведенному из строя оборудованию...
Ну раз Си знаешь, это хорошо. Тогда многое из того что я говорю для тебя должно быть прописной истиной. Я вообще понятия не имел о языке, и контроллерах. исходник что на Си, что на асме был для меня набором букв и цифр.
увлекся твоим светофором, как своим работа шим и ацр расписана в книге в подписи. хоть эта книга является справочником, а не обучалкой, но прочтя её сразу понимаешь что как работает, в каком регистре какой бит установить, чтоб контроллер начал делать то что тебе нужно. Еще на сайте у дихалта посмотри. там вообще все на пальцах и с картинками. единственно что он делает на примере ассемблера, но суть понять можно.
возвращаясь к твоей программе. тебе нужно полностью избавится от delay. сделать это очень просто, я писал выше как. Сейчас у тебя получается, что если нажать кнопку когда контроллер отрабатывает delay то она не сработает. Опиши с указанием времени полный цикл работы светофора, и я набросаю прогу вообще без delay , if. , for. будет один единственный switch с 4-5 case.
switch (a) { case 0: 2 зелёных и один красный вкл; break; case (10||12||14||16||18): Зелёные вкл, красный вкл; break; case (11||13||15||17||19): Зелёные выкл; break; case 20: Красный и зелёный выкл, 3 жёлтых вкл; break; case 30: Жёлтые выкл, 2 красных и один зелёный вкл. break; case (40||42||44||46||48): Зелёный , 2 красных вкл. break; case (41||43||45||47||49): Зелёный выкл break; case 50: Красный и зелёный выкл, 3 жёлтых вкл; break; case 60: а=0; break; }
если лампочки повесишь на один порт, то код стает минимальным.
switch (a) { // PORTA=0b0ygrgrgr case 0: PORTA=0b00101001; break; case 10: case 14: case 18: PORTA=0b00000001; break; case 12: case 16: PORTA=0b00101001; break; case 20: PORTA=0b01000000; break; case 30: PORTA=0b00100101; break; case 40: case 44: case 48: PORTA=0b00000101; break; case 42: case 46: PORTA=0b00100100; break; case 50: PORTA=0b01000000; break; case 60: a=0; }
_________________ Опыт растет прямо пропорционально выведенному из строя оборудованию...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения