Arduino MEGA, Прерывания, pin 20, 21 постоянно 5 В

ragnar
Offline
Зарегистрирован: 29.11.2016

День добрый, господа программисты!

Использую в работе ардуино MEGA + Nextion. Мне необходимо использовать в программе внешние прерывания.

Работает два счетчика импульсов, аварийные датчики, кнопка аварийной остановки и т.д.

В целом станок работает замечательно. Но я заметил такую странную вещь-

на пин 20 и пин 21 постоянно присутствуют 5 В. Как бы я не пытался программно это исправить программно.

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

Вот код:

const byte Fault = 2;          //21 датчик обрыва  пленки

.........
void setup()
{
pinMode(Fault , INPUT_PULLUP);      //2(21) датчик обрыва   пленки//пробовал и pinMode(Fault , INPUT); 
.........
attachInterrupt(Fault, blink, RISING );   //При появлении единици запускает blink
.........

 Пробовал различные варианты, но единственный, при которов пропадает 5 В с этих пинов - это определение их как выходных(output).  Даже при загрузке пустого скейтча на пинах 0,1, 20, 21 постоянно 5 В. Объясните мне пожалуйста. В интернете не нашел ответа.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Простите, но INPUT_PULLUP (строка 6) как  раз и означает, что Вы программно приказываете, чтобы таб была логическая единица. А когда Вы при этом ешё и резистор 1К на землю цепляеете, Вы устраиваете через него постоянно текущий ток 5 мА.

ragnar
Offline
Зарегистрирован: 29.11.2016

Я в коментарии написал, что пробовал и так и так.  pinMode(Fault, INPUT), pinMode(Fault, INPUT_PULLUP). В ардуино IDE нет INPUT_PULLDOWN, к сожалению.

В коде ошибка, это я эксперементировал))

pinMode(Fault , INPUT); 

Если ставишь 

pinMode(Fault , OUTPUT);

То на порту ~0В. И иначе не получается

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если Вы напишете pinMode(Fault , INPUT);. то там будет более или менее случайное значение, зависящее от многих факторов (что находится рядом, какова насыщенность помех вокруг и т.п.) Попробуйте постоянно печатать это значение и, например, подносить и убирать руку, увидите. что значение меняется.

INPUT_PULLDOWN действительно нет (не в IDE, а в аппаратуре контроллера). Нужно либо построить всё так, что Вас устроит притяжка к питанию, либо притягивать к земле внешним резистором, что Вы и делаете. 1 КОм - можно, но уж больно круто. 4.7К обычно вполне хватает. Только не притягисвайте внешним резистором к земле одновременно с PULLUP - зачем?

ragnar
Offline
Зарегистрирован: 29.11.2016

Спасибо большое за разъяснение. С PULLUP я  понял. Поставлю резистор 4,7кОм. В наличии просто 500 Ом, 1кОм и 10 кОм))). Заказал, жду. 

По поводу случайности, вот у меня на столе 5 шт. MEGA. И 5 В на пинах 20 и 21 постоянно. На всех и при любых условиях. Заливал разные конфигурации, но факт остается фактом, только при определении этих пинов, как OUTPUT, на них ~0В. Больше на закономерность похоже. Пробовал с "обвесом" - с датчиками, подключенными частотниками, панелью и т.д. - все тоже самое. 5 Вольт постоянно((. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

Знаете как из транзистора КП303А делают искатель скрытой электропроводки? Оставлюят затвор болтаться в воздухе и таксают вдоль стены. Сантиметрах в 10-15 от провода под напряжением он начинает самопроизвольно открываться-закрываться с частотой электросети.

А по поводу резистора, ждать не обязательно. Попробуйте 10К. Если будет надёжно работать, то и ладно. Не будет - в принципе и 1К можно поставить, но там дилема: чем меньше резистор, тем надёжнее притяжка, но при этом тем больший паразитный ток на землю (т.е. если 5мА не перегрузит Ваш источник сигнала и система не от батарейки, то и хрен с ним, пусть 1К стоит).

ragnar
Offline
Зарегистрирован: 29.11.2016

Спасибо, понял. Попробую в документации еще порыться. Я хочу все-таки разобраться.

Все порты проверил. На нескольких контроллерах. Именно на этих стабильные 5В. 

Разберусь, отпишу.

По поводу резистора, к сожалению, с 10 кОм он не дает стабильного нуля. С 1 кОм на порту ~0,47 В, с 10 кОм ~2,2. Логическая единица от 2,3 вольт до 5. Вот у меня и проскакивает. Поставлю 4,7, т.к. хочу минимизировать паразитные токи.

ragnar
Offline
Зарегистрирован: 29.11.2016

Вот тут парень ,три года назад, тоже пытался решить этот вопрос https://forum.arduino.cc/index.php?topic=158434.0  Решается только аппаратно. Последние решение с LOW не очень то интересно.

 

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

жесть. для работы шины TWI обязательно нужны подтяжки на линиях. и на плате они установлены. хоть бы схему для начала посмотрели, пины у них "специфические". ))))

ragnar
Offline
Зарегистрирован: 29.11.2016

схему смотрел, но ток сейчас увидел перемычки эти. Спасибо

ragnar
Offline
Зарегистрирован: 29.11.2016

А как эти шины притянуть правильно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, а я что-то ступил, не обратил внимание, что это 20 и 21.

А чтоВы понимаете под "правильно"?

Правильно сейчас подключить Вашу периферию так. чтобы Вас интересовало прерывание не по RISING, а по FALLING и никак больше не притягивать. Это почти всегда возможно. 

Ну, или подключиться к другим пинам.

__Alexander
Offline
Зарегистрирован: 24.10.2012

del, уже ответили.

ragnar
Offline
Зарегистрирован: 29.11.2016

т.е. у меня постоянно на порту будет 5в, а при появлении сигнала я должен коротить на землю для образования нуля?

ragnar
Offline
Зарегистрирован: 29.11.2016

Я понял. Т.е. логического нуля я не увижу. Буду инвертировать.

__Alexander
Offline
Зарегистрирован: 24.10.2012

ЕвгенийП пишет:

Блин, а я что-то ступил, не обратил внимание, что это 20 и 21.

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

ragnar
Offline
Зарегистрирован: 29.11.2016

они через 10к резистор притянуты к +5в. в документации про прерывания могли бы написать. 

спасибо всем!

__Alexander
Offline
Зарегистрирован: 24.10.2012

ragnar пишет:

они через 10к резистор притянуты к +5в. в документации про прерывания могли бы написать. 

спасибо всем!

Сам понял что сказал? Причем тут документация контроллера к напаянной к нему на плате всякой обвязки. Линии RX/TX (0,1) тоже подтянуты, т.к. их подтягивает второй контроллер, который прошивает основной, так что, в документации на UART тоже об этом надо писать?

ragnar
Offline
Зарегистрирован: 29.11.2016

сам то понял. про пин 0,1 тоже в курсе. А в описании(на плату arduino MEGA) по прерываниям можно было указать, что 20,21 работают только по падающему фронту. Я, например, занимаюсь с ардуино 4 месяца и еще не все разобрал, так что не надо судить строго. Я новичок в этом деле. Что то получается, что то нет. Опыт приходит со временем.

__Alexander
Offline
Зарегистрирован: 24.10.2012

почему это только по спадающему? если замкнуть пин на землю а потом отпустить, то очень даже сработает и по нарастающему, логично?

ragnar
Offline
Зарегистрирован: 29.11.2016

абсолютно. у меня он почти так  сейчас так и работает через 1 кОм резистор порт притянут постоянно к земле, на нем 0.47В, сверху подается сигнал 5В, и происходит прерывание по нарастающему фронту.  Я выше писал.

я думал, что можно программно установить ноль на этом порту, но понял, после разъяснений , что нельзя

ragnar
Offline
Зарегистрирован: 29.11.2016

хотя, если его определить как OUPUT и digitalWrite(21,LOW), то на нем 0В. 

Вот по этому возникли вопросы

__Alexander
Offline
Зарегистрирован: 24.10.2012

ну если надо по нарастающему, то сними те два резистора (которые к питанию) да и делов, а на землю оставь.

ragnar
Offline
Зарегистрирован: 29.11.2016

там не два резистора. а однин 10к на 4 входа. две средних ноги мои. боюсь накосячить) лучше пусть как есть работает)) если только дорожку ведущую к питанию перерезать....

ragnar
Offline
Зарегистрирован: 29.11.2016

__Alexander, спасибо за совет! сам бы фиг догадался дорожку на плате перепилить. Теперь отлично работает.