Временная задержка на таймере

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Вт мар 06, 2012 19:59:00

Сообщение Babulesnik »

Приветствую форумчан.Столкнулся с проблемой реализации задержки на таймере.Постараюсь изложить всю суть.По нажатию кнопки необходима временная задержка с высшим приоритетом в 2 сек ,собственно используем прерывание по таймеру.Прерывание в свою очередь дергает ножкой МК.Поблема в том,что мне нужно как-то останавливать таймер после выполнения прерывания,а то у меня постоянно происходит прерывание через ~8сек.Если нажимаю кнопку,все четко,после 2 сек срабатывает прерывание.Тоесть,таймер должен запускаться кнопкой и после выполнения прерывания останавливаться.Пробовал писать cli() в функциях,но плохо чет выходит,не вариант.Использую таймер по переполнению,пробовал сравнение,но безрезультатно.Привожу короткий код,дабы передать суть моих действий и не забивать вам головы остальным кодом. Настройки для меги 16 с кварцем 8МГц

Код: Выделить всё

bool StatusStart = true;
volatile uint8_t CloseValve = 0;

ISR( TIMER1_OVF_vect )
{
  CloseValve=1; 
}


int main(void)
{
    cli();
    TCCR1B = 0;
    TCCR1B |=(1<<CS10)|(1<<CS12); 
    TIMSK  |=(1<<TOIE1); 
    TIFR = 1; 
    sei();

    while(1)
    {      
        // Button Start 
        if(!(PIND&BtnStart))
        {
             if(StatusStart)
            {
                StatusStart = false ;
                PORTD |= _BV(PD4);
                TCNT1=49911;
            }
         }

         if(CloseValve)
        {
            CloseValve = 0;
            StatusStart = true;

            PORTD &= ~_BV(PD4);
         }
    }
   return 0;
}
Реклама
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

Babulesnik писал(а):необходима временная задержка с высшим приоритетом в 2 сек ,собственно используем прерывание по таймеру.Прерывание в свою очередь дергает ножкой МК.Поблема в том,что мне нужно как-то останавливать таймер после выполнения прерывания,
А кто мешает остановить-то таймер?
Вот, ты включаешь таймер:

Код: Выделить всё

    TCCR1B = 0;
    TCCR1B |=(1<<CS10)|(1<<CS12); 
    TIMSK  |=(1<<TOIE1); 
    TIFR = 1; 
Почти так же возьми и выключи его:
- запрети прерывания от таймера TIMSK &= ~(1<<TOIE1);
- выключи таймер TCCR1B = 0;

Кстати, я бы запускал таймер TCCR1B |=(1<<CS10)|(1<<CS12); не в начале программы, а по условию if(StatusStart). И вывод в порт PORTD &= ~_BV(PD4); делал бы в самом прерывании.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Поробуй с кнопки запускать таймер:
TCCR1B |=(1<<CS10)|(1<<CS12);
а в прерывании останавливать таймер:
TCCR1B =0;
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Вт мар 06, 2012 19:59:00

Сообщение Babulesnik »

Огромнейшое спасибо mas123 и zero648 ! Теперь все работает как часики.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»