Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 07.08.2018, 10:12   #1
AlDes
Member
 
Регистрация: 08.07.2016
Сообщений: 35
Вес репутации: 137/10
AlDes will become famous soon enoughAlDes will become famous soon enough
По умолчанию Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Компилятор ХС8, PIC 16.
Задача.
Допустим RB3=1.
Как в начале появления сигнала на этом порту (каждый раз), обработать некую задачу (событие) , и далее при состоянии RB3=1;, больше о ней не вспоминать, до следующего состояния RB3=1;
Нашел рабочий вариант, но есть недостаток, идет постоянное ныряние в функцию, и тут же выход из нее.

Код:
if(RB3){funct();} 

void funct (void){
if (f_out)// блокирующий  флаг выхода=1;
{.......return;} 
... uiEvent &= 0xFFDF; f_out=1; ...
 // сбросить 5й бит в переменной, поднять блокирующий флаг

}
Подобное, можно организовать на switch case. Опять таки, с нырянием.
Спасибо.
AlDes вне форума   Ответить с цитированием
Старый 07.08.2018, 10:34   #2
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,938
Вес репутации: 3528/78
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

AlDes
change notice.
besogon вне форума   Ответить с цитированием
Старый 07.08.2018, 10:43   #3
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,938
Вес репутации: 3528/78
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

в общем виде, когда нет привязки к порту.
Код:
uf foo;
volatile uf bar;
/* init */
foo = bar;

/* if foo xor bar and bar
 * so we will get tasks
 * if only
 * bar and bar is not equal foo 
 */
if((foo ^ bar) & bar){
	foo = bar;
	/* tasks */
}
вроде бы.
besogon вне форума   Ответить с цитированием
Старый 07.08.2018, 10:47   #4
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,938
Вес репутации: 3528/78
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

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

pic16 заброшенная весьма вещь. ужасная.
besogon вне форума   Ответить с цитированием
Старый 07.08.2018, 12:47   #5
AlDes
Member
 
Регистрация: 08.07.2016
Сообщений: 35
Вес репутации: 137/10
AlDes will become famous soon enoughAlDes will become famous soon enough
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от besogon Посмотреть сообщение
и да, если пошли уже вопросы о исчерпании стека возвратов, то самое время задуматься о смене контроллера.
pic16 заброшенная весьма вещь. ужасная.
PIC не сменить, изделие заводское.
Действие предложенной конструкции понятно.
А как "прикрутить к моему случаю"?
Может я не правильно вопрос сформулировал.
Появился лог 1 на выходе RB3, и порт будет находиться долго в этом состоянии. Как только RB3=1;, надо обработать несколько переменных, которые в последствии, могут меняться при еще "не погасшем" RB3=1.

Т.е. исходя из Вашей подсказки, код должен выглядеть так?:

Код:
uf foo;//ХС8 такое выражение не понимает
//может быть,  bit foo; bit bar; 
volatile bit bar;
/* init */

if(RB3)
{foo = bar;}


if(RB3^ bar) & bar)
{foo=bar;
uiEvent &= 0xFFDF;
}
AlDes вне форума   Ответить с цитированием
Старый 07.08.2018, 12:54   #6
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,938
Вес репутации: 3528/78
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

AlDes
я допустил ошибку. забыл обновить тень.
может как-нибудь так.
Код:
int foo;
int bar;

/* init */
foo = bar = RB3;
 ...

foo = RB3;
if(foo^bar){
	if(foo){
		/* task */
	}
	/* copy new value to shadow */
	bar = foo;
}
суть такая - при первом старте присваиваем тени значение того, что там хотим сравнить.
потом, в рутине, если тень отличается от того значения, что есть, то сохраняем новое значение в тень и если условие - выполняем условие.
besogon вне форума   Ответить с цитированием
Старый 07.08.2018, 15:15   #7
AlDes
Member
 
Регистрация: 08.07.2016
Сообщений: 35
Вес репутации: 137/10
AlDes will become famous soon enoughAlDes will become famous soon enough
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от besogon Посмотреть сообщение
AlDes
может как-нибудь так.
Пока так не работает, но мысль мне нравиться.
Временно сделал так.

Код:
if (RB3){
   if(f_unbloc)// флаг блокировки
         {task();}//  вызов функции для выполнения задачи
	    } 
