Статическая индикация на примере светодиодного модуля индикации

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

Модератор: Алаев Ян

Аватара пользователя
Алаев Ян
Основатель Форума
Сообщения: 2339
Зарегистрирован: 19 мар 2014, 12:05
Откуда: Саратов
Благодарил (а): 29 раз
Поблагодарили: 16 раз
Контактная информация:

Статическая индикация на примере светодиодного модуля индикации

#1

Сообщение Алаев Ян » 06 фев 2017, 13:17


Содержание
Показать
1. Скетч для работы с модулем индикации на примере Arduino viewtopic.php?f=79&t=317&p=13796#p13796
2. Принципиальная схема, фото железа и схемы подключений viewtopic.php?f=16&t=317&p=22692#p22692
За это сообщение автора Алаев Ян поблагодарил:
poty
Рейтинг: 33.3%
 

Аватара пользователя
Алаев Ян
Основатель Форума
Сообщения: 2339
Зарегистрирован: 19 мар 2014, 12:05
Откуда: Саратов
Благодарил (а): 29 раз
Поблагодарили: 16 раз
Контактная информация:

Скетч для работы с модулем индикации на примере Arduino

#2

Сообщение Алаев Ян » 28 июл 2017, 11:44

Если для статической индикации вы используете сдвиговые регистры 74HC164 (как в нашем модуле индикации), то можно использовать скетч, приведенный ниже:

Код: Выделить всё

//Прошивка для вывода измеренного значения на универсальный
//светодиодный индикатор "Алаев и Ко" Лаб. http://www.alaev.org/

int latchPin = 10;//сигнал Ready
int clockPin = 12;//сигнал Clock
int dataPin = 11;//cигнал Data

int x1;
int x2;
int x3;
int x4;

int pot;
     
float temp = -0.258;//величина, выводимая на индикатор

float temp_minus;//буферная переменная для вычисления отрицательных чисел

const byte digit[] =      //seven segment digits in bits
{  
B00111111, //0 
B00000110, //1  
B01011011, //2  
B01001111, //3  
B01100110, //4  
B01101101, //5  
B01111101, //6  
B00000111, //7  
B01111111, //8  
B01101111  //9
};

//B01110110  //H
//B00010000  //i
//B00111000  //L
//B01011100  //o

void setup(){

  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
}

void loop(){
  
  if(temp >= 0.0){//если число положительное
    if(temp > 9999.0){//если число выходит за верхний предел
      digitalWrite(latchPin, LOW);
     
      shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-
      shiftOut(dataPin, clockPin, MSBFIRST, B00010000);//i
      shiftOut(dataPin, clockPin, MSBFIRST, B01110110);//H
      shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-

      digitalWrite(latchPin, HIGH);      
    }
      else{
        if(temp >= 1000.0){
          pot = int(temp);
      
          x4 = pot/1000;
          x3 = (pot/100)%10;
          x2 = (pot/10)%10;
          x1 = pot%10; 
     
          digitalWrite(latchPin, LOW);
     
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]);

          digitalWrite(latchPin, HIGH);
        } 
        else {
          if(temp >= 100.0){
            pot = int((temp + 0.05) * 10.0);
      
            x4 = pot/1000;
            x3 = (pot/100)%10;
            x2 = (pot/10)%10;
            x1 = pot%10;
       
            digitalWrite(latchPin, LOW);
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]|B10000000);//ставим точку
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]);

            digitalWrite(latchPin, HIGH);       
          } 
          else{
            if(temp >= 10.0){
              pot = int((temp + 0.005) * 100.0);
      
              x4 = pot/1000;
              x3 = (pot/100)%10;
              x2 = (pot/10)%10;
              x1 = pot%10;
       
              digitalWrite(latchPin, LOW);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]|B10000000);//ставим точку
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]);

              digitalWrite(latchPin, HIGH);  
            }
            else{
              if(temp >= 0.0){
                pot = int((temp + 0.0005) * 1000.0);
      
                x4 = pot/1000;
                x3 = (pot/100)%10;
                x2 = (pot/10)%10;
                x1 = pot%10;
       
                digitalWrite(latchPin, LOW);
                shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
                shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
                shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
                shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]|B10000000);//ставим точку

                digitalWrite(latchPin, HIGH);  
              }                                 
            }  
          }
        }
    }//конец чисел в диапазоне
  }//конец положительных чисел
  else {//если число отрицательное
    if(temp < -999.0){//если число выходит за нижний предел
      digitalWrite(latchPin, LOW);
     
      shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-
      shiftOut(dataPin, clockPin, MSBFIRST, B01011100);//o
      shiftOut(dataPin, clockPin, MSBFIRST, B00111000);//L
      shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-

      digitalWrite(latchPin, HIGH);
    }
      else{
        if(temp <= -100.0){
          temp_minus = abs(temp);
          pot = int(temp_minus + 0.05);
      
          x4 = pot/1000;
          x3 = (pot/100)%10;
          x2 = (pot/10)%10;
          x1 = pot%10; 
     
          digitalWrite(latchPin, LOW);
     
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
          shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-

          digitalWrite(latchPin, HIGH);
        } 
        else {
          if(temp <= -10.0){
            temp_minus = abs(temp);
            pot = int((temp_minus + 0.005) * 10.0);
      
            x4 = pot/1000;
            x3 = (pot/100)%10;
            x2 = (pot/10)%10;
            x1 = pot%10;
       
            digitalWrite(latchPin, LOW);
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]|B10000000);//ставим точку
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
            shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-

            digitalWrite(latchPin, HIGH);       
          } 
          else{
            if(temp < 0.0){
              temp_minus = abs(temp);
              pot = int((temp_minus + 0.0005) * 100.0);
      
              x4 = pot/1000;
              x3 = (pot/100)%10;
              x2 = (pot/10)%10;
              x1 = pot%10;
       
              digitalWrite(latchPin, LOW);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]|B10000000);//ставим точку
              shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-

              digitalWrite(latchPin, HIGH);  
            }
          }
        }
    }//конец чисел в диапазоне  
  }//конец отрицательных чисел

  delay(1000);
  
}//конец цикла
Вышеприведенный код работает с числовыми значениями в диапазоне -999...9999 с автоматической установкой разделительной точки в положение максимальной разрядности измеренного значения. В случае, если измеренное значение выходит за допустимый диапазон индикации, на индикаторе появляется соответствующее сообщение об ошибке. Приведенный код является шаблоном, который вы можете использовать для создания собственных проектов.
74HC164.pdsprj
Файл симуляции в Proteus
(20.01 КБ) 31 скачивание
74HC164.jpg
Симуляция работы 74HC164 в Proteus
Если для статической индикации вы используете сдвиговые регистры 74HC595 (с защелками), то можно использовать скетч, приведенный ниже:

Код: Выделить всё

//Прошивка для вывода измеренного значения на универсальный
//светодиодный индикатор "Алаев и Ко" Лаб. http://www.alaev.org/

int latchPin = 10;//контакт ST_CP на сдвиговом регистре 74HC595
int clockPin = 12;//контакт SH_CP на сдвиговом регистре 74HC595
int dataPin = 11;//контакт DS на сдвиговом регистре 74HC595

int x1;
int x2;
int x3;
int x4;

int pot;
     
float temp = 69.96;//величина, выводимая на индикатор

float temp_minus;//буферная переменная для вычисления отрицательных чисел

const byte digit[] =      //seven segment digits in bits
{  
B00111111, //0 
B00000110, //1  
B01011011, //2  
B01001111, //3  
B01100110, //4  
B01101101, //5  
B01111101, //6  
B00000111, //7  
B01111111, //8  
B01101111  //9
};

//B01110110  //H
//B00010000  //i
//B00111000  //L
//B01011100  //o

void setup(){

  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
}

