Перейти к содержанию

Опросы кнопок на MEGA8 и MEGA16


tifaso

Рекомендуемые сообщения

Как сделать правильные опросы кнопок в MEGA8 и MEGA16? Понятно что как мне уже говорили сделать можно через таймер, но информации по этим таймерам практически нету. Смотрел видео уроки работы с таймерами принцип немного вроде понял. А вот как и при каких параметрах это делается непонятно? Даже по видео урокам везде отсылки к даташитам, но как начинаешь искать эту информацию по даташиту. Оказывается даже такой страницы и нет.

В общем вчера я целый день просидел пытаясь хоть что то понять, но так и не сдвинулся с мёртвой точки.

Мне нужно сделать опросы кнопок так чтобы оно не касалось основного кода. Потому как при размещении опроса кнопок таким образом кнопки не сразу отрабатывают

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
volatile unsigned char power=0;
volatile unsigned char menu=0;

int main(void)
{
	DDRA = 0b11110000;
	DDRB = 0b00000000;
	DDRC = 0b11111111;
	DDRD = 0b11111111;
	PORTA = 0b00000000;
	PORTB = 0b00000000;
	PORTC = 0b00000000;
	PORTD = 0b10000000;
    while(1)
    {
        if (~PINB & (1<<0))
        {
			_delay_ms(1);
			if (~PINB &(1<<0))
			{
			    while(~PINB & (1<<0));
			    if (PINC)
			    {
				    PORTD = 0b10000000;
				    PORTC = 0b00000000;
				    PORTA &= ~((1<<4)|(1<<5)|(1<<6)|(1<<7));
				    power=0;
			    } 
		    	else
			    {
			    	PORTD &= ~(1<<7);
			    	PORTC |= (1<<0);
				    power=1;
			    }
		    }
        }
		if (power==1)
		{
			if (~PINB & (1<<1))
			{
				_delay_ms(1);
				if (~PINB & (1<<1))
				{
				    PORTC |= (1<<1);
			    	PORTC &= ~((1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7));
			    	PORTA &= ~((1<<4)|(1<<5)|(1<<6)|(1<<7));
					PORTD = 0b00000000;
			    	menu=1;
				}
			}
			if (~PINB & (1<<2))
			{
				_delay_ms(1);
				if (~PINB & (1<<2))
				{
				    PORTC |= (1<<2);
		    		PORTC &= ~((1<<1)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7));
		    		PORTA &= ~((1<<4)|(1<<5)|(1<<6)|(1<<7));
					PORTD = 0b00000000;				
	    			menu=2;
				}
			}
			if (~PINB & (1<<3))
			{
				_delay_ms(1);
				if (~PINB & (1<<3))
				{
		    		PORTC |= (1<<3);
	    		  	PORTC &= ~((1<<1)|(1<<2)|(1<<4)|(1<<5)|(1<<6)|(1<<7));
		    		PORTA &= ~((1<<4)|(1<<5)|(1<<6)|(1<<7));
					PORTD = 0b00000000;				
		    		menu=3;
				}
			}
			if (~PINB & (1<<4))
			{
				_delay_ms(1);
				if (~PINB & (1<<4))
				{
	    			PORTC |= (1<<4);
	    			PORTC &= ~((1<<1)|(1<<2)|(1<<3)|(1<<5)|(1<<6)|(1<<7));
	    			PORTA &= ~((1<<4)|(1<<5)|(1<<6)|(1<<7));
					PORTD = 0b00000000;				
	    			menu=4;
				}
			}
			if (~PINB & (1<<5))
			{
				_delay_ms(1);
				if (~PINB & (1<<5))
				{
	    			PORTC |= (1<<5);
	    			PORTC &= ~((1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<6)|(1<<7));
	    			PORTA &= ~((1<<4)|(1<<5)|(1<<6)|(1<<7));
					PORTD = 0b00000000;				
	    			menu=5;
				}
			}
			if (~PINB & (1<<6))
			{
				_delay_ms(1);
				if (~PINB & (1<<6))
				{
				    PORTC |= (1<<6);
				    PORTC &= ~((1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<7));
				    PORTA &= ~((1<<4)|(1<<5)|(1<<6)|(1<<7));
					PORTD = 0b00000000;				
				    menu=6;
				}
			}
			if (~PINB & (1<<7))
			{
				_delay_ms(1);
				if (~PINB & (1<<7))
				{
	    			PORTC |= (1<<7);
	    			PORTC &= ~((1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6));
	    			PORTA &= ~((1<<4)|(1<<5)|(1<<6)|(1<<7));
					PORTD = 0b00000000;				
		    		menu=7;
				}
			}
			if (~PINA & (1<<0))
			{
				_delay_ms(1);
				if (~PINA & (1<<0))
				{
				    PORTA |= (1<<4);
		    		PORTC &= ~((1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7));
	    			PORTA &= ~((1<<5)|(1<<6)|(1<<7));	
					PORTD = 0b00000000;			
	    			menu=8;
				}
			}
			if (~PINA & (1<<1))
			{
				_delay_ms(1);
				if (~PINA & (1<<1))
				{
    				PORTA |= (1<<5);
	    			PORTC &= ~((1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7));
	    			PORTA &= ~((1<<4)|(1<<6)|(1<<7));
					PORTD = 0b00000000;				
	    			menu=9;
				}
			}
			if (~PINA & (1<<2))
			{
				_delay_ms(1);
				if (~PINA & (1<<2))
				{
    				PORTA |= (1<<6);
    				PORTC &= ~((1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7));
    				PORTA &= ~((1<<4)|(1<<5)|(1<<7));
					PORTD = 0b00000000;				
    				menu=10;
				}
			}
			if (~PINA & (1<<3))
			{
				_delay_ms(1);
				if (~PINA & (1<<3))
				{
    				PORTA |= (1<<7);
    				PORTC &= ~((1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7));
    				PORTA &= ~((1<<4)|(1<<5)|(1<<6));	
					PORTD = 0b00000000;			
    				menu=11;
				}
			}
			if (menu==1)
			{
				PORTC |= (1<<1);
				PORTD |= (1<<0);
				PORTD &= ~((1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6));
				_delay_ms(300);
				PORTD |= (1<<1);
				PORTD &= ~((1<<0)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6));
				_delay_ms(300);
				PORTD |= (1<<2);
				PORTD &= ~((1<<0)|(1<<1)|(1<<3)|(1<<4)|(1<<5)|(1<<6));
				_delay_ms(300);
				PORTD |= (1<<3);
				PORTD &= ~((1<<0)|(1<<1)|(1<<2)|(1<<4)|(1<<5)|(1<<6));
				_delay_ms(300);
				PORTD |= (1<<4);
				PORTD &= ~((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<5)|(1<<6));
				_delay_ms(300);
				PORTD |= (1<<5);
				PORTD &= ~((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<6));
				_delay_ms(300);
				PORTD |= (1<<6);
				PORTD &= ~((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5));
				_delay_ms(300);
			}
			if (menu==2)
			{
				PORTC |= (1<<2);
				PORTD |= (1<<0);
				_delay_ms(300);
				PORTD |= (1<<1);
				_delay_ms(300);
				PORTD |= (1<<2);
				_delay_ms(300);
				PORTD |= (1<<3);
				_delay_ms(300);
				PORTD |= (1<<4);
				_delay_ms(300);
				PORTD |= (1<<5);
				_delay_ms(300);
				PORTD |= (1<<6);
				_delay_ms(300);
				PORTD &= ~(1<<0);
				_delay_ms(300);
				PORTD &= ~(1<<1);
				_delay_ms(300);
				PORTD &= ~(1<<2);
				_delay_ms(300);
				PORTD &= ~(1<<3);
				_delay_ms(300);
				PORTD &= ~(1<<4);
				_delay_ms(300);
				PORTD &= ~(1<<5);
				_delay_ms(300);
				PORTD &= ~(1<<6);
			}
			if (menu==3)
			{
				PORTC |= (1<<3);
				PORTD |= ((1<<0)|(1<<6));
				_delay_ms(300);
				PORTD |= ((1<<1)|(1<<5));
				_delay_ms(300);
				PORTD |= ((1<<2)|(1<<4));
				_delay_ms(300);
				PORTD |= (1<<3);
				_delay_ms(300);
				PORTD &= ~((1<<0)|(1<<6));
				_delay_ms(300);
				PORTD &= ~((1<<1)|(1<<5));
				_delay_ms(300);
				PORTD &= ~((1<<2)|(1<<4));
				_delay_ms(300);
				PORTD &= ~(1<<3);
				_delay_ms(300);
			}
			if (menu==4)
			{
				PORTC |= (1<<4);
				PORTD |= ((1<<0)|(1<<6));
				_delay_ms(300);
				PORTD |= ((1<<2)|(1<<4));
				_delay_ms(300);
				PORTD &= ~((1<<0)|(1<<6));
				_delay_ms(300);
				PORTD &= ~((1<<2)|(1<<4));
				_delay_ms(300);
				PORTD |= ((1<<1)|(1<<5));
				_delay_ms(300);
				PORTD |= (1<<3);
				_delay_ms(300);
				PORTD &= ~((1<<1)|(1<<5));
				_delay_ms(300);
				PORTD &= ~(1<<3);
			}
		}
    }
}

Мне нужны сразу варианты проверки кнопок для ATMEGA8 и ATMEGA16. 

Я уже понял то что размещать проверку кнопок в основном коде не вариант. А вот как это исправить? Может кто поможет записать блок проверки кнопок.

Ссылка на комментарий
Поделиться на другие сайты

41 минуту назад, tifaso сказал:

Понятно что как мне уже говорили сделать можно через таймер

1. настройте таймером  прерывания скажем 100 раз в секунду и в прерываниях опрашивайте кнопки

2. разбейте программу на циклы по 10ms  и в каждом цикле rcall - те    кейборд .

10ms это хватит и на антидребезг - 10 раз проверить кнопку и время реакции будет от 0.1сек . 

Конкретно помочь не могу - так как  и си не знаю и до помошника не дорос .

Ссылка на комментарий
Поделиться на другие сайты

@colorad Спасибо и на этом. Теперь мне хотя бы понятен алгоритм действий. Попробую сделать. На MEGA8 я еще это сделаю, но MEGA16 имеет другие параметры запуска таймера которые я так и не нашёл.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Для простого отсчета времени, все таймеры, что в tiny, что в mega - настраиваются одинаково. Что у вас не сошлось с м16? Самая простая настройка - достаточно запустить таймер0, выставив предделитель тактовой частоты (биты CS), и разрешить прерывание по переполнению (бит TOIE0). 2 бита записать, все идентично что в m8, что в m16. В сети столько гайдов по настройке стандартной периферии. Возьмите почитайте гайды DiHalt (easyelectronics), у него как раз по m16 курс написан.

К примеру, timer0 при частоте работы 8MHz и предделителе 256 даст прерывание по переполнению каждые 8.2 ms. 

Для этого нужно записать аж два бита:

CS02<1 (предделитель тактовой частоты 256)

TOIE0<1(Разрешение на прерывание timer0 по переполнению)

Заводите счетчик нажатой кнопки, если при наступлении прерывания на pinX - 1, увеличиваете счетчик, если pinX - 0, очищаете счетчик, считаете, например до 4-20. При достижении порога счетчика взводите какой либо флаг в прерывании, очищаете счетчик, а в основном цикле уже исполняете нужное действие. Поиграйтесь частотой опроса, диапазоном счетчика. Такой алгоритм позволяет опрашивать параллельно все кнопки, а не ждать, пока закончится delay. Никаких delay"ms" тут не допускается.

 

 

Изменено пользователем godrik
Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Тут смотря сколько кнопок, и какой МК, если нормальный МК, и количество кнопок совпадают с количеством внешних прерываний, то таймеры сто лет не нужны, а просто внешние прерывания.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

16 часов назад, Электронщик сказал:

если нормальный МК

А какие "ненормальные":D?

Народ хочет знать, а то применяют чёрт знает что и проблем таких не знает:pilot:.

"Огласите весь список, пожалуйста"(С).

Ссылка на комментарий
Поделиться на другие сайты

Те у которых много пинок под внешние прерывания и много других интерфейсов и стоят сколько эти и корпус меньшим, тот же stm32f103c8t6. 

Ссылка на комментарий
Поделиться на другие сайты

У меге8 тоже можно ( не нужно) много прерываний через компаратор навешать , только не сразу, а поочередно. Но антидребезг и прочее (переход на быстрый счет при удержании например)   все одно потребует и таймер и счетчики.    

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Здравствйте. Посоветуйте как правильно (самые правильные способы) опроса большого количества кнопок или датчиков (работающих также как и кнопка) в количестве около 15-20 штук (не матрица). У меня есть свои проверенные способы но я не хочу использовать их для такого большого количества кнопок так как будет большое количество проверок и если я размещу этот код в прерывные одного из таймеров то в нем будет около  30-40 if-ов  что не есть хорошо. 
Как правильно сделать? Чтобы еще остался ресурс и для других задач. Как делают профессионалы?

Ссылка на комментарий
Поделиться на другие сайты

Подключи все свои кнопки на простую логику "И" или "ИЛИ", выход с нее - на вход внешнего прерывания МК. Кроме того, в МК есть прерывания по изменения состояния выводов.

25 minutes ago, Vit@lik said:

в количестве около 15-20 штук (не матрица)...

Для такого количества лучше использовать матрицу...

Изменено пользователем _abk_
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, IMXO сказал:

XOR ? или нет?

Логическое AND и еще есть простая защита от дребезга
это код для одной кнопки

void buttons_handler(){
	#define DNUM 1000
	
	//D3 PRESS
	if ( (!btn_block[3]) && (~PIND & 0b00010000) ){
		if (btn_count[3] < DNUM){btn_count[3]++;}
		else{btn_block[3]++;
        }
	}
	
    //D3 UNPRESS
	if ( (btn_block[3]) && (PIND & 0b00010000) ){
		if (btn_count[3]){btn_count[3]--;}
		else{btn_block[3] = 0; USART_Transmit('3');
		}
	}
  
    //.... 
}                                         

 

Изменено пользователем Vit@lik
Ссылка на комментарий
Поделиться на другие сайты

Считываешь все кнопки разом. Сравниваешь с предыдущим состоянием. Если не изменилось, то вылазишь. Если же изменилось, то ищешь конкретную кнопку/датчик.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

        Button = PORT

        ; определяем только что нажатые кнопки
        W = Button
        W ^= ButtonOld
        W &= Button
        ButtonJastPressed = W
		; определяем только что отпущеные кнопки
        W = Button
        W ^= ButtonOld
        W &= ButtonOld
        ButtonJastPressed = W
		
        ; обновляем станоезначение кнопок
        ButtonOld = Button
        ButtonPressed = Button

 

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, _abk_ сказал:

на вход внешнего прерывания МК

два внешних прерывания уже задействованы для реализации wiegand интерфейса.
и больше никаких внешних прерываний у него нет это ATmega8

10 часов назад, _abk_ сказал:

Для такого количества лучше использовать матрицу.

поздно уже

3 часа назад, солар сказал:

Считываешь все кнопки разом

ну все кнопки вместе не получится, они на различных портах МК. Я могу прочитать все кнопки на одном порту за одну команду. И таких действия будет три, по одному для каждого отдельного порта.
Далее я придумал так - для каждого прочитанного значения состояния пинов порта нужно сделать НЕ а затем И с маской отслеживаемых пинов. Так можно узнать есть ли на етом порту нажата хоть какая либо кнопка. И если есть то для определения какой именно это пин будет уже около 5-10 проверок. Это как бы лучше. Возможно еще как-то можно  код оптимизировать и улучшить.

@IMXO с вашим кодом еще не разобрался, но изучу его подробно

Изменено пользователем Vit@lik
Ссылка на комментарий
Поделиться на другие сайты

2 hours ago, Vit@lik said:

два внешних прерывания уже задействованы

Что мешает тогда периодически проверять ОДИН вход, на который заведен выход с логики. Вместо

13 hours ago, Vit@lik said:

30-40 if-ов

А потом уже искать нажатую кнопку, если есть такая.

Интересно, где это в ATmega8  нашлось 30-40 входов :crazy: Что вы скрываете...

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Vit@lik сказал:

и больше никаких внешних прерываний у него нет это ATmega8

есть у  ATmega8 прерывания

15.11.2020 в 14:02, colorad сказал:

У меге8 тоже можно ( не нужно) много прерываний через компаратор навешать , только не сразу, а поочередно

 

Ссылка на комментарий
Поделиться на другие сайты

37 минут назад, _abk_ сказал:

Интересно, где это в ATmega8  нашлось 30-40 входов :crazy: Что вы скрываете...

у меня на один вход два if 
пока что делаю так как в прикрепленом коде

 

37 минут назад, _abk_ сказал:

Что мешает тогда периодически проверять ОДИН вход,

уже изготовленная плата. 
 

while (1){
		buttons_handler();		
	}//while

void buttons_handler(){
	int scand = 0;
	
	scand = PIND;
	//scand = ~scand;
	
	if (~scand & 0b11111100){
		d_flag = 1;
	}
}


