Jump to content

    
Sign in to follow this  
evgen2

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

Recommended Posts

Процессор 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 //иначе задний
  	....

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
1 hour ago, evgen2 said:

Процессор lpc1768

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

1 hour ago, evgen2 said:

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

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

Share this post


Link to post
Share on other sites
50 minutes ago, alex_bface said:

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

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

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

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

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

 

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

20 minutes ago, haker_fox said:

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

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

20 minutes ago, haker_fox said:

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

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

 

Edited by evgen2

Share this post


Link to post
Share on other sites
1 hour ago, aaarrr said:

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

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

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

Share this post


Link to post
Share on other sites
11 minutes ago, evgen2 said:

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

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

 

12 minutes ago, evgen2 said:

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

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

Share this post


Link to post
Share on other sites
46 minutes ago, evgen2 said:

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

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

16 minutes ago, evgen2 said:

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

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

16 minutes ago, evgen2 said:

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

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

19 minutes ago, evgen2 said:

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

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

Share this post


Link to post
Share on other sites
9 minutes ago, haker_fox said:

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

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

11 minutes ago, haker_fox said:

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

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

Share this post


Link to post
Share on other sites
1 час назад, evgen2 сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
21 minutes ago, jcxz said:

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

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

23 minutes ago, jcxz said:

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

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

 

25 minutes ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites
26 минут назад, evgen2 сказал:

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

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

Цитата

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

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

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

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

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

Цитата

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

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites
2 hours ago, evgen2 said:

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

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

Share this post


Link to post
Share on other sites
2 часа назад, aaarrr сказал:

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this