Switch и вызов функции

Модератор: boogyman

Ответить
Аватара пользователя
uuu000
Любитель
Сообщения: 17
Зарегистрирован: 08 апр 2019, 00:15

Switch и вызов функции

#1

Сообщение uuu000 » 16 окт 2022, 14:26

Понадобилось сделать переключатель 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 КБ) 16 скачиваний

Аватара пользователя
AntonChip
Администратор
Сообщения: 263
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: Switch и вызов функции

#2

Сообщение AntonChip » 16 окт 2022, 23:32

Здравствуйте. Тут задержка ни к чему, переменная k успеет несколько раз поменять свое значение за это время

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

	
 k++;
 _delay_ms(50);
 

Аватара пользователя
AntonChip
Администратор
Сообщения: 263
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: Switch и вызов функции

#3

Сообщение AntonChip » 16 окт 2022, 23:46

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

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);
}

Ответить