ISR(TIMER0_OVF_vect){
	
	send_procc();
	timer0_millis+=1;
	
	#define DEBDELAY 500
	
	if (d_flag){
		
		////////////////PORTD7
		if((~PIND & (1<<7)) && (!flag_buttons[7])){
			if(count_buttons[7] < DEBDELAY){count_buttons[7]++;}
			else {flag_buttons[7]++;}
		}
		else if ((PIND & (1<<7)) && (flag_buttons[7])) {
			if(count_buttons[7]){count_buttons[7]--;}
			else{flag_buttons[7] = 0; d_flag = 0; usart_send_str("PORTD7");}
		}////////////////
		
		////////////////PORTD6
		if((~PIND & (1<<6)) && (!flag_buttons[6])){
			if(count_buttons[6] < DEBDELAY){count_buttons[6]++;}
			else {flag_buttons[6]++;}
		}
		else if ((PIND & (1<<6)) && (flag_buttons[6])) {
			if(count_buttons[6]){count_buttons[6]--;}
			else{flag_buttons[6] = 0; d_flag = 0; usart_send_str("PORTD6");}
		}
		////////////////
		
	}//if d_flag

}

 

Screenshot_8.png

Screenshot_9.png

24 минуты назад, colorad сказал:

есть у  ATmega8 прерывания

какие это ? кроме int0 и int1? в мега328 есть блоком на каждый порт PCINT, в мега 8 нет же

Изменено пользователем Vit@lik
Ссылка на комментарий
Поделиться на другие сайты

52 минуты назад, Vit@lik сказал:

пока что делаю так как в прикрепленом коде

ух... жесть какая...
кто вас надоумил передачу по юарту в прерывание засунуть...

если требуется независимое чтение кнопок делаю так

Скрытый текст


#define BUTTON1 GPIO0
#define BUTTON2 GPIO1

typedef struct
{
    unsigned char   Jitter       :8;      // 
    unsigned char   Pressed      :1;      // 
    unsigned char   OldPressed   :1;      // 
    unsigned char   JustPressed  :1;      // 
    unsigned char   JustReleased :1;      // 
    unsigned char   :4;
} TBUTTONS;
volatile TBUTTONS   m_button1, m_button2;

//******************************************************************
//
//******************************************************************
 void Task_Button1 (void)
{
	m_button1.Jitter<<=1;
	if(!BUTTON1) {m_button1.Jitter++;}
	
	if(m_button1.Jitter==0xFF) {m_button1.Pressed=1;}
	if(m_button1.Jitter==0x00) {m_button1.Pressed=0;}
	
    if(m_button1.Pressed && !m_button1.OldPressed) {m_button1.JustPressed=1;}
    if(!m_button1.Pressed && m_button1.OldPressed) {m_button1.JustReleased=1;}     
    m_button1.OldPressed = m_button1.Pressed;
}
	
//******************************************************************
//
//******************************************************************
 void Task_Button2 (void)
{
	m_button2.Jitter<<=1;
	if(!BUTTON2) {m_button2.Jitter++;}
	
	if(m_button2.Jitter==0xFF) {m_button2.Pressed=1;}
	if(m_button2.Jitter==0x00) {m_button2.Pressed=0;}
	
    if(m_button2.Pressed && !m_button2.OldPressed) {m_button2.JustPressed=1;}
    if(!m_button2.Pressed && m_button2.OldPressed) {m_button2.JustReleased=1;}     
    m_button2.OldPressed = m_button2.Pressed;
}

 

функции по таймеру, опрос флагов в основном цикле...
 

Ссылка на комментарий
Поделиться на другие сайты

так делать не есть гуд...

вы наверно не совсем понимаете как это работает...
вот смотрите первый ИФ, проверяется кнопка = нажата, переходит к проверке флага = установлен , условие не выполняться идет переход на элзеиф в этот момент изменяется состояние порта а вы его по новой читаете и  не выполняется второе условие и автоматом влетаете  в третье.
 

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, IMXO сказал:

автоматом влетаете  в третье

почему автоматом влетаете  в третье? там свой отдельный  ИФ с проверкой
там нет третьего условия

а else перед каждым вторим if я добавил чтобы не делалась еще одна проверка второго условия если первый if == true

8 минут назад, IMXO сказал:

не совсем понимаете как это работает

думал что понимаю...

Изменено пользователем Vit@lik
Ссылка на комментарий
Поделиться на другие сайты

ну значит вообще ничего не выполнил , еще хуже...
короче не стоит так делать... вылезут грабли в самый неподходящий момент
и будешь долго чесать репу откуда глюки...

физическое состояние пина должно читаться только один раз за системный тик.

смотри   код выше под катом

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...