else{f_unbloc=1;}  

void task (void){
   ...
var &= 0xFFBF;.... 
f_unbloc=0;
   
     }
Поэкспериментирую с Вашим вариантом на досуге.
AlDes вне форума   Ответить с цитированием
Старый 07.08.2018, 16:22   #8
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 45
Сообщений: 687
Вес репутации: 1421/64
igor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud of
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от AlDes Посмотреть сообщение
Допустим RB3=1.
Как в начале появления сигнала на этом порту (каждый раз), обработать некую задачу (событие) , и далее при состоянии RB3=1;, больше о ней не вспоминать, до следующего состояния RB3=1;
что представляет из себя событие и как оно обрабатывается ? судя по тексту состояние не меняется никогда.
igor_tgru вне форума   Ответить с цитированием
Старый 07.08.2018, 16:49   #9
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,938
Вес репутации: 3528/78
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

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

по идее простой вариант с теневым состоянием и xor должен работать.
вообще нужно смотреть код, а особого желания влазить туда нет.
besogon вне форума   Ответить с цитированием
Старый 07.08.2018, 17:25   #10
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 45
Сообщений: 687
Вес репутации: 1421/64
igor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud of
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от besogon Посмотреть сообщение
по идее простой вариант с теневым состоянием и xor должен работать.
просто не увидел в объяснениях ТС что меняется и как должно быть обработано. )))))

я совсем не против этого варианта , по сути ксор с тенью (как бы это по проще выразится ?? - "выявляют фронт сигнала" и по сути порождают событие) , вопрос только в том что размещать ксор с тенью надо в том месте где обрабатывается сигнал с лапы.
к слову есть другой путь , через машину состояний ))
igor_tgru вне форума   Ответить с цитированием
Старый 07.08.2018, 20:55   #11
AlDes
Member
 
Регистрация: 08.07.2016
Сообщений: 35
Вес репутации: 137/10
AlDes will become famous soon enoughAlDes will become famous soon enough
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от igor_tgru Посмотреть сообщение
просто не увидел в объяснениях ТС что меняется и как должно быть обработано.
Много чего надо обработать.

Как только, RB3=1; Сразу сбросить кучу флагов, далее...T2CON=0; CCP1CON=0;... выключить пищалку...изменить состояние других ног порта... PORTB&=0xFE;
И обнулить бит события, которое уже записано в переменную, (меняя соответствующий бит в ней). Эту переменную я написал в примере.
После этого, RB3, остается равным 1.
А то что сбросилось, может почти сразу измениться по другим условиям, например запуститься TMR2.

Если погаснет, RB3=0;, это ни на что не повлияет. А если снова окажется =1;, опять сбросить все то, что описано выше.
Я понял, смысл всего, что вы написали, спасибо.
А то что пока не работает, так я еще толком не разбирался.
Много ветвлений, надо все причесать под "новый образ".

А где про эти "тени" почитать, про которые вы писали?
Поиском ничего найти не могу.

Последний раз редактировалось AlDes; 07.08.2018 в 21:07.
AlDes вне форума   Ответить с цитированием
Старый 07.08.2018, 21:20   #12
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 794
Вес репутации: 1418/53
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

запоминаешь предыдущие состояние порта , если предыдущие =0 , текшие=1 , че-то там делаем , иначе пропускаем .
новое значение записываем как предыдущие.
все.

if (RB3) reg|=(1<<0);
if (!(reg&(1<<1))&&(reg&(1<<0)))
{
// че-то делаем
}
reg<<=1;
reg&=(1<<1)|(1<<0);

Последний раз редактировалось DmitrijVDN; 07.08.2018 в 21:34.
DmitrijVDN вне форума   Ответить с цитированием
Старый 07.08.2018, 21:42   #13
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 794
Вес репутации: 1418/53
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

а вообще работа с кнопками разжевана в этой теме
http://www.microchip.su/showthread.php?t=7027
DmitrijVDN вне форума   Ответить с цитированием
Старый 07.08.2018, 23:23   #14
AlDes
Member
 