void loop(){
  
  if(temp >= 0.0){//если число положительное
    if(temp > 9999.0){//если число выходит за верхний предел
      digitalWrite(latchPin, LOW);
     
      shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-
      shiftOut(dataPin, clockPin, MSBFIRST, B00010000);//i
      shiftOut(dataPin, clockPin, MSBFIRST, B01110110);//H
      shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-

      digitalWrite(latchPin, HIGH);
    }
      else{
        if(temp >= 1000.0){
          pot = int(temp);
      
          x4 = pot/1000;
          x3 = (pot/100)%10;
          x2 = (pot/10)%10;
          x1 = pot%10; 
     
          digitalWrite(latchPin, LOW);
     
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]);

          digitalWrite(latchPin, HIGH);
        } 
        else {
          if(temp >= 100.0){
            pot = int((temp + 0.05) * 10.0);
      
            x4 = pot/1000;
            x3 = (pot/100)%10;
            x2 = (pot/10)%10;
            x1 = pot%10;
       
            digitalWrite(latchPin, LOW);
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]|B10000000);//ставим точку
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]);

            digitalWrite(latchPin, HIGH);       
          } 
          else{
            if(temp >= 10.0){
              pot = int((temp + 0.005) * 100.0);
      
              x4 = pot/1000;
              x3 = (pot/100)%10;
              x2 = (pot/10)%10;
              x1 = pot%10;
       
              digitalWrite(latchPin, LOW);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]|B10000000);//ставим точку
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]);

              digitalWrite(latchPin, HIGH);  
            }
            else{
              if(temp >= 0.0){
                pot = int((temp + 0.0005) * 1000.0);
      
                x4 = pot/1000;
                x3 = (pot/100)%10;
                x2 = (pot/10)%10;
                x1 = pot%10;
       
                digitalWrite(latchPin, LOW);
                shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
                shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
                shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
                shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]|B10000000);//ставим точку

                digitalWrite(latchPin, HIGH);  
              }                                 
            }  
          }
        }
    }//конец чисел в диапазоне
  }//конец положительных чисел
  else {//если число отрицательное
    if(temp < -999.0){//если число выходит за нижний предел
      digitalWrite(latchPin, LOW);
     
      shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-
      shiftOut(dataPin, clockPin, MSBFIRST, B01011100);//o
      shiftOut(dataPin, clockPin, MSBFIRST, B00111000);//L
      shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-

      digitalWrite(latchPin, HIGH);
    }
      else{
        if(temp <= -100.0){
          temp_minus = abs(temp);
          pot = int(temp_minus + 0.05);
      
          x4 = pot/1000;
          x3 = (pot/100)%10;
          x2 = (pot/10)%10;
          x1 = pot%10; 
     
          digitalWrite(latchPin, LOW);
     
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
          shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
          shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-

          digitalWrite(latchPin, HIGH);
        } 
        else {
          if(temp <= -10.0){
            temp_minus = abs(temp);
            pot = int((temp_minus + 0.005) * 10.0);
      
            x4 = pot/1000;
            x3 = (pot/100)%10;
            x2 = (pot/10)%10;
            x1 = pot%10;
       
            digitalWrite(latchPin, LOW);
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]|B10000000);//ставим точку
            shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
            shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-

            digitalWrite(latchPin, HIGH);       
          } 
          else{
            if(temp < 0.0){
              temp_minus = abs(temp);
              pot = int((temp_minus + 0.0005) * 100.0);
      
              x4 = pot/1000;
              x3 = (pot/100)%10;
              x2 = (pot/10)%10;
              x1 = pot%10;
       
              digitalWrite(latchPin, LOW);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
              shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]|B10000000);//ставим точку
              shiftOut(dataPin, clockPin, MSBFIRST, B01000000);//-

              digitalWrite(latchPin, HIGH);  
            }
          }
        }
    }//конец чисел в диапазоне  
  }//конец отрицательных чисел  
}//конец цикла
На самом деле, оба приведенных скетча практически одинаковые и отличаются лишь временными задержками, которые необходимы для правильной симуляции кода в программе Proteus. При использовании скетчей в качестве шаблонов подойдет любой из вышеприведенных примеров.
74HC595.pdsprj
Файл симуляции в Proteus
(18.26 КБ) 35 скачиваний
74HC595.jpg
Симуляция работы 74HC595 в Proteus
В приведенной для 74HC595 схеме моделирования следует учитывать, что в ней отсутствуют ограничительные резисторы для светодиодов, которые обязательно должны быть установлены в реальной схеме. Для моделирования это не принципиально.

