Обычно для входа в нужный режим использую длинное (5сек) нажатие на кнопку. Обычно я делаю так: //Глобальные переменные unsigned char pause; //счетчик паузы удержания кнопки
#pragma vector=TIMER0_COMPA_vect __interrupt void TC0_COMPA_ISR(void) { if(!(PIND&(1<<PROG))) //если нажата кнопка "PROG"... { if(++pause > 250) //более 10ms*250=2.5сек { PINC |= (1<<LED1); Flags |= EDIT; pause = 0; //обнулить счетчик паузы } ...... }
////////////////// //Timer0 initialisation: TCCR0A=(1<<WGM01); //Сброс таймера при совпадении TCCR0B=(0<<CS02)|(1<<CS00); //Prescaler = CLK/1024 OCR0A=194; //Обработчик прерывания таймера0 вызывается через 10 мс TIFR0 = TIFR0; // Clear TC0 interrupt flags TIMSK0=(1<<OCIE0A); //Разрешить прерывания по совпадению COMPA
... и всегда работало без проблем на максимальной оптимизации по размеру. Компилятор IAR 4.12A. Этот же пример на том же контроллере и на том же компиляторе в новом проекте не удается создать задержку в 3 сек. Вернее работает, если pause сделать unsigned int и инкрементировать до порядка 65000. Пробовал ставить модификатор volatile. Не помогает. В чем же дело?
Сообщение отредактировал alux - Jun 8 2007, 20:15
|