Attiny2313 и PA0

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Есть схема, где на ноги PA0 и PA1 повешены две кнопки. Прошивка эти кнопки проверяет и делает всякие действия. Причем распознает одиночное нажатие, многократные нажатия и нажатия и удержания.
Одиночные нажатия обрабатываются по отдельности каждой кнопки а многократные нажатия и удержания мне не важно с какой кнопки, поэтому проверка на них идет вместе (if(PINA&0b11)).
Проблемма заключается в том что одиночные нажатия отрабатываются нормально, а когда доходит дело до многократных нажатий или удержаний, то кнопка на PA1 отрабатывает нормально, а PA0 - нет, а учитывая что проверяются на нажатия они одним условием, то я вообще не понимаю ничего...
Гляньте кто нить свежим взглядом, может подскажет кто что.

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

unsigned char 	        butt_on_state=WAVE_ALW_ON_LOW,
				butt_off_state=WAVE_ALW_OFF_LOW,
				st_t=0;
signed char		lc=-1;

			int	tmrLo=0,		//счетчик таймера понижения яркости
				tmrOff=0,		//счетчик таймера включения/отключения света
				tmrTun=0;	//счетчик таймера настройки света
unsigned char	is_tune=0,		//признак того что регулируют яркость и не надо выключать свет
				state_butt;	//Состояние главного конечного автомата кнопки (общий для двух)


	switch (state_butt) {
		case BUTTON_NOT_PRESS:
			if ((BUTT_LOW_PRESS)||(BUTT_HI_PRESS)) {
				tmrLo=200;
				state_butt=BUTTON_PRESS;
			}
			if (BUTT_LOW_PRESS) {
				butt_on_state=WAVE_ALW_ON_LOW;
				butt_off_state=WAVE_ALW_OFF_LOW;
				st_t=0;
				lc=-1;
			}
			if (BUTT_HI_PRESS) {
				butt_on_state=WAVE_ALW_ON_HI;
				butt_off_state=WAVE_ALW_OFF_HI;
				st_t=SP_COUNT-1;
				lc=1;
			}
			
			tmrTun++;
			if (tmrTun>100) is_tune=0;
		break;		
		
		case BUTTON_PRESS:
			tmrLo--;
			if (tmrLo<0) {
				if (lvl>0) {
					lvl--;
					Led_Correct(lc);
				}
				tmrLo=10;
				is_tune=1;
				tmrTun=0;
			}
//			if ((!(BUTT_LOW_PRESS))&&(!(BUTT_HI_PRESS))) {
			if (!(PINA&0b11)) { /* если ни одна кнопка не нажата*/
				tmrOff=100;
				state_butt=BUTTON_UNPRESS;
			}		
		break;		
		
		case BUTTON_UNPRESS:
			tmrOff--;
			if (tmrOff<0) {
				if (!is_tune) { /* одиночное нажатие кнопки*/
					if ((state<WAVE_ALW_ON_LOW) || (state>WAVE_ALW_ON)) state=butt_on_state; 
					else state=butt_off_state; 
					st=st_t;
				}
				state_butt=BUTTON_NOT_PRESS;	
			}
//			if ((BUTT_LOW_PRESS)||(BUTT_HI_PRESS)) {
			if (PINA&0b11) { 		/*если нажата любая кнопка*/
				if (lvl<245) {
					lvl+=10;
					Led_Correct(lc);
				}
				is_tune=1;
				tmrTun=0;
				state_butt=BUTTON_NOT_PRESS;
			}		
		break;	
	}
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Попробуем погадать...
BUTTON_PRESS - это видимо нажатие кнопки, со с значением еще не определился.
BUTTON_UNPRESS - это видимо отжали кнопку.

а state_butt откуда берется? первичное состояние 0 или 1? А может так как объявлен тип unsigned char state_butt, тогда видимо от 0 до 255, но так как при объявлении unsigned char state_butt принимает значение 0, и опять если, опять если..., то возможно, что BUTTON_NOT_PRESS=0, а кто у нас экстрасенс, не подскажете?

Полностью проект выложите.
Реклама
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Там enum тип и button_notpress имеет нормальное значение.
Но я вроде разобрался. Там (немного в другом месте) было сравнение знакового и беззнакоаого числа. Исправил - вроде вылечилось. Странно несколько, на мой взгляд.... погоняю сейчас
Ответить

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