Аватара пользователя
seurf
Активный
Активный
Сообщения: 663
Зарегистрирован: 12 май 2016, 19:54
Откуда: Волгоград
Благодарил (а): 11 раз
Поблагодарили: 18 раз

#3

Сообщение seurf » 16 дек 2017, 20:56

У меня в настоящее время нет модулей индикации напряжения. Лежат в тумбочке маленькие Китайские панельки ( все в внутри) на небольшие напряжения. Покупал для контроля накалов ламп. Так и не поставил. Хотя в планах стоит.
А сейчас озаботился индикацией анодного напряжения. А это от 300 до 450 В? Но не увидел в описании технических характеристик. Может не рассмотрел? Прошу меня тогда поправить.
Применимо?

viewtopic.php?f=16&t=280&start=60
75 пост. Видны мои Китайские индикаторы напряжения.
Александр

Аватара пользователя
Алаев Ян
Основатель Форума
Сообщения: 2339
Зарегистрирован: 19 мар 2014, 12:05
Откуда: Саратов
Благодарил (а): 29 раз
Поблагодарили: 16 раз
Контактная информация:

#4

Сообщение Алаев Ян » 17 дек 2017, 10:13

Добрый день, Александр!
Я поясню главную идею этой темы. Сейчас в нашем мире существует тенденция - сделать дешевле, проще, легче и так далее, но не всегда это бывает лучше, к сожалению. Применительно к светодиодным сегментным индикаторам - существует два способа вывода информации на них:
1. Динамическая индикация.
2. Статическая индикация.
Все китайские модули индикации, все вольтметры, амперметры и прочие показометры современного производства используют динамическую индикацию, у нее есть свои преимущества, например, меньшее число выводов, проще аппаратная обвязка (финансовая экономия на лицо, особенно при массовом производстве) и на ней очень удобно делать приборы, где наличие разных помех не имеет значения, например, часы, термометры, различные датчики тока и напряжения, когда все равно на ту цепь, где мы измеряем ток или напряжение. Но у них есть и недостатки, в нашем деле очень существенные. Главный недостаток - для вывода информации на сегментный индикатор мы должны в цикле быстро быстро перебирать сегменты между собой, при этом индикатор мерцает, как мерцает телевизор со своей разверткой кадров, просто мы этого не видим, так как происходит это достаточно быстро, но за счет этого подобный прибор постоянно дергает свой БП импульсным током и генерирует массу цифровых помех. Остановить этот процесс нельзя, в этом случае на экране индикатора ничего выведено не будет. Второй недостаток динамической индикации - контроллер, который этим управляет, постоянно кружится в этом цикле и очень часто бывает непросто выполнять другие действия, чтобы это не сказалось на качестве как индикации, так и выполнения других задач, поэтому очень часто контроллер, который занимается динамической индикацией ничего другого не делает, кроме своей индикации, все остальное делает другой контроллер. В совокупности, все это делает динамическую индикацию неприменимой в составе качественной звуковоспроизводящей аппаратуры.
Теперь по поводу статической индикации. Из недостатков у нее - много выводов у сегментных индикаторов, так как управление идет по каждому из них без каких либо переборов общих катодов или анодов. Больше аппаратной обвязки, тут речь идет о сдвиговых регистрах или прочих микросхемах управления. Но главное, что есть просто потрясающие достоинства. Из них - можно вывести информацию на индикатор и полностью выключить работу контроллера, при этом все будет работать в статическом режиме и не генерировать никаких помех. Вывод информации на индикаторы так же не сопровождается высокочастотными помехами, так как загружаются и включаются сразу все регистры с низкочастотным периодом обновления информации, помехи коммутации которых достаточно легко подавить. Поэтому статическая индикация, которая всеми забыта и почти никем не используется, которая представлена здесь, почти не имеет себе равных в плане "чистоты" применения для звуковоспроизводящих устройств.

seurf писал(а):Применимо?
на основе этих модулей можно сделать любой "показометр", это в планах, но пока не реализовано для продажи, только опытные образцы.

Аватара пользователя
poty
Профи
Профи
Сообщения: 3408
Зарегистрирован: 24 мар 2014, 10:00
Откуда: Россия, Москва
Благодарил (а): 22 раза
Поблагодарили: 38 раз

#5

Сообщение poty » 18 дек 2017, 17:05

Жалко времени нет... Надо бы создать матричный статический LED-индикатор. Допустим, RGB модули есть в установочном размере 2,3х1,5мм, а одноцветные - так ещё меньше. Другой вопрос - управление ими будет большой головной болью: даже если брать, допустим, 15х60мм, то это (для трёхцветки с необходимыми зазорами) 180 ячеек (540 управляющих сигналов). Надо применять какие-то многоножечные контроллеры, так как 68 сдвиговых регистров озвереешь на плате размещать.
Владислав

Аватара пользователя
seurf
Активный
Активный
Сообщения: 663
Зарегистрирован: 12 май 2016, 19:54
Откуда: Волгоград
Благодарил (а): 11 раз
Поблагодарили: 18 раз

#6

Сообщение seurf » 22 дек 2017, 10:11

В совокупности, все это делает динамическую индикацию неприменимой в составе качественной звуковоспроизводящей аппаратуры.
Вот ключевое определение.
Я нашёл на Ali под 600 В индикатор, но у него земля через прибор проходит, для измерения тока. Поэтому я этот вопрос отодвинул.
Александр

Аватара пользователя
poty
Профи
Профи
Сообщения: 3408
Зарегистрирован: 24 мар 2014, 10:00
Откуда: Россия, Москва
Благодарил (а): 22 раза
Поблагодарили: 38 раз

#7

Сообщение poty » 22 дек 2017, 10:18

seurf писал(а):Я нашёл на Ali под 600 В индикатор, но у него земля через прибор проходит, для измерения тока.
Мне кажется, в этом нет ничего страшного. Достаточно перенести фильтрующие резисторы на земляной провод и системную землю организовать после прибора.
Владислав

Аватара пользователя
seurf
Активный
Активный
Сообщения: 663
Зарегистрирован: 12 май 2016, 19:54
Откуда: Волгоград
Благодарил (а): 11 раз
Поблагодарили: 18 раз

#8

Сообщение seurf » 01 янв 2018, 22:54

Самый бюджетный вариант: Смотри, что нашлось на AliExpress
http://s.aliexpress.com/BJryQNJV
Конечно сам прибор мусор. Пара уже валяются, показывают, что захочется. С новья ещё ничего были.

Зато ставишь предел на 1000В и не паришься.
Сам корпус можно спрятать и оставить только экран и запитать его не от батареек, а от внутреннего трансформатора накала. Потребляет совсем ничего. Фантазирую.

А вот собственно 600 вольтовый прибор. Смотри, что нашлось на AliExpress
http://s.aliexpress.com/maMzuyMb
Измеряет одномоментно и ток и напряжение.
Я так понимаю, если пренебречь измерением тока, можно и без разрыва земли?
image.png
image.png
image.png
Александр

Аватара пользователя
poty
Профи
Профи
Сообщения: 3408
Зарегистрирован: 24 мар 2014, 10:00
Откуда: Россия, Москва
Благодарил (а): 22 раза
Поблагодарили: 38 раз

#9

Сообщение poty » 02 янв 2018, 00:49

