если тебе нужна единичная и непериодическая задержка, тогда да, перед запуском таймера нужно обнулить его счетные регистры. Но в данной программе тебе нужно периодически отсчитывать одни и теже интервалы. Значит настраиваешь таймер на сработку прерываний на нужный интервал, и при каждом срабатывании счетный регистр будет автоматически обнуляться. Для того чтоб он сам обнулялся нужно использовать прерывания либо по переполнению счетчика, либо по совпадению но в режиме СТС.
в твоей программе есть задержки 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.
Может я что-то не правильно понял в работе таймера, поправьте если что...
_________________ Опыт растет прямо пропорционально выведенному из строя оборудованию...
КАШАК Все правильно понял. А из того что я писал выше чтото понял? там описано что тебе нужно. в твоем случаи обнулять ничего не нужно. таймер считает сам по себе, и когда отсчитывает нужный кусок времени, срабатывает прерывание, в обработчике которого ты зажигаешь нужные лампочки. а таймер в это время, сам обнуляется, и начинает считать с нуля. И когда снова отсчитывает заданный интервал, снова происходит прерывание, в котором ты загигаешь уже другие лампочки, а таймер обнуляется и тикает дальше. И снова все повторяется по кругку. Единственное что тебе нужно сделать чтоб таймер сам обнулялся, это настроить его в режим СТС. Если ты используешь прерывание по переполнению, то СТС ненужен.
Написал небольшую програмку для расчета времени задержки таймера. Кому интересно, качайте 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; }
_________________ Опыт растет прямо пропорционально выведенному из строя оборудованию...
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения