Динамическая индикация на четырехразрядном индикаторе

Тема в разделе "Закажу проект", создана пользователем arssev1, 23 дек 2015.

  1. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    там не региср, а дрвйвер семисигментных индикаторов. сколько раз высокий сигнал отправил-столько и показал.
     
  2. DrProg

    DrProg Вечный нерд

    Может быть удобно для линейного счетчика (секундомера например), но для отображения произвольных цифр (времени например) не очень. Каждый раз для выставления нужных цифр нужно сбрасывать и молниеносно дергать множество раз ножку. Я за регистры, а еще больше за самодельный драйвер на 2313 с UART входом, стоит копейки, работает независимо от основной программы, циферки не дрожат и не мелькают даже при самой высокой нагрузке. Именно такие задачи я перед ним и ставил.
     
  3. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    отдельный драйвер на2313 лучше, не спорю, но относительно регисров, драцвера лучше, т.к драйвер выводит постоянно, а регисры тоже постоянно(последний байт) и им надо давать shiftout, что бы они не выводили один сегмент. Следовательно, ардуино будет занята выводом на "дисплей".
     
  4. DrProg

    DrProg Вечный нерд

    Я про то же и говорю, динамика через регистры работает в фоне, то есть плавность этого процесса зависит от загрузки МК основной задачей. Если это задача единственная, то проблем нет. Если же там что-то тяжелое, то тормозить будет и вывод цифр и сама основная задача. Избежать это можно либо при помощи отдельного драйвера (например на моем возлюбленном 2312), либо как вы советуете - не динамически (что, кстати, идет вразрез с заголовком темы).

    Да, и еще. Через регистры 595 можно выводить и статично. По регистру на разряд и нет проблем, только при смене цифр требуется загонять туда байты. Причем сразу те, которые надо.
     
  5. DrProg

    DrProg Вечный нерд

    Что там заморачиваться то? Ничего сложного, все уже сто раз отработано. Зачем использовать дорогой и относительно нежный ЖКИ, если нужно вывести всего 2-4 цифры.

    По моему, авто все уже давно сделал, а мы тут до сих пор советы даем. )
     
    ИгорьК нравится это.
  6. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    можно вообще в сериал порт отправлять, а если хочется красиво то

     
  7. DrProg

    DrProg Вечный нерд

    Точно, теперь вместо четырехразрядного индикатора компьютер приделывать. )
     
    ИгорьК нравится это.
  8. с подключением, с разводкой платы, с монтажем на корпус..
    они актуальный только для больших циферок, а те полудюймовые, в подавляющем большинстве случаев проще заменить на 1602
     
  9. DrProg

    DrProg Вечный нерд

    16х2 не намного проще прикрутить с точки зрения монтажа.
     
    ИгорьК нравится это.
  10. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    на разбери установить эту утелиту и экранчик. Красиво. можно выбрать цвет фона и цвет текста. а ещё для красоты добавить парочку тегов для красоты.
     
  11. DrProg

    DrProg Вечный нерд

    Да зачем мелочиться, десктоп с i7 и 16Гб, монитор дюйма на 24, красиво будет, гарантирую.
     
    vvr, Securbond и ИгорьК нравится это.
  12. nii

    nii Нуб

    А действительно, почему не использовать shiftOut?
    - dataPin: номер порта вход/выхода, на который выводятся биты (int)
    - clockPin: номер порта по которому производится синхронизация (int)

    byte data = B00111101; // первые 4 бита, цифра в двоичном коде, вторые 4 бита - индикатор (в данном случае выводим цифру 3 на второй индикатор
    shiftOut(dataPin, clockPin, MSBFIRST, data);

    Займет не больше трех пинов.
     
    Последнее редактирование: 26 фев 2016
  13. Mestniy

    Mestniy Гуру

    что за программа, все хотел спросить?
     
  14. arssev1

    arssev1 Гик

    Ну, что, ты продвинулся в этом деле? А то я что-то застрял
     
  15. nii

    nii Нуб

    В этом деле (в деле семисегментного индикатора) я не двигался.
    Я использовал shiftOut(dataPin, clockPin, MSBFIRST, data) для генерации букв на матрице, которая была подключена к регистрам 74HC595
    https://www.dropbox.com/s/l3c8llprw0yilc6/MOV_0015.mp4?dl=0

    А в чем конкретно сложность?
     
  16. arssev1

    arssev1 Гик

    В коде
    В данный момент нужен код, который будет разбивать десятичное число на разряды и узнавать сколько разрядов в числе (максимум 4 разряда), например есть у меня число 145, из него надо получить разряды (1, 4, 5) и количество разрядов - 3
     
  17. arssev1

    arssev1 Гик

    О! С этим разобрался, теперь с другим не могу
    Код, что у меня вышел работает, но нужно допилить и тут уже мозгов не хватает
    В коде уже есть намеки на duration, теперь надо его реализовать, то есть часть кода из void displayNumber надо поместить в цикл, который будет крутится указанное в duration количество millils(), а потом стирать сдвиговый регистр в ноль (0b0)
    И тут я уже хз что делать
    Код (C++):
    const int dataPin = 8;
    const int latchPin = 9;
    const int clockPin = 10;

    void setup() {
      pinMode(dataPin, OUTPUT);
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
    }

    void loop() {
      displayNumber(9876, 1000);
    }

    void displayNumber(int number, int duration) {
      int units = number % 10; //Получаем единицы
      int dozens = number % 100 / 10; //Десятки
      int hundreds = number % 1000 / 100; //Сотни
      int thousands = number / 1000; //Тысячи

      int numberOfDigits; //Количество разрядов будем записывать сюда

      if (thousands == 0 && hundreds == 0 && dozens == 0) numberOfDigits = 1;
      else if (thousands == 0 && hundreds == 0) numberOfDigits = 2;
      else if (thousands == 0) numberOfDigits = 3;
      else if (thousands > 0) numberOfDigits = 4; //Посчитали количество разрядов

      if (numberOfDigits == 4) {
        shiftToRegister((0b0001 << 4) + thousands);
        shiftToRegister((0b0010 << 4) + hundreds);
        shiftToRegister((0b0100 << 4) + dozens);
        shiftToRegister((0b1000 << 4) + units);
      }

      else if (numberOfDigits == 3) {
        shiftToRegister((0b0010 << 4) + hundreds);
        shiftToRegister((0b0100 << 4) + dozens);
        shiftToRegister((0b1000 << 4) + units);
      }

      else if (numberOfDigits == 2) {
        shiftToRegister((0b0100 << 4) + dozens);
        shiftToRegister((0b1000 << 4) + units);
      }

      else if (numberOfDigits == 1) {
        shiftToRegister((0b1000 << 4) + units);
      }  
    }

    void shiftToRegister(byte i) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, i);
      digitalWrite(latchPin, HIGH);
    }
    На данный момент этот код просто отображает на индикаторе 9876, если заменить в коде 9876 на число с любым количеством разрядов, то все замечательно работает
     
  18. nii

    nii Нуб

    Вы хотите, чтобы ваше число горело ограниченное время, а зачем высвечивались нули:

    Тогда добавьте в
    Код (Text):
    void setup() {
    unsigned long startTime = millis();
     
    Замените
    Код (Text):

      int units = number % 10; //Получаем единицы
      int dozens = number % 100 / 10; //Десятки
      int hundreds = number % 1000 / 100; //Сотни
      int thousands = number / 1000; //Тысячи

      int numberOfDigits; //Количество разрядов будем записывать сюда

      if (thousands == 0 && hundreds == 0 && dozens == 0) numberOfDigits = 1;
      else if (thousands == 0 && hundreds == 0) numberOfDigits = 2;
      else if (thousands == 0) numberOfDigits = 3;
      else if (thousands > 0) numberOfDigits = 4; //Посчитали количество разрядов

     
    на

    Код (Text):


    if (millis() - startTime < duration) {
      int units = number % 10; //Получаем единицы
      int dozens = number % 100 / 10; //Десятки
      int hundreds = number % 1000 / 100; //Сотни
      int thousands = number / 1000; //Тысячи

      int numberOfDigits; //Количество разрядов будем записывать сюда

      if (thousands == 0 && hundreds == 0 && dozens == 0) numberOfDigits = 1;
      else if (thousands == 0 && hundreds == 0) numberOfDigits = 2;
      else if (thousands == 0) numberOfDigits = 3;
      else if (thousands > 0) numberOfDigits = 4; //Посчитали количество разрядов

    } else {

      int units = 0; //Получаем единицы
      int dozens = 0; //Десятки
      int hundreds = 0; //Сотни
      int thousands = 0; //Тысячи

      int numberOfDigits =4;
    }
     
     
  19. ostrov

    ostrov Гуру

    Надо вам код для динамической индикации непосредственно на ножки портов? Работает быстрее раз в дофига, на 4х разрядном индикаторе выдает тысячи 2 кадров в секунду (на Уно). Но порты прописывать нужно каждый раз при смене ноги, разумеется.