Arduino MEGA, Прерывания, pin 20, 21 постоянно 5 В
- Войдите на сайт для отправки комментариев
День добрый, господа программисты!
Использую в работе ардуино 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 В. Объясните мне пожалуйста. В интернете не нашел ответа.
Простите, но INPUT_PULLUP (строка 6) как раз и означает, что Вы программно приказываете, чтобы таб была логическая единица. А когда Вы при этом ешё и резистор 1К на землю цепляеете, Вы устраиваете через него постоянно текущий ток 5 мА.
Я в коментарии написал, что пробовал и так и так. pinMode(Fault, INPUT), pinMode(Fault, INPUT_PULLUP). В ардуино IDE нет INPUT_PULLDOWN, к сожалению.
В коде ошибка, это я эксперементировал))
Если ставишь
То на порту ~0В. И иначе не получается
Если Вы напишете pinMode(Fault , INPUT);. то там будет более или менее случайное значение, зависящее от многих факторов (что находится рядом, какова насыщенность помех вокруг и т.п.) Попробуйте постоянно печатать это значение и, например, подносить и убирать руку, увидите. что значение меняется.
INPUT_PULLDOWN действительно нет (не в IDE, а в аппаратуре контроллера). Нужно либо построить всё так, что Вас устроит притяжка к питанию, либо притягивать к земле внешним резистором, что Вы и делаете. 1 КОм - можно, но уж больно круто. 4.7К обычно вполне хватает. Только не притягисвайте внешним резистором к земле одновременно с PULLUP - зачем?
Спасибо большое за разъяснение. С PULLUP я понял. Поставлю резистор 4,7кОм. В наличии просто 500 Ом, 1кОм и 10 кОм))). Заказал, жду.
По поводу случайности, вот у меня на столе 5 шт. MEGA. И 5 В на пинах 20 и 21 постоянно. На всех и при любых условиях. Заливал разные конфигурации, но факт остается фактом, только при определении этих пинов, как OUTPUT, на них ~0В. Больше на закономерность похоже. Пробовал с "обвесом" - с датчиками, подключенными частотниками, панелью и т.д. - все тоже самое. 5 Вольт постоянно((.
Не, ну если там на плате рядом с пином какой-то источник помех, то он может и более-менее постоянно наводить. Попробуйте пальцем пина коснуться, думаю скакнёт на 0 - это нормально. Высокоимпедансный вход - это просто антенна.
Знаете как из транзистора КП303А делают искатель скрытой электропроводки? Оставлюят затвор болтаться в воздухе и таксают вдоль стены. Сантиметрах в 10-15 от провода под напряжением он начинает самопроизвольно открываться-закрываться с частотой электросети.
А по поводу резистора, ждать не обязательно. Попробуйте 10К. Если будет надёжно работать, то и ладно. Не будет - в принципе и 1К можно поставить, но там дилема: чем меньше резистор, тем надёжнее притяжка, но при этом тем больший паразитный ток на землю (т.е. если 5мА не перегрузит Ваш источник сигнала и система не от батарейки, то и хрен с ним, пусть 1К стоит).
Спасибо, понял. Попробую в документации еще порыться. Я хочу все-таки разобраться.
Все порты проверил. На нескольких контроллерах. Именно на этих стабильные 5В.
Разберусь, отпишу.
По поводу резистора, к сожалению, с 10 кОм он не дает стабильного нуля. С 1 кОм на порту ~0,47 В, с 10 кОм ~2,2. Логическая единица от 2,3 вольт до 5. Вот у меня и проскакивает. Поставлю 4,7, т.к. хочу минимизировать паразитные токи.
Вот тут парень ,три года назад, тоже пытался решить этот вопрос https://forum.arduino.cc/index.php?topic=158434.0 Решается только аппаратно. Последние решение с LOW не очень то интересно.
жесть. для работы шины TWI обязательно нужны подтяжки на линиях. и на плате они установлены. хоть бы схему для начала посмотрели, пины у них "специфические". ))))
схему смотрел, но ток сейчас увидел перемычки эти. Спасибо
А как эти шины притянуть правильно?
Блин, а я что-то ступил, не обратил внимание, что это 20 и 21.
А чтоВы понимаете под "правильно"?
Правильно сейчас подключить Вашу периферию так. чтобы Вас интересовало прерывание не по RISING, а по FALLING и никак больше не притягивать. Это почти всегда возможно.
Ну, или подключиться к другим пинам.
del, уже ответили.
т.е. у меня постоянно на порту будет 5в, а при появлении сигнала я должен коротить на землю для образования нуля?
Я понял. Т.е. логического нуля я не увижу. Буду инвертировать.
Блин, а я что-то ступил, не обратил внимание, что это 20 и 21.
Та я в свое время просто запомнил, что в отличии от армов, во всей серии avr при пустом контроллере ни на одной ноге не может быть никакой никуда подтяжки, онли хай-зед. ресет понятное дело не учитываем.
они через 10к резистор притянуты к +5в. в документации про прерывания могли бы написать.
спасибо всем!
они через 10к резистор притянуты к +5в. в документации про прерывания могли бы написать.
спасибо всем!
Сам понял что сказал? Причем тут документация контроллера к напаянной к нему на плате всякой обвязки. Линии RX/TX (0,1) тоже подтянуты, т.к. их подтягивает второй контроллер, который прошивает основной, так что, в документации на UART тоже об этом надо писать?
сам то понял. про пин 0,1 тоже в курсе. А в описании(на плату arduino MEGA) по прерываниям можно было указать, что 20,21 работают только по падающему фронту. Я, например, занимаюсь с ардуино 4 месяца и еще не все разобрал, так что не надо судить строго. Я новичок в этом деле. Что то получается, что то нет. Опыт приходит со временем.
почему это только по спадающему? если замкнуть пин на землю а потом отпустить, то очень даже сработает и по нарастающему, логично?
абсолютно. у меня он почти так сейчас так и работает через 1 кОм резистор порт притянут постоянно к земле, на нем 0.47В, сверху подается сигнал 5В, и происходит прерывание по нарастающему фронту. Я выше писал.
я думал, что можно программно установить ноль на этом порту, но понял, после разъяснений , что нельзя
хотя, если его определить как OUPUT и digitalWrite(21,LOW), то на нем 0В.
Вот по этому возникли вопросы
ну если надо по нарастающему, то сними те два резистора (которые к питанию) да и делов, а на землю оставь.
там не два резистора. а однин 10к на 4 входа. две средних ноги мои. боюсь накосячить) лучше пусть как есть работает)) если только дорожку ведущую к питанию перерезать....
__Alexander, спасибо за совет! сам бы фиг догадался дорожку на плате перепилить. Теперь отлично работает.