Регистрация: 08.07.2016
Сообщений: 35
Вес репутации: 137/10
AlDes will become famous soon enoughAlDes will become famous soon enough
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
а вообще работа с кнопками разжевана в этой теме
http://www.microchip.su/showthread.php?t=7027
С этим обработчиком кнопок, сие заводское устройство (блок):
a) в симуляторе работает идеально;
б) с изготовленным мной эмулятором, подключаемых к блоку исполнительных устройств, на светодиодах и кнопках, работает идеально;
в) непосредственно в железе, после присоединения к перепрошитому блоку исполнительных устройств, происходят неведомые вещи.
Конкретно
Код:
if(m_Buttons.uiJustReleased &(1<<6)){......}
сработает 3-4 раза нормально, а например в пятый раз, не сработает вовсе. И это единственный косяк, только по этому входу, и только с этим выражением.
В коде все делаю верно. Делаю даже так:
В устройстве есть свободный выход, RC7,
Задействую его, и при проверке, пишу:
Код:
if(m_Buttons.uiJustReleased &(1<<6)){m_Buttons.uiJustReleased &= 0xFFBF;..... RC7=1;.....}
Паяю на этот выход светодиод.
Так и есть, когда код работает, светодиод светиться, и наоборот.

Нужный лог. уровень, на пине есть, и когда выше названное выражение не срабатывает, и когда срабатывает. Осциллографом еще не смотрел, возможно антидребезг до конца не давиться.

Со стоковой прошивкой, такого не было, но ее не слить.

Если написать как в 7-ом посте, то все работает. Т.е. не через
if(m_Buttons.uiJustReleased &(1<<6))

Отсюда и вытек вопрос.
Как все это обработать иным способом?

Функцию обработки кнопок пробовал вызывать с различными периодами 5-40ms. Картина не меняется.

Последний раз редактировалось AlDes; 07.08.2018 в 23:30.
AlDes вне форума   Ответить с цитированием
Старый 08.08.2018, 05:51   #15
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 794
Вес репутации: 1418/53
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от AlDes Посмотреть сообщение
Как все это обработать иным способом?

Функцию обработки кнопок пробовал вызывать с различными периодами 5-40ms. Картина не меняется.
для кода тестера оптимальный тик 1мс и менее. и код реагирует на изменение по всему порту и/или пинов.

для себя делал по нажатию делал так :
Код:
void buttonPOWER_read(void)
{unsigned char tempPORTB;    
 static unsigned char butt_POWER;
    
    tempPORTB=PORTB;
    butt_POWER<<=1;
    butt_POWER|=(tempPORTB&(1<<1))>>1;
    butt_POWER&=0x03;
                          

    if(butt_POWER==0b10) 
      {
         fl.POWER= !fl.POWER;
      } 
}//end void buttonPOWER_read(void)
вызов функции сис.тик=10мс
DmitrijVDN вне форума   Ответить с цитированием
Старый 08.08.2018, 10:32   #16
AlDes
Member
 
Регистрация: 08.07.2016
Сообщений: 35
Вес репутации: 137/10
AlDes will become famous soon enoughAlDes will become famous soon enough
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
для кода тестера оптимальный тик 1мс и менее. и код реагирует на изменение по всему порту и/или пинов.
для себя делал по нажатию делал так :
Чем чаще вызываешь функцию от "Тестер", тем меньше времени на обработку антидребезга. Или я не прав?
Предложенный Вами вариант, в симуляторе работает, немного подточил его под свои нужды. Кстати и с иными вариантами разобрался. В железе пока не пробовал. Откатаю каждый вариант, по пять дней.
Щупом осциллографа, к блоку в устройстве, подлезть очень сложно. Иначе давно бы уже посмотрел, что там твориться.
AlDes вне форума   Ответить с цитированием
Старый 08.08.2018, 22:13   #17
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 794
Вес репутации: 1418/53
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от AlDes Посмотреть сообщение
Чем чаще вызываешь функцию от "Тестер", тем меньше времени на обработку антидребезга. Или я не прав?
правы конечно, только надо понимать как это работает , вот смотрите, тестер рекомендовал тик 20мс, счетчик дребезга =4, те
событие будет валидно без учета дребезга через 80мс + время дребезга 0..20мс , общее время составит 80..100мс , но тут есть большой камень в виде: счетчик один на все пины, те если при обработке 1вой кнопки будет нажата 2я время опять будет увеличено на +80..100мс , те 1я кнопка будет обрабатываться 160..200мс за это время оная может уже отжатся и событие будет пропущено
поэтому в коде тестера, чем быстрее тем лучше оптимально 0,5-1мс, в той теме кто-то даже описывался по этому вопросу.

в моем коде опрос 10мс из предположения, что дребезг < 10мс, тч если кнопки полное г.. он не прокатит.
DmitrijVDN вне форума   Ответить с цитированием
Старый 09.08.2018, 10:06   #18
paul
Senior Member
 
Регистрация: 23.08.2007
Адрес: Lipetsk
Возраст: 43
Сообщений: 218
Вес репутации: 425/48
paul is just really nicepaul is just really nicepaul is just really nicepaul is just really nicepaul is just really nice
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
но тут есть большой камень в виде: счетчик один на все пины, те если при обработке 1вой кнопки будет нажата 2я время опять будет увеличено на +80..100мс , те 1я кнопка будет обрабатываться 160..200мс за это время оная может уже отжатся и событие будет пропущено
Возможно нарвусь на жесткую критику: нашел в старом проекте алгоритм параллельного антидребезга для 4 кнопок,но проблем расширения на большее количество входов не вижу.
Помню, рисовал блок-схемы, строил таблицы истинности и пришел к такому вот алгоритму. Результат - в глобальной G_ButtonsPushed устанавливается соответствующий бит. Сбрасывается после отработки.
Процедура вызывается по таймеру каждые 15 мс.
Код:
void Buttons_Update() {
        static uchar LastState,TempState;

        uchar tmpInput = (PINB | 0xF0); //маскируем старшие 4 бита
        //Далее идет сильно оптимизированный алгоритм подавления дребезга и установка флагов нажатия
        uchar tmp = (TempState ^ LastState) & (~(tmpInput ^ TempState));
        LastState ^= tmp;
        G_ButtonsPushed = (G_ButtonsPushed | ((~TempState) & tmp)); // & (~(TempState & tmp)); //сброс флагов только после обработки, иначе раскомментить
        TempState = tmpInput;
        G_ButtonsPushed = (G_ButtonsPushed & 0x0F)|(LastState << 4);
}
paul вне форума   Ответить с цитированием
Старый 09.08.2018, 10:53   #19
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,938
Вес репутации: 3528/78
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

выложу драйвер keypad.
keypad генерирует события, которые обрабатываются в управляемом событиями приложении, которое работает не в процессе ядра.

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

скорее для ознакомления с типовыми проблемами, которые возникают при обработке кнопок и подобных им событий.
Вложения
Тип файла: zip keypad_example.zip (6.5 Кб, 4 просмотров)
besogon вне форума   Ответить с цитированием
Старый 10.08.2018, 07:54   #20
smart_pic
Senior Member
 
Регистрация: 08.12.2008
Адрес: Ставрополь
Возраст: 55
Сообщений: 995
Вес репутации: 2334/69
smart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond repute
Отправить сообщение для smart_pic с помощью Skype™
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Приведу свой пример
Код:
//****************************************************************************
void ScanKey1Tast(void)
{
static BOOL Key1_Sost=0;
static BOOL Key1_OldSost=0;

    Key1_Sost=BXOD1;
    if    ((Key1_Sost ==1) & (Key1_OldSost ==0)) Key1_Up=1;
    if    ((Key1_Sost ==0) & (Key1_OldSost ==1)) Key1_Down=1;
    Key1_OldSost=Key1_Sost;
    CD_Out.bits.inp1=Key1_Sost;
}
//****************************************************************************
В другом месте с определенной частотой вызываем опрос

и выполняем действия
Код:
    ScanKey1Tast();

    if (Key1_Down)   {Key1_Down=0; .........}
    if (Key1_Up)       {Key1_Up=0;.........}
В опросе кнопки можно предусмотреть защиту от дребезга.
В некоторых случаях требуется отдельно предоставлять факт длительного нажатия на кнопку (например для входа в сервисное меню).
smart_pic вне форума   Ответить с цитированием
Старый 13.08.2018, 10:30   #21
paul
Senior Member
 
