Помогите разработать схему для таймера.
1.задача таймера - при нажатии на кнопку управления выдать единичный импульс длиной в t .сек
2. время таймера в пределах от 0,1 до 1 с с шагом 0,1 сек.
3. отфильтровать дребезг кнопки управления
4. можно использовать 2-е кнопки + - и отображать на семисегментном индикаторе время импульса, 0,1 сек - 1, 0,2-2 и т.д. 0 - 1 сек. текущее задание Т можно не запоминать, при включении устройства по умолчанию время Т = 0,2 сек.
Очень важна точность импульса!!!
Реально есть Атмега8л - немного опыта в сборке готовых устройств на Атмеге, но с программированием проблема.
Заранее благодарен.
кнопку я вот так обрабатываю (кнопка висита на 4 ом выводе порта D, активна по нулю, т.е. при нажатии вывод замыкается на землю):
while(!PIND.4)
{
delay_us(50); // дребезг
while(!PIND.4)
{
........
А таймер настроить на нужное время в режиме прерывание при совпадении.
ну и как только нажал кнопку, запускаешь таймер и выставляешь единицу на какой нибудь вывод порта, как только прерывание от таймера произошло, в нем выставляешь ноль на выводе. и таймер можно отключать.
Чтобы таймер работал нужное время, в регистр OCRn нужно записать число, расчитанное по известной формуле.
Спасибо за советы.
Т.к. только учусь наверное "ламерские" вопросы.
Реально собрать такой таймер вообще на МК? В смысле точности временных интервалов.
Я так понял из даташита на атмегу8, что по умолчанию тактовая частота 1 мГц. Хватит ли этой частоты для нормальной работы таймера?
Хочу пока попробовать эмулировать в протеусе без настройки интервалов и индикации, но с одним интервалом.
При тактировании Меги 1Мгц, можно очень точно получить время импульсов, которые нужны.
Ну и вообще я понимаю придется ставить 3 кнопки, на +,- и на запуск импульса.
и еще, думается, что тут можно и без таймера обойтись, используя функцию delay_ms .
нажал на кнопку -> отправил на какой нибудь вывод еденицу -> задержка на нужное время -> выставил нуль.
а задержку увеличивать или уменьшать двумя другими кнопками.
что типа так я думаю:
}
}
while(!PIND.3) //увеличение времени
{
delay_us(50); //дребезг
while(!PIND.3)
{
time_+=100; // увеличили на 0.1с
if time >1000 time_=100; //ето если уже больше секунды, сброситься на начало, вместо 100 можно тысячу, тогда остановиться на 1000 и не будет увеличиваться.
}
}
while(!PIND.2) //уменьшение времени
{
delay_us(50); //дребезг
while(!PIND.2)
{
time_-=100; // уменьшили на 0.1с
if time <=0 time_=1000; //ето если уже меньше нуля, тоже самое, можно на начало либо по кругу на 1000
}
}
Порты взял произвольно. Если при однократном нажатии будет несколько раз срабатывать то можно добавить цикл в каждый обработчик кнопок. так например:
a=0;
while(!PIND.2) //уменьшение времени
{
delay_us(50); //дребезг
while(!PIND.2)
{
if (a==0)
{
time_-=100; // уменьшили на 0.1с
if time <=0 time_=1000; //ето если уже меньше нуля, тоже самое, можно на начало либо по кругу на 1000
}
a=1;
}
}
Собрал таймер пользуясь советами, на индикаторе алс321а и две кнопки + и -, пока только на проводках, буду делать плату. Исходник прилагаю. Кто может гляньте - покритикуйте, всегда можно что-то улучшить. Всем спасибо.