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

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 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;     // если не соответствует условиям, то не включается.
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение ARV »

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

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

Сообщение ks0 »

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

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

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

Сообщение pyzhman »

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

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

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

Сообщение 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 раз.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

c=key2;

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

Сообщение 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 раза.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение Sel4 »

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

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

Сообщение А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;
Контактная информация:
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Сообщение Sel4 »

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

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

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

Сообщение Sel4 »

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

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

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

Сообщение Sel4 »

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

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

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

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

Сообщение Sel4 »

добавил

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

c= key1;
while (1)
    {
Но все равно при не нажатой кнопке после старта ахтунг
Но это уже на важно. Смысл такой будет - стартует программа и сразу же запускается помпа и если побежали импульсы,
то калим свечу и запускается топл насос.
Ответить

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