seurf писал(а):если пренебречь измерением тока, можно и без разрыва земли?
Да-да.
Владислав

Аватара пользователя
dim3740
Наблюдатель
Наблюдатель
Сообщения: 3
Зарегистрирован: 02 дек 2018, 13:13

#10

Сообщение dim3740 » 02 дек 2018, 13:24

Здравствуйте! Тоже из-за помех ухожу на статическую индикацию на сдвиговых регистрах. Ардуино.
Вопрос: В вышеприведенных скетчах вывод данных на индикатор заведен в loop в целях отслеживания temp при его изменениях? Я тестово вывожу константу одноразово в конце setup ( 2 посыла), защелкиваю, и наблюдаю после каждого ресета (!) разные показания (отдельные сегменты). И задаюсь вопросом - а что инициализации регистра что-ли не нужно в коде делать? Ведь я питание не выключаю, и регистр не обнуляется. Спасибо.

Аватара пользователя
Алаев Ян
Основатель Форума
Сообщения: 2339
Зарегистрирован: 19 мар 2014, 12:05
Откуда: Саратов
Благодарил (а): 29 раз
Поблагодарили: 16 раз
Контактная информация:

#11

Сообщение Алаев Ян » 02 дек 2018, 14:47

dim3740 писал(а):
02 дек 2018, 13:24
Здравствуйте!
Доброго дня!

Отправлено спустя 2 минуты :
dim3740 писал(а):
02 дек 2018, 13:24
Тоже из-за помех ухожу на статическую индикацию на сдвиговых регистрах. Ардуино.
Вам удалось помехи как-то зафиксировать? Или делаете сразу с упреждением потенциальных проблем? Просто хочется практического подтверждения высказанных здесь мыслей по поводу динамической/статической индикации.

Отправлено спустя 7 минут 24 секунды:
dim3740 писал(а):
02 дек 2018, 13:24
Вопрос: В вышеприведенных скетчах вывод данных на индикатор заведен в loop в целях отслеживания temp при его изменениях? Я тестово вывожу константу одноразово в конце setup ( 2 посыла), защелкиваю, и наблюдаю после каждого ресета (!) разные показания (отдельные сегменты). И задаюсь вопросом - а что инициализации регистра что-ли не нужно в коде делать? Ведь я питание не выключаю, и регистр не обнуляется. Спасибо.
Этот скетч написан мною уже очень давно, я даже не помню что там..., но он точно рабочий, я проверял его на своем железе. Чуточку подробнее опишите Вашу проблему. Можно приложить код или видео.

Отправлено спустя 12 минут 7 секунд:
dim3740 писал(а):
02 дек 2018, 13:24
Вопрос: В вышеприведенных скетчах вывод данных на индикатор заведен в loop в целях отслеживания temp при его изменениях?
В данной ситуации, приведенный скетч - это только пример, как выводить данные на индикатор в режиме статической индикации. На практике я не вывожу данные на индикатор в цикле loop - это не имеет смысла, так как в этом случае мы статическую индикацию косвенно превращаем в динамическую. Я данные на индикаторе обновляю только по факту их изменения. Например, у нас есть энкодер и на индикатор мы выводим уровень громкости. Есть обработчик вращения энкодера и есть обработчик, который сравнивает новое значение с предыдущим. Поэтому, если пользователь крутанул энкодер, то будет запущена проверка нового выводимого значения и только в том случае, если новое значение отличается от ранее установленного - будет запущена процедура обновления сдвиговых регистров. Все остальное время в цикле loop все это не работает (игнорируется установленными флагами).

Отправлено спустя 2 минуты 30 секунд:
dim3740 писал(а):
02 дек 2018, 13:24
И задаюсь вопросом - а что инициализации регистра что-ли не нужно в коде делать? Ведь я питание не выключаю, и регистр не обнуляется. Спасибо.
В данном случае обработчик измеренных значений написан так, что выводится либо число в установленном диапазоне с учетом знака числа, либо системное сообщение о выходе числа за допустимый диапазон, поэтому инициализация регистра не нужна, всегда выводится какое-то значение, которое затирает предыдущее.

