Служебный контроль лог уровня пина.

Тема в разделе "Микроконтроллеры AVR", создана пользователем MESS, 14 май 2014.

  1. MESS

    MESS Гик

    У меня есть скетч, работавший на столе нормально. Но когда я встроил ардуино в реальный девайс (макет элеватора)- появились глюки, связанные с наводками или помехами (это я так мыслю - могу ошибаться).
    Борьбу с помехами я до того уже проделал - на каждй вход поставил делитель напряжения с 24 на 5В. Даже емкости подключал. но после некоторого "прогрева"произвольно появляется ложный сигнал на движение.
    Мне нужно контролировать состояние пина во времени - если появился ложный сигнал - на
    lcd должна появиться звездочка в определенном месте ( для каждого пина свое знакоместо).
    Я не владею программированием и у меня не скомпилировался контроль пинов

    if(digitalRead(pin52) = 1)
    lcd.setCursor(12, 0);
    lcd.print("* ");
    else lcd.clear();
    if(digitalRead(pin50) = 1)
    lcd.setCursor(1,1);
    lcd.print("* ");
    else lcd.clear();
    подскажите как это сделать.
    Привожу свой скетч:
    PHP:

    //Корректировка  7мая после второго включения . pinы упорядочены под удобство разводки шилда
    #include <LiquidCrystal.h>    
    LiquidCrystal lcd( 6,7,8,9,10,11);

    //  группа входных сигналов. на каждый пин делитель 24/5Вольт
    #define pinN  50 // включение привода  вниз

    #define pinV  52 // включение привода  вверх


    #define pinTR 36 // включение ТОРМОЗА

    // группа выходных сигналов. каждый к ЭЭЛ через 1-2кОм: разъем однорядный

    #define VN 3 // датчик замедления

    #define TO 4 // датчик точной остановки

    //#define VV 5

    #define DHE  24 // сработал датчик низа

    #define DVE  26 // сработал датчик верха


    #define DEL_1 150 // длительность импульса

    #define DEL_2 250 // задержка между импульсами

    #define DEL_3 100 // задержка между пачками импульсов

    #define DEL_4 100 // задержка  крайних  датчиков
    byte pins[2] = {TO, VN};
    //byte pins[3] = {VV, TO, VN};
    char state = 1;

    int door = 3;
    void setup()
    {
      Serial.begin(9600);

      lcd.begin(16, 2); // включается дисплей

      screenInit();

      delay(500);

      pinMode(VN, OUTPUT);

      pinMode(TO, OUTPUT);

      //pinMode(VV, OUTPUT);

      pinMode(DHE, OUTPUT);

      pinMode(DVE, OUTPUT);

      //digitalWrite(VV, 1);

      digitalWrite(TO, 1);

      digitalWrite(VN, 1);

      Display();}
    void loop(){


    //****************************************************
    if(digitalRead(pinTR) == 1)
    {
    if(digitalRead(pinV) == 1) // условие  движения вверх  ПРОБЛЕМА -помеха!!
    {
    if(door < 16)
    {
    state++;
    if(state == 4) state = 0;
    State(state);
    }
    }
    if(digitalRead(pinN) == 1) // условие  движения вниз
    {
    if(door > 1)
    {
    state--;
    if(state == -1) state = 3;
    State(state);
    }}}

    //****************************************************

    }
    void State(byte state)
    {
      if(state)
      {    static char flag = 0;
        if(state == 2)
        {
          door += flag;
          Display();
          Serial.println(door);
          flag = 0;
        }
        else if(state == 1) flag = 1;

        else if(state == 3) flag = -1;

        byte pin = pins[state-1];

        digitalWrite(pin, 0);

        delay(DEL_1);

        digitalWrite(pin, 1);

        if(state == 1 || state == 3)//вводим крайние датчики
        {

          delay(DEL_2 - DEL_4);

          if(door == 2) digitalWrite(DHE, 1);

          else digitalWrite(DHE, 0);

          if(door == 15) digitalWrite(DVE, 1);

          else digitalWrite(DVE, 0);

          delay(DEL_4);
        }
        else delay(DEL_2);
      }
      else delay(DEL_3);}
    void Display()
    {
      lcd.clear();

      lcd.setCursor(2, 1);

      lcd.print("door ");

      lcd.setCursor(8, 1);

      if(door < 10) lcd.print(' '); // обеспечиваем несмещение текста

      lcd.print(door);

      if(door == 1)
      {
        lcd.setCursor(1, 1);

        lcd.print("DNE");
      }
      if(door == 16)
      {
        lcd.setCursor(1, 1);

        lcd.print("DVE");
      }}
    // заставка при включении
    void screenInit()
    {
      lcd.clear();
      lcd.setCursor(3, 0);
      lcd.print("=ELEVATOR=");
      delay(2000);
    }
     
  2. MESS

    MESS Гик

    Вопрос снят- решение найдено:
    lcd.setCursor(12, 0);
    lcd.print("50=");
    lcd.print(digitalRead( 50) );
     
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    а как МК узнает, что сигнал ложный?
     
  4. MESS

    MESS Гик

    Я неточно выразился. У меня один из входов, обвязанный как положено, реагировал как на сигнал помехи. В скетче есть условие "И"наличия двух единиц одновременно для начала движения.
    if(digitalRead(pinTR)==1){
    if(digitalRead(pinV)==1) И мне нужно было узнать какой из них выдает ложную "1".
    Как оказалось, глюк был из-за брака в металлизации отверстия шилда. http://forum.amperka.ru/threads/Пайка-на-proto-shield.3057/#post-23991
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Код (Text):
    if(digitalRead(pinTR)==1){
      if(digitalRead(pinV)==1)
      {
        ...
      }
    }
    ==
    Код (Text):
    if(digitalRead(pinTR)==1 && digitalRead(pinV)==1) {
      ...
    }
     
    CryNET нравится это.
  6. ИгорьК

    ИгорьК Гуру

    Или еще короче (?):
    Код (Text):
    if(digitalRead(pinTR) && digitalRead(pinV)) {
      ...
    }
     
    Megakoteyka нравится это.
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Можно. Но я в итоге пришел к записям вида x == true как более наглядным. Понять смысл можно при любой записи, но так оно сразу в глаза бросается. То же самое с разделением отдельных по смыслу кусочков кода пустыми строками - можно писать и сплошняком, но с пустыми строчками оно лучше в глаза бросается.
    В общем, дело вкуса :)
     
    Tomasina и Mitrandir нравится это.