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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 07.08.2018, 10:12   #1
AlDes
Member
 
Регистрация: 08.07.2016
Сообщений: 37
Вес репутации: 137/12
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
Сообщений: 2,099
Вес репутации: 3977/85
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
Сообщений: 2,099
Вес репутации: 3977/85
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
Сообщений: 2,099
Вес репутации: 3977/85
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
Сообщений: 37
Вес репутации: 137/12
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
Сообщений: 2,099
Вес репутации: 3977/85
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, 16:22   #7
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 688
Вес репутации: 1421/65
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   #8
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,099
Вес репутации: 3977/85
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   #9
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 688
Вес репутации: 1421/65
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   #10
AlDes
Member
 
Регистрация: 08.07.2016
Сообщений: 37
Вес репутации: 137/12
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   #11
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 813
Вес репутации: 1418/56
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 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 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, время: 19:20.


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