Часы на основе высоковольтного шифт-регистра supertex HV5222 и борьба с мерцанием.

cyrax73
Offline
Зарегистрирован: 06.04.2014

Добрый день, коллеги.

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

Делать решил на шифт-регистре supertex HV5222 (32 порта, коммутирует 0, высоковолтьтный). 

описание http://ww1.microchip.com/downloads/en/DeviceDoc/HV5222%20B072213.pdf

Возникла проблема, по завершении цикла загрузки последовательности бит в регистр,  светодиоды или лампы, подключенные к выходам, которые долждны быть закрыты, вспыхивают на очень короткое время.

С портом DE, который как я думал и должен это регулировать, я игрался - и к GND его притягивал, и к + питания, и в воздухе оставлял болтаться - пофиг, на мерцание это не влияет.

Ниже прилагаю код, подключение думаю из него понятно, если что еще надо, дополню. Код должен гонять по кругу огонек, в принципе работает.

Вопрос собственно такой - это я с кодом что-то намудрил, или с железом, или вообще это его нормальное поведение ? И конечно коронный вопрос - что делать ? Мне что-то в голову ничего не приходит ..



void setup() {
  pinMode(4, OUTPUT);//strobe  PD4
  pinMode(6, OUTPUT);//clock  PD6
  pinMode(8, OUTPUT);//data   PB0
}

void loop() {

  for (int x = 1; x <= 32; x++) {
    PORTD &= ~(1 << 4);                   строб-защелка 0
    for (int i = 1; i <= 32; i++) {

      if (i == x) {
        PORTB |= _BV (0);  
      } else {
        PORTB &= ~_BV (0);
      }
      PORTD |= (1 << 6);                //  (arduino 6) даем 1 затем 0 на клок
      PORTD &= ~(1 << 6);               //  (arduino 6) 

    }
    PORTD |= (1 << 4);              //  (arduino 4)         строб-защелка 1
    delay(100);
  }
  delay(1000);
}
Datak
Offline
Зарегистрирован: 09.10.2014

cyrax73 пишет:

С портом DE, который как я думал и должен это регулировать, я игрался - и к GND его притягивал, и к + питания, и в воздухе оставлял болтаться - пофиг, на мерцание это не влияет.

Там ещё STR есть. Насколько я понял, он зажигает все лампочки, даже когда OE в нуле.

Нужно подать единицу, и на OE и на STR.

cyrax73
Offline
Зарегистрирован: 06.04.2014

этот регистр отличается от 595.

STR у меня и так есть, это strobe, в коде видно

а OE здесь нет, вместо него DE, но насоклько я понял из датащита, функции отличаются

========

Хочу добавить, из моего сообщения может не очевидно.

Регистр работает, огонек по светодиодам по кругу бегает, проблема именно в том, что остальные светодиоды подмигивают на каждый цикл записи в регистр

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

cyrax73, вас не понять. Даёте даташит на свой чип, но сигнала OE , который описан в нём, почему то у вас нет. Значит это не от него даташит?

cyrax73
Offline
Зарегистрирован: 06.04.2014

да, прошу прощения, перепутал,  здесь OE. Датащит тот. Долго гуглил, путаюсь уже в разных регистрах ..

но это ничего не меняет, как я и писал, я не понимаю, что еще с ним сделать.

если притянуть его к +, огонек по светодиодам бегает, но мерцание остается (т.е. один светодиод зажигается, которому положено, и в этот момент все остальные легонько на доли секунды вспыхивают)

если притянуть к GND, то они не зажигаются вообще, но мерцание опять остается.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

cyrax73, тут нужно детально разобраться что это за мерцание такое. В какой момент оно начинается, в какой заканчивается. Одновременно ли появляется единица на выходах, или этот всплеск последовательный. Может попробывать задействовать сигнал STR А может есть смысл сделать отладочный скетч, в котором каждая команда выполняется только после нажатия на кнопку. Чаще всего глюки бывают из-за того, что допустимые тайминги устройства и контроллера не совпадают. Вряд ли кто пользовался таким чипом и имеет опыт, так что рассчитывайте на собственные силы.

Datak
Offline
Зарегистрирован: 09.10.2014

Тоже прошу прощения - могу ошибаться, подробно не разбирался.

Но насколько я понял, STR там используется совсем по-другому. Во всяком случае, на картинке в даташите никакой защёлки я вообще не вижу.

Попробуйте, всё-таки, подать на STR постоянное значение, и больше вообще не дёргать.

