Помогите с алгоритмом)

Обсуждаем контроллеры компании Atmel.
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Помогите с алгоритмом)

Сообщение Sel4 »

Здравствуйте, коллеги))
ПРошу помощи в алгоритме.
Есть датчик протока, в ём стоит элемент Холла.(такой, как в вентиляторах компьютерных) На крыльчатке два магнитика.
По остановке протока остановиться датчик может выдавая или "0", или "1". (Если магнитик остановиться возле Холла или же если на расстоянии от него.)

Нужно остслеживать переключение из "1" в "0" и обратно, т.е. фиксировать изменения. Если меняется, то значит все норм.
А если остановилось или на "0" или на "1" более, чем на 500000 тиков счетчика, то выдавать ахтунг куда-нить, в данном случае переключать PORTC PC0.
Как обнаружиться изменение на канале датчика, так ахтунг отключается.

Так вот не пойму никак - обе части данного алгоритма работают как взаимоисключающие..
В итоге не работает как надо. Помогите разобраться.

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

#define key1 (bit_is_set(PORTC, PC0))
#define key2 (bit_is_clear(PORTC, PC0))

#define pump_on PORTB |= (1<<PB0)
#define pump_off PORTB &= ~(1<<PB0)



if(key1)  //если на пине "1"
 {
 if(++ count1 >=500000)    // и если "1" задержалась там на более, чем 500000
pump_on ;  count1=0;        // то  что то там включается и счетчик обнуляется
}
 else pump_off,  count1=0;     // если не соответствует условиям, то не включается.

//без этой части работает от "1"..

if(key2)  //если на пине "0"
 {
 if(++ count1 >=500000)    // и если "0" задержался там на более, чем 500000
pump_on ;  count1=0;        // то  что то там включается и счетчик обнуляется
}
 else pump_off,  count1=0;     // если не соответствует условиям, то не включается.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение Аlex »

т.е. фиксировать изменения
Дак и ловите именно их, а не опрашивайте порт на "0" или "1".
Прочитали порт -> сравнили с предыдущим значением -> сохранили текущее значение порта, которое будет для следующего цикла опроса - предыдущим.
Если, при сравнении с предыдущим, значения разные - было изменение.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
ks0
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт фев 28, 2013 14:16:10

Re: Помогите с алгоритмом)

Сообщение ks0 »

В прерывании по изменению уровня сбрасывать таймер на 0, в прерывании по переполнению таймера ахтунг
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение Аlex »

Уважаемые. Зачем внешнее прерывание ? У него временные интервалы "бешеные".
Простой опрос состояния ПИНа, через определённые интервалы времени.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение pyzhman »

Аlex писал(а):через определённые интервалы времени.

Может попасть в фазу с датчиком.
Обычное решение проблемы тс - установка таймаута. Тот же таймер, сбрасываемый фронтом датчика. Если достиг определенного значения, значит алес, приплыли, выдаем ахтунг.
Docendo discimus
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение Аlex »

pyzhman писал(а):Может попасть в фазу с датчиком.
Ну интервал же нужно выбирать сразу заведомо меньше входного сигнала.
Если, предположим, при максимальной выходной частоте с датчика, импульс будет = 10 мс. , то сделай опрос через каждую 1 мс. , и не будет никаких проблем. Изменение состояние по-любому поймается.
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Re: Помогите с алгоритмом)

Сообщение Sel4 »

Вот так вроде как работает, (в протеусе) но чуть подтупливает - после сработки не всегда по первому изменению выходит.
Может кто предложит что проще? ))

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

#define key2 (bit_is_set(PINC, PC0))
#define key1 (bit_is_clear(PINC, PC0))

_____________


b=key1;
c=key2;

if(key2)  Переключилось в 1
{     
 if((++count1 >=500000)&&(key2))       // и если "1" задержалась там на более, чем 500000
pump_on;           //включается что то там.
if(c!=key2)                        //если пришло изменение,
count1 =0, pump_off;                    //то скидывается счетчик и ахтунг
}


if(key1)
{     
 if((++count1 >=500000)&&(key1))   // и если "1" задержалась там на более, чем 500000
pump_on;
if(b!=key1)
count1 =0, pump_off;
}
Последний раз редактировалось Sel4 Вт май 12, 2015 20:27:54, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение Аlex »

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

c=key2;

if(key2)  Переключилось в 1
{
........
if(c!=key2)                        //если пришло изменение,
Посмотрите внимательнее, условие (c!=key2) не сработает практически никогда. Только когда изменение произойдёт между c=key2; и этим условием, что очень маловероятно.
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Re: Помогите с алгоритмом)

Сообщение Sel4 »

Аlex писал(а):

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

c=key2;

if(key2)  Переключилось в 1
{
........
if(c!=key2)                        //если пришло изменение,
Посмотрите внимательнее, условие (c!=key2) не сработает практически никогда. Только когда изменение произойдёт между c=key2; и этим условием, что очень маловероятно.


В протеусе , однако ж , работает ))
Если c не будет то же, что и key2, т.е если произойдет изменение и вместо key2 будет уже key1, т.е переключится датчик, то скидывается счетчик )
Последний раз редактировалось Sel4 Вт май 12, 2015 21:39:31, всего редактировалось 2 раза.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение Аlex »

Sel4 писал(а):Если c не будет то же, что и key2, т.е если произойдет изменение и вместо key2 будет уже key1, т.е переключится датчик, то скидывается счетчик )
Я это понял. Но между c=key2; и if(c!=key2) проходит очень мало времени, а значит шанс, что изменение попадёт именно в этот момент - невелик.
Кстати, где этот кусок находится в программе ? Есть ли ещё чего в ней ?
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Re: Помогите с алгоритмом)

Сообщение Sel4 »

Уменьшил с 500000 до 200000, глюки пропали, вероятно протеус тупит ))
Рабобтает, всем спасибо!! Улучшайзеры принимаются канеш ))

А программы как таковой не открыто, это пока просто кусок кода для защиты уже действующей программы управления котлом дизельным - как проток встал, так включается подпрограмма завершения работы, чтобы котел не поплавился.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение Аlex »

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

#define key1 (bit_is_set(PINC, PC0))

_____________

b=key1;
if(b!=c) count1=500000;
if(count1){
  count1--;
  pump_on;
}
else{
  pump_off;
}
c=b;
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Re: Помогите с алгоритмом)

Сообщение Sel4 »

Как - то не догнал малость суть))
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение Аlex »

Это альтернатива Вашему куску кода. Вот и вся суть :)
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Re: Помогите с алгоритмом)

Сообщение Sel4 »

оно сразу включает ахтунг почему-то ))
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение Аlex »

А включить ахтунг - это pump_on ? Тогда поменяйте местами pump_on и pump_off.
Я думал это включение и выключение какой-то помпы, которую нужно выключить, если не приходят импульсы на протяжении какого-то времени.
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Re: Помогите с алгоритмом)

Сообщение Sel4 »

О, а так да, работает )) Спасибо большое)) pump - то просто что под руку подвернулось ))
Только бы понять, как работает ))

И мой, закомментированный и ваш варианты))
Вложения
Pump_achtung.zip
(64.64 КБ) 130 скачиваний
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Помогите с алгоритмом)

Сообщение Аlex »

Добавьте ещё вначале, перед основным циклом Чтобы запоминалось начальное значение с датчика, при запуске программы.
Иначе, если сейчас нажать на кнопку и, держа её нажатой, запустить МК, то "включится ахтунг" :)
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Re: Помогите с алгоритмом)

Сообщение Sel4 »

добавил

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

c= key1;
while (1)
    {

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

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