Регистрация: 23.08.2007
Адрес: Lipetsk
Возраст: 43
Сообщений: 218
Вес репутации: 425/48
paul is just really nicepaul is just really nicepaul is just really nicepaul is just really nicepaul is just really nice
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от smart_pic Посмотреть сообщение
Приведу свой пример
....
В опросе кнопки можно предусмотреть защиту от дребезга.
В некоторых случаях требуется отдельно предоставлять факт длительного нажатия на кнопку (например для входа в сервисное меню).
Это 1 вход. Для 8 нужно 8 таких проверок. Ну и IF - это переходы - медленные операции.
У меня же стояла задача отработать дребезг большого количества входов с минимальными затратами. Все выполняется логическими операциями, "родными" для процессоров. Количество ограничивается только размерами переменных. Длительные нажатия при необходимости отслеживаются далее.
paul вне форума   Ответить с цитированием
Старый 16.08.2018, 10:12   #22
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,789
Вес репутации: 5397/164
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Цитата:
Сообщение от paul Посмотреть сообщение
Это 1 вход. Для 8 нужно 8 таких проверок. Ну и IF - это переходы - медленные операции.
У меня же стояла задача отработать дребезг большого количества входов с минимальными затратами. Все выполняется логическими операциями, "родными" для процессоров. Количество ограничивается только размерами переменных.
в классике пикоманства такой алгоритм назывался vertical counters, когда счетчик велся в одинаковых битах нескольких переменных (для четырех состояний - две переменные).

Tester довел до совершенства, но можно остановиться где-то посередине, отслеживая только нажатия и отпускания.
И никаких там задержек и повторных анализов возникать не должно.
Greg вне форума   Ответить с цитированием
Старый 16.08.2018, 11:02   #23
AlDes
Member
 
Регистрация: 08.07.2016
Сообщений: 35
Вес репутации: 137/10
AlDes will become famous soon enoughAlDes will become famous soon enough
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

Опробовал несколько вариантов здесь предложенных, все работают, даже мой, не оптимальный.
Цитата:
Сообщение от Greg Посмотреть сообщение
Tester довел до совершенства, но можно остановиться где-то посередине, отслеживая только нажатия и отпускания.
И никаких там задержек и повторных анализов возникать не должно.
Как раз на этом и остановился, но почему в моем случае не отслеживается именно событие отпускания, причем по одной кнопке, так и не разобрался.
Если смотреть функцию, то оно просто обязано прописаться. Ведь состояние отслеживается и читается всегда хорошо.

Код:
if (!m_Buttons.ucJitter && uiTemp)      // State was changed and debounced
            {
                //------------------------------------------------------------------------
                //  Check for released buttons
                //------------------------------------------------------------------------
                
                if (m_Buttons.uiPressed & uiTemp)   // We have released buttons
                {                   
                        m_Buttons.uiJustReleased    |=  uiTemp;
		   
		        m_Buttons.uiChanged         |=  uiTemp;
		   
                                       
                }   // if released
    
                //------------------------------------------------------------------------
                //  Check for pressed buttons
                //------------------------------------------------------------------------
    
                if ((m_Buttons.uiPressed ^ uiTemp) & uiTemp)    // We have pressed buttons
                {      

		        m_Buttons.uiChanged         |=  uiTemp;
                        m_Buttons.uiJustPressed     |=  uiTemp;              
    
                }   // if pressed
    
                m_Buttons.uiPressed = s_uiPort;
    
                
            }   // if changed and debounced

Последний раз редактировалось AlDes; 16.08.2018 в 11:17.
AlDes вне форума   Ответить с цитированием
Старый 16.08.2018, 11:39   #24
dosikus
Senior Member
 
Аватар для dosikus
 
Регистрация: 05.06.2007
Возраст: 46
Сообщений: 3,746
Вес репутации: 6161/141
dosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond repute
По умолчанию Re: Си. Как при постоянном условии, сбросить в нем событие, и далее его не обрабатывать?

AlDes, реализация tester'a работает отлично, главное все делать правильно- правильный сбор сырых данных с кнопок в переменную и периодический опрос без выкрутасов.
У меня что на пЫк мелких что на стм32 работает все и всегда.
Да и,там есть флаги которые после фиксации необходимо сбрасывать...
dosikus вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем/как отлаживать код написаный на Си в WinAVR Yokel Микроконтроллеры других производителей 49 30.09.2014 09:48
что за зверь - Скатерограмма Edua Общетехнические вопросы 17 01.03.2013 23:33
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39


Часовой пояс GMT +3, время: 23:36.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot