Switch и вызов функции
Модератор: boogyman
Switch и вызов функции
Понадобилось сделать переключатель switch на atmega328 для переключения между генераторами меандра (на различные частоты). Генератор на таймере Т0 в режиме СТС, разница между подключаемыми генераторами только в численном значении OCR0A. При первом нажатии на кнопку после подачи питания зажигается светодиод(case1). Затем при последовательном нажатии кнопки происходит вызов функций генераторов (case2, case3, case4). Проблема в том что вызвать функцию генератора можно, но вернуть ее назад (если так можно сказать) при следующем нажатии кнопки (например case5) не получается. Я попробовал просто отключать выход OC0А (в моем случае это DDRD&=~(1<<PD6)) но после возвращения из case5 в case1 светодиод не горит (т.к. в предыдущем case5 было отключение ОС0А (DDRD&=~(1<<PD6)). Если ввести еще один case6 для включения ОС0А (DDRD|=(1<<PD6)) то получается что генератор из case4 (последний по списку) вновь получил возможность подавать меандр на теперь подключенный ОС0А (и подключение ОС0А в case6).Поэтому после первого прохождения прохождении case1...case6 при последующем переключении в case1 получаем работающий на выход ОС0А генератор из case4. Возможно применение отключения выхода ОС0А это моя ошибка. Я еще начинающий, хоть и не молодой. Пробовал вводить переменную (типа флаг) и использовать оператор if() который в зависимости ит наличия установленного или сброшенного флага включал бы или отключал бы генератор в кейсах switch.К сожалению не помогло. Прошу помощи у опытных форумчан. Спасибо за терпение.
- Вложения
-
- TEST TIMER.rar
- (103.43 КБ) 299 скачиваний
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Re: Switch и вызов функции
Здравствуйте. Тут задержка ни к чему, переменная k успеет несколько раз поменять свое значение за это время
Код: Выделить всё
k++;
_delay_ms(50);
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Re: Switch и вызов функции
Код: Выделить всё
int main()
{
DDRB &= ~(1<<PB0); // Кнопка
PORTB |= (1<<PB0);
DDRD |= (1<<PD6); // Выход
PORTD &= ~(1<<PD6);
while(1)
{
if (Butt())
{
while(Butt()){};
k++;
if(k > 5) k = 1;
}
switch(k)
{
case 1:
TCCR0A = 0;
TCCR0B = 0;
PORTD |= (1<<PD6);
break;
case 2:
Counter01_init();
break;
case 3:
Counter0_init();
break;
case 4:
Counter02_init();
break;
case 5:
TCCR0A = 0;
TCCR0B = 0;
PORTD &= ~(1<<PD6);
break;
}
}
return (0);
}