Состояние пинов на UNO и Pro Mini

Тема в разделе "Arduino & Shields", создана пользователем AlexAxel, 5 июн 2017.

  1. AlexAxel

    AlexAxel Нерд

    Имеется скетч вот такого вида
    Код (C++):

    int i = 0;
    void setup()
    {
    Serial.begin(9600);
    pinMode(5,INPUT);
    }

    void loop()
    {
    i=digitalRead(5);
    Serial.println(i);
    delay(500);
    }
    Простая штука, которая показывает HIGH на пине или LOW

    Так вот: на UNO переменная i стабильно показывает 0 (суть LOW), а на Pro Mini 5v 168 - стабильно 1, сиречь HIGH. Что с подтягивающим резистором (10кОм, если существенно), что без оного. Две разные платы Pro Mini пробовал. И какой цифровой пин не выставлял бы на проверку - результат одинаков. На UNO все изюмительно, на Pro Mini рыдать хочется. Тестер показывает напряжение 1.7-1.8 В на пинах

    Почему так происходит и как можно попробовать побороть?
     
  2. rkit

    rkit Гуру

    Схему
     
  3. rkit

    rkit Гуру

    Это зона гистерезиса. За LOW считается <1,5.за HIGH >3
     
  4. DetSimen

    DetSimen Guest

    чтобы состояние пина было жоско детерминировано, и используют подтяжку. Либо к земле, либо к +
     
  5. AlexAxel

    AlexAxel Нерд

    11111.jpg

    примерно так. Если возникает вопрос о странности схемы - на конечном устройстве работа будет производиться в зависимости от того, на какой из пинов с помощью джампера при загрузке будет подано напряжение от 5В. Конкретно в этой конфигурации подключения имею ситуацию, описанную в стартовом посте. С UNO проблем не возникает - при замыкании джампера на любой из пинов там появляется HIGH , и все идет как надо. А в Mini система считает что на всех пинах HIGH сразу и без всяких джамперов, хотя фактическое напряжение меньше 2 В.
     
  6. AlexAxel

    AlexAxel Нерд

    Так в том и дело, что подтяжку на - делал. Или ему 10 кОм мало?
     
  7. rkit

    rkit Гуру

    Выставляете режим пина iNPUT_PULLUP, замыкаете джампером на землю, читаете про подключение кнопки.
     
  8. mcureenab

    mcureenab Гуру

    Пины работают без гистерезиса. Напряжение выше порога, получаем HIGH, ниже того же порога, получаем LOW. Порог лежит в зоне неопределенности.
     
    Последнее редактирование: 5 июн 2017
  9. rkit

    rkit Гуру

    Нет. Читайте даташит. В пины встроен триггер шмидта с четко описанными порогами, которые я озвучил для Vcc=5.
     
  10. mcureenab

    mcureenab Гуру

    Хм. В самом деле триггер Шмитта на входе пина нарисован. Спасибо!
     
  11. Да, на схеме нарисован. Тогда зачем здесь http://wiki.amperka.ru/конспект-arduino:перетягивание-каната
    используется внешняя микросхема?
    Измерить гистерезис пробовал - получилось ~0.15В, что заведомо меньше изображенного на графике 31-27 даташита. Также измерял у PIC'а (по-моему 16F630, но не уверен) - у него гораздо больше, но триггер шмитта есть не у каждого пина.
     
  12. rkit

    rkit Гуру

    Да, у меня тоже получился гистерезис меньше заявленного. Но, тем не менее, он есть.
    Пила - 3.3в, заштрихованное - заявленный гистерезис, меандр - показания digitalRead.
    upload_2017-6-5_21-4-22.png

    Код (C++):
    #include <Arduino.h>

    void setup(){
      Serial.begin(115200);
      fdevopen([](char c, FILE *) {return (int)Serial.write(c);}, 0);
      pinMode(A0, INPUT);
    }
    bool i = 0;
    void loop(){
      i = !i;
      printf("%d\t%d\t%d\n", analogRead(A0), 307 + i * 307, digitalRead(A0) * 1000);
      delay(5);
    }
     
    Последнее редактирование: 5 июн 2017
  13. mcureenab

    mcureenab Гуру

    Больше смахивает на задержку по времени. Какая частота пилы?
     
  14. rkit

    rkit Гуру

    1Гц
    Всё правильно и синхронно.
     
  15. mcureenab

    mcureenab Гуру

    Действительно, небольшой гистерезис есть. На Leonardo от USB пин A0 digitalRead и analogRead:

    Starting...
    327
    305
    329
    305
    328
    305
    328
    305
    329
    305
    328
    306
    328
    305
    328
    305

    Код (C++):
    void setup() {
      // put your setup code here, to run once:
      pinMode(13, OUTPUT);
      Serial.begin(250000);
      while(!Serial){  }
      Serial.println(F("Starting..."));
    }

    void loop() {
      // put your main code here, to run repeatedly:
      static uint8_t dv1 = LOW;
      uint8_t dv2 = digitalRead(A0);
      if ( dv1 != dv2 )
      {
        Serial.println(analogRead(A0));
        digitalWrite(13, dv2);
        dv1 = dv2;
      }
    }
    Примено 0.11 Вольт петля.
     
  16. Посмотрел свои записи, PIC12F675, питание скорее всего 5В (не записал, но нет у меня источников меньшего напряжения):
    GPIO.2 - гистерезис 2.74В - 1.32В
    GPIO.5 - переключается туда-сюда примерно при 1.15В

    Вопрос про внешний триггер Шмитта пока остается без ответа, у него измеренный гистерезис 2.64В - 1.83В.