-----

Upd: Попробуйте добавить, например, delay(2000) перед строкой PORTD |= (1 << 4). Всё сразу станет понятно. :)

Разобрался, никакой защёлки там нет. Данные со сдвигового регистра подаются сразу на выход.
Из-за этого, возможно, будет заметно небольшое мерцание "лишних" светодиодов в момент вдвигания данных в регистр. Вот тогда действительно может пригодиться этот OE - можно будет на время сдвига просто гасить все выходы одновременно.

cyrax73
Offline
Зарегистрирован: 06.04.2014

Благодарю за ответы, и за попытки помочь. Постораюсь в ближайшее время (надеюсь, завтра смогу) проверить все приведенные советы, и отпишусь. 

cyrax73
Offline
Зарегистрирован: 06.04.2014
void writereg1(long reg1) {  // функция записи в правый регистр, если лампами кверху (минуты, дес. сек, секунды)

  for (int x = 0; x <= 31; x++) {
    PORTB |= (1 << 0);  // даем 1 на клоск
    int y = bitRead(reg1, x);
    if (y == 1) {
      PORTD |= _BV (3);  // записываем 0 или 1 в порт посл. данных
    } else {
      PORTD &= ~_BV (3);   // записываем 0 или 1 в порт посл. данных
    }
    PORTB &= ~(1 << 0);         // даем 0 на клоск
  }
}

Уважаемый Datak, похоже вы совершенно правы. выше код, как то коряво вставляется, в самое начало ..

PORTD 3 - data

PORTB 0 - clock

а строб поднят в 1 еще в сетапе.

Так все работает. Т.е. те ноги, куда записываем 0, не мерцают. Правда ноги, где был записан 1 до записи данных в регистр, и куда снова записали 1, опять мерцают, но очень коротко. Но если раньше мне казалось я хоть примерно понимаю, как это все работае, то теперь я вообще ничего не понимаю. Для чего здесь вообще strobe ? Как регистр понимает, что загружены все данные ?

Datak
Offline
Зарегистрирован: 09.10.2014

cyrax73, в 595 микросхеме, на самом деле, два регистра - сдвиговый,  в который данные вдвигаются по сигналу clock, и ещё один, в который данные из сдвигового регистра параллельно копируются по сигналу strobe. Этот, второй, подключен к выходам микросхемы.

В вашей HV5222 второго регистра нет, а к выходам подключен сам сдвиговый регистр, напрямую. Значит, сигнал strobe здесь просто не нужен.

cyrax73 пишет:

если раньше мне казалось я хоть примерно понимаю, как это все работае, то теперь я вообще ничего не понимаю. Для чего здесь вообще strobe ? Как регистр понимает, что загружены все данные?

Да так же всё работает, абсолютно. Все данные загружены тогда, когда вы их загрузили -  то есть вдвинули в регистр 32 бита. :)

А strobe здесь совсем для другой цели. Он просто зажигает все светодиоды одновременно. Для чего это может понадобиться - я не знаю - разработчикам микросхем видней, наверное. :)

С мерцанием побороться скорей всего можно, но надо понять, почему оно появилось. Я там писал выше - мне кажется, будет достаточно отключать выходы на время сдвига.

Получится примерно то же что в первом варианте программы, только вместо сигнала STB нужно подключить к тому же выходу ардуины сигнал OE.





void writereg1(long reg1) // функция записи в правый регистр, если лампами кверху (минуты, дес. сек, секунды)
{
  PORTD &= ~(1 << 4);     // OE = 0;

  for (int x = 0; x <= 31; x++) {
    PORTB |= (1 << 0);    // даем 1 на клоск
    int y = bitRead(reg1, x);
    if (y == 1) {
      PORTD |= _BV (3);   // записываем 0 или 1 в порт посл. данных
    } else {
      PORTD &= ~_BV (3);  // записываем 0 или 1 в порт посл. данных
    }
    PORTB &= ~(1 << 0);   // даем 0 на клоск
  }

  PORTD |= (1 << 4);      // OE = 1;
}

Кажется так, если я нигде не перепутал нули с единицами.

 

UtaN
Offline
Зарегистрирован: 23.08.2018

Добрый день.

Работаю сейчас с этим чипом, вопрос: логика, если я все правильно понял, у него 12в, верно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Самая верхняя таблица на стр. 3 даташита ни о чём не говорит? Там же, вроде, всё написано.