Аватара пользователя
dim3740
Наблюдатель
Наблюдатель
Сообщения: 3
Зарегистрирован: 02 дек 2018, 13:13

#12

Сообщение dim3740 » 02 дек 2018, 19:29

Для примера влияния динамической индикации форумачанам:
1 Трек: фон меняется при попытках зашунтировать выход на наушники разными кондерами.
2 Трек - исключение шума при отключении (просто выдергиваю) индикатора ТМ1637


Понял, что как таковой инициализации нет. Типа "подать на такой то пин сдвигового регистра то-то". А сброс надо делать программно - путем записи нулей, т.е. очистки всех сегментов. Просто в примерах в сети, как-то это не требуется. И в Вашем, конечно, тоже.
Спасибо за ответы, много интересного))) Много по существу моих интересов, чего нет и в более развернутых форумах.
Добавлю, что земляных петель не было, все по схеме "звезда".

Аватара пользователя
Алаев Ян
Основатель Форума
Сообщения: 2339
Зарегистрирован: 19 мар 2014, 12:05
Откуда: Саратов
Благодарил (а): 29 раз
Поблагодарили: 16 раз
Контактная информация:

#13

Сообщение Алаев Ян » 02 дек 2018, 20:12

dim3740 писал(а):
02 дек 2018, 19:29
Для примера влияния динамической индикации форумачанам:
к сожалению, я не понимаю, как "связать" приведенные звуковые тоны с динамической индикацией.

Аватара пользователя
poty
Профи
Профи
Сообщения: 3408
Зарегистрирован: 24 мар 2014, 10:00
Откуда: Россия, Москва
Благодарил (а): 22 раза
Поблагодарили: 38 раз

#14

Сообщение poty » 02 дек 2018, 21:56

dim3740 писал(а):
02 дек 2018, 13:24
Вопрос: В вышеприведенных скетчах вывод данных на индикатор заведен в loop в целях отслеживания temp при его изменениях?
Цикла там нет, просто название процедуры сбивает с толку. Эта процедура вызывается при необходимости смены отображаемых данных. Собственно данные передаются в переменной temp (не уверен, но можно было эту переменную поставить как параметр в процедуре?). Анализируется максимальный и минимальный предел (с соответствующей "индикацией" ошибки), если разрядность числа меньше количества ячеек, то "старшие" ячейки гасятся (если всё правильно понял, хотя в Протеусе "заглавный" ноль, почему-то, остаётся). В любом случае задвигаются четыре 8-битных слова. Т.к. регистры соединены последовательно, то заменяются все биты в них на новые.
dim3740 писал(а):
02 дек 2018, 13:24
Я тестово вывожу константу одноразово в конце setup ( 2 посыла), защелкиваю, и наблюдаю после каждого ресета (!) разные показания (отдельные сегменты). И задаюсь вопросом - а что инициализации регистра что-ли не нужно в коде делать? Ведь я питание не выключаю, и регистр не обнуляется.
Как уже сказано выше - если у Вас 4 сдвиговых регистра, то Вам при каждой смене показаний нужно "задвигать" 4 слова. Задвинув 2 слова Вы получаете отображение в первых двух регистрах. В следующий раз - показания переместятся на последние два индикатора, а первые два будут заполнены новыми данными.
Reset при полной смене показаний делать не нужно, как Вы уже, наверное, поняли из вышесказанного. Но в принципе, если Вы, допустим, организуете управление по принципу последовательного (видимого) сдвига цифр, то можно перед выводом числа обнулить регистры, выключив т.о. отображение старой информации.

Отправлено спустя 3 минуты 1 секунду:
Динамическая индикация, конечно, вызывает шумы, но мне хотелось бы понять, каков их уровень в Вашем примере. Слишком сильные помехи.
Владислав

Аватара пользователя
Алаев Ян
Основатель Форума
Сообщения: 2339
Зарегистрирован: 19 мар 2014, 12:05
Откуда: Саратов
Благодарил (а): 29 раз
Поблагодарили: 16 раз
Контактная информация:

#15

Сообщение Алаев Ян » 03 дек 2018, 08:25

poty писал(а):
02 дек 2018, 21:59
Анализируется максимальный и минимальный предел (с соответствующей "индикацией" ошибки), если разрядность числа меньше количества ячеек, то "старшие" ячейки гасятся (если всё правильно понял, хотя в Протеусе "заглавный" ноль, почему-то, остаётся).
число анализируется таким образом, чтобы отобразить его с максимальной разрядностью на 4-х сегментном индикаторе. Поясню на примере, если, допустим, мы сделаем фиксированное количество знаков после запятой, например, два, то на 4-х разрядном индикаторе число 2.5 будет отображено как _2.50 (_ - потушенный символ), число 1534.84 будет отображено полностью без знаков после запятой 1534, число 145.36 будет отображено с потерей последнего разряда 145.3, обычно, в этом случае делают округление, чтобы выводимое число было 145.4, но это уже спорный вопрос. В моем коде сделано не так. У меня нет фиксированного количества знаков после запятой и положение разделительной точки определяется автоматически относительно разрядной сетки 4-х сегментного индикатора. Пример, число 2.5 будет выведено как 2.500 чтобы сохранить максимум информации о измеренном значении, число 1534.84 будет выведено так же 1534, число 145.36 будет выведено как 145.3, число 0.5876 будет выведено как 0.587. Поэтому, не совсем понимаю, что такое "заглавный" ноль, который остается, его там по определению быть не должно.

Аватара пользователя
Алаев Ян
Основатель Форума
Сообщения: 2339
Зарегистрирован: 19 мар 2014, 12:05
Откуда: Саратов
Благодарил (а): 29 раз
Поблагодарили: 16 раз
Контактная информация:

Принципиальная схема, фото железа и схемы подключений

#16

Сообщение Алаев Ян » 04 дек 2018, 09:21

Принципиальная схема:
Принципиальная схема.JPG
Принципиальная схема
Модуль индикации_вер. 4 rev.2.spl7
(73.52 КБ) 8 скачиваний
Схемы подключения одного и группы однотипных модулей:
Скриншот 2018-09-21 14.15.38.png
Скриншот 2018-09-21 14.16.34.png
Соединение одного модуля.spl7
(21.26 КБ) 5 скачиваний
Печатная плата:
top.png
Top
bottom.png
Bottom
Module 4xLED rev.2.lay6
(121.92 КБ) 4 скачивания
Datasheet BS-C51DRD

Фото модуля индикации:
Скриншот 2018-09-21 14.14.12.png
Скриншот 2018-09-21 14.14.22.png
Скриншот 2018-09-21 14.14.29.png
Скриншот 2018-09-21 14.14.43.png
Скриншот 2018-09-21 14.14.36.png
Скриншот 2018-09-21 14.14.49.png

Аватара пользователя
poty
Профи
Профи
Сообщения: 3408
Зарегистрирован: 24 мар 2014, 10:00
Откуда: Россия, Москва
Благодарил (а): 22 раза
Поблагодарили: 38 раз

#17

Сообщение poty » 04 дек 2018, 10:26

Я смотрел на картинки из симуляции в Протеусе и не заметил точки в первом числе.
Владислав

Аватара пользователя
Алаев Ян
Основатель Форума
Сообщения: 2339
Зарегистрирован: 19 мар 2014, 12:05
Откуда: Саратов
Благодарил (а): 29 раз
Поблагодарили: 16 раз
Контактная информация:

#18

Сообщение Алаев Ян » 04 дек 2018, 10:30

poty писал(а):
04 дек 2018, 10:26
Я смотрел на картинки из симуляции в Протеусе и не заметил точки в первом числе.
ну тогда это все объясняет, так как я проверял код на железе и проблем замечено не было.

Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение