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

GPIO interrupt: Rising & Falling Edge два в одном

Процессор lpc1768, вроде бы давно вдоль и поперек изученный....

На ногу P2.0 повесили прерывания  Rising и Falling Edge и..... изредка приходят одновременно  оба.

Этого не может быть, потому что не может  быть никогда, но вот оно есть...
 

void EINT3_IRQHandler(void)
{
      if((LPC_GPIOINT->IO2IntStatR & 0x01) && (LPC_GPIOINT->IO2IntStatF & 0x01))
      {  приплыли - передний фронт в одном прерывании с задним
      }
}

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

if(LPC_GPIOINT->IO2IntStatR & 0x01)// пришел передний фронт
 	.....
else //иначе задний
  	....

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

Поделиться сообщением


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

2 minutes ago, evgen2 said:

Этого не может быть, потому что не может  быть никогда

Почему это? Пришел короткий импульс - получили оба события.

Поделиться сообщением


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

Тут, действительно, ни чего странного.

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

Мы и на stm-ке с этим пролетали )).

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

Мой коллега извращался, подключая один внешний сигнал на два разных пина МК и устанавливал в разных группах прерываний разные маски условий.  Но в итоге, всё равно, схематику переделывали ).

 

Поделиться сообщением


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

1 hour ago, evgen2 said:

Процессор lpc1768

Когда это он процессором-то стал?:blum:

1 hour ago, evgen2 said:

Этого не может быть, потому что не может  быть никогда, но вот оно есть..

Нет ничего такого в этом мире, чего не может быть никогда) А вы осциллом смотрели, что приходит на ногу? Без анализа электрического сигнала говорить о чём вообще нет смысла. Да и источник сигнала вы не описали. Может быть у него дребезг есть, или затухающие гармонические колебания по фронтам, которые запросто могут дать и передний и задний фронт для логической схемы.

Поделиться сообщением


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

50 minutes ago, alex_bface said:

Тут, действительно, ни чего странного.

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

Мы и на stm-ке с этим пролетали )).

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

Мой коллега извращался, подключая один внешний сигнал на два разных пина МК и устанавливал в разных группах прерываний разные маски условий.  Но в итоге, всё равно, схематику переделывали ).

 

ну вот в данном конкретном случае на входе сигнал, который меняется раз в три секунды. Я бы не сказал что это быстро. Вот эта хрень прилетает на конкретном логе на через 1.2 секунды после переднего фронта, а потом еще через 22 и 38 микросекунд... можно подумать, что это наводки, но какие-то эти наводки странные - времена появления - десятки секунд и никаких наводок таких, чтобы отдельно прилетали отдельные прерывания на передний и задний фронты. Ну и в лабораторных условиях все сигналы замечательные, а в боевых не подлезть с осциллографом

20 minutes ago, haker_fox said:

А вы осциллом смотрели, что приходит на ногу? Без анализа электрического сигнала говорить о чём вообще нет смысла. Да и источник сигнала вы не описали. Может быть у него дребезг есть, или затухающие гармонические колебания по фронтам, которые запросто могут дать и передний и задний фронт для логической схемы.

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

20 minutes ago, haker_fox said:

Когда это он процессором-то стал?

эээ... ну микроконтроллер, хотя так букв больше надо писать

 

Изменено пользователем evgen2

Поделиться сообщением


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

1 hour ago, aaarrr said:

Почему это? Пришел короткий импульс - получили оба события.

1. а разве аппаратной защиты от таких коротких импульсов нет, типа  нутряного конденсатора?

2. допустим, получили оба события. Что с ними делать дальше?  Можно смело игнорировать, т.к. два последовательных фронта не меняют состояние сигнала), или обязательно на состояние ноги  смотреть (как в том анекдоте про Красную шапочку, презерватив и карандаш)?

Поделиться сообщением


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

11 minutes ago, evgen2 said:

а разве аппаратной защиты от таких коротких импульсов нет, типа  нутряного конденсатора?

У некоторых МК есть цифровые фильтры на входах.

 

12 minutes ago, evgen2 said:

Можно смело игнорировать, т.к. два последовательных фронта не меняют состояние сигнала

Нельзя: их могло быть не 2, а, например, 5.

Поделиться сообщением


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

46 minutes ago, evgen2 said:

Но это вопрос про сигнал, а не про принципиальную возможность словить одновременно два фронта и как с этим дальше жить ;-)

Я работал недавно очень плотно с LPC1768, и как раз с прерываниями у меня проблем по пинам не было. Но и сигнал был по осциллу без дребезга и без звона. Пожалуй, единственная проблема: "асилить стописот" регистров для конфигурации портов. По-крайней мере именно на этом микроконтроллере. На других "энэкспишных" типа LPC4337 всё гораздо более понятно... Но это уже субъективности.

16 minutes ago, evgen2 said:

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

Внутри микроконтроллера? Если так, то нет, конечно, у данной модели МК нет) Тогда бы ещё и нутрянной резистор понадобился. И биты конфигурации для постоянной времени у всего этого хозяйства.

16 minutes ago, evgen2 said:

2. допустим, получили оба события.

ЗНаете, я делал схему дискретного входа, который должен был ловить состояние высоковольтного выключателя на подстанции. Концевик там был качественный, германский) Но как и любой контакт дребезжал. А даже если и не дребезжал, т.е. не переключался, различные помехи умудрялись вызывать прерывание, хоть и изредко. Дело в том, что кабель до щита управления выключателем уложен в подземном канале, длина метров двадцать, и там куча других кабелей телемеханики и автоматики. Я отказался от прерываний. Сделал таймерное прерывание и отслеживал состояние на пине скользящим окном. Так вышло очень надёжно. За полтора года ни одного ложного события.

19 minutes ago, evgen2 said:

Можно смело игнорировать

Нет. Так точно делать нельзя. Делайте лучше без прерывания.

Поделиться сообщением


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

9 minutes ago, haker_fox said:

Внутри микроконтроллера? Если так, то нет, конечно, у данной модели МК нет) Тогда бы ещё и нутрянной резистор понадобился. И биты конфигурации для постоянной времени у всего этого хозяйства.

ну, нутряные-то резисторы уже есть..

11 minutes ago, haker_fox said:

Нет. Так точно делать нельзя. Делайте лучше без прерывания.

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

Поделиться сообщением


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

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

ну вот в данном конкретном случае на входе сигнал, который меняется раз в три секунды. Я бы не сказал что это быстро.

А что именно вас удивляет? При изменении входного сигнала получаете 2 прерывания? Ну так если на входе нет гистерезиса, так это вполне ожидаемое явление.

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

Вот эта хрень прилетает на конкретном логе на через 1.2 секунды после переднего фронта, а потом еще через 22 и 38 микросекунд... можно подумать, что это наводки

Если "прилетает" тогда, когда вроде не было изменения входного сигнала (не должно было быть), то это видимо наводка - трясите своего схемотехника.

Если "прилетает" несколько срабатываний при одном изменении на входе - трясите программиста. Чтобы писал обработку грамотно и давил дребезг.

Поделиться сообщением


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

21 minutes ago, jcxz said:

А что именно вас удивляет? При изменении входного сигнала получаете 2 прерывания? Ну так если на входе нет гистерезиса, так это вполне ожидаемое явление.

прерывание-то как раз одно, только с двумя прямо противоположными флагами

23 minutes ago, jcxz said:

Если "прилетает" тогда, когда вроде не было изменения входного сигнала (не должно было быть), то это видимо наводка - трясите своего схемотехника.

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

 

25 minutes ago, jcxz said:

Если "прилетает" несколько срабатываний при одном изменении на входе - трясите программиста. Чтобы писал обработку грамотно и давил дребезг.

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

Поделиться сообщением


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

26 минут назад, evgen2 сказал:

прерывание-то как раз одно, только с двумя прямо противоположными флагами

Пускай так, ну и что? Странно, что это вызывает удивление....

Цитата

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

1) Убираете источник сигнала, замыкаете ногу МК на GND непосредственно возле корпуса, убеждаетесь в отсутствии прерываний в течение длительного времени.

2) То же самое, но без замыкания на GND и при условии отсутствия импульсов от источника сигнала. Опять - долго наблюдаете (вместе со смехотехником!), и проверяете - есть ли прерывания?

Если в 1-м случае прерываний нет, а 2-м - есть, то смехотехнику будет не отвертеться.

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

Цитата

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

А что там сложного?

Например: По получению прерывания по изменению на ноге, запрещаем прерывания от ноги, запускаем таймер на выдержку некоторого интервала времени (debounce time), по завершению интервала таймер выключаем, прерывания от ноги разрешаем. Всё.

Естественно - делаем это всё аккуратно, с очистками флагов накопленных событий/прерываний перед разрешением, задействуя голову по максимуму.

Поделиться сообщением


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

1 hour ago, jcxz said:

Например: По получению прерывания по изменению на ноге, запрещаем прерывания от ноги, запускаем таймер на выдержку некоторого интервала времени (debounce time), по завершению интервала таймер выключаем, прерывания от ноги разрешаем. Всё.

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

Поделиться сообщением


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

2 hours ago, evgen2 said:

не, без прерывания все плохо,

А какие временные параметры сигнала? Частота? Опишите задачу подробнее, если это не военная тайна. Может быть что-нибудь сможем вам порекомендовать.

Поделиться сообщением


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

2 часа назад, aaarrr сказал:

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

Достоверное значение сигнала? Его лучше всего защёлкнуть после успокоения (завершения дребезга). Т.е. - внутри ISR таймера.

А можно для надёжности вообще сделать подобно UART.RX: сделать три таких выдержки и в конце каждой защёлкивать значение и считать его валидным только когда все 3 совпадут.

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

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