7seg на hc595 4digit

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 7seg на hc595 4digit

Сообщение BOB51 »

Основная задача - сделать сканирование самостоятельным процессом.
micros - это также часть основной программы. Рабочая версия, но несколько более простая.
Второе - счетчик не бесконечен - надо переполнение учитывать при длительной работе.
Посмотрю, где там у меня в преобразователе ошибка - но то уже больше вопрос теста, чем самой индикации.
8)
Ну вот и ошибку отловил - причина НЕВНИМАТЕЛЬНОСТЬ - вместо цифирьки запихнул сразу сегментный код! (перекодировка там ниже отдельно выполняется, а инверсия в обработчике прерывания).
Надо было так:
Спойлер

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

temp = Dcnt;
 if (temp == 0)
  { for (byte m = 0; m <= 3; m++){ TrmDat[m] = 0; } }
 else 
  { if (temp >= 1000)
     { TrmDat[0] = temp / 1000; temp = temp % 1000; }
    else { TrmDat[0] = 0; }
    if (temp >= 100)
     { TrmDat[1] = temp / 100; temp = temp % 100; }
    else { TrmDat[1] = 0; }
    if (temp >= 10)
     { TrmDat[2] = temp / 10; temp = temp % 10; }
    else { TrmDat[2] = 0; }
    TrmDat[3] = temp;
  }
:facepalm:
Вот теперича работать точно будет:
disp4a.zip
(4.14 КБ) 52 скачивания
:hunger:
Реклама
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: 7seg на hc595 4digit

Сообщение olegue »

[uquote="BOB51",url="/forum/viewtopic.php?p=4543570#p4543570"]Ну вот и ошибку отловил - причина НЕВНИМАТЕЛЬНОСТЬ - вместо цифирьки запихнул сразу сегментный код!
Надо было так:
Спойлер

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

temp = Dcnt;
 if (temp == 0)
  { for (byte m = 0; m <= 3; m++){ TrmDat[m] = 0; } }
 else 
  { if (temp >= 1000)
     { TrmDat[0] = temp / 1000; temp = temp % 1000; }
    else { TrmDat[0] = 0; }
    if (temp >= 100)
     { TrmDat[1] = temp / 100; temp = temp % 100; }
    else { TrmDat[1] = 0; }
    if (temp >= 10)
     { TrmDat[2] = temp / 10; temp = temp % 10; }
    else { TrmDat[2] = 0; }
    TrmDat[3] = temp;
  }
:facepalm:
Вот теперича работать точно будет:
disp4a.zip
:hunger:[/uquote]

Да!Теперь с нулями бегает , но незначащие нули спереди пишет.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 7seg на hc595 4digit

Сообщение BOB51 »

Это уже "вопросы основной программы" - что заложим, то и покажет.
Главное основной сканер динамической индикации работает, а что он будет выводить на индикацию это циферки (или чего другого) из массива TrmDat[5].
Причем ячейки 0-3 там под цифирь, а старшая тетрада 4й ячейки - управление внешними светиками и служебными линиями (младшая тетрада - то позиционные ключи).
Заодно и знакогенератор "кракозябр" семисегментных прилагается.
Запятую или произвольные символы надо вводить после фрагмента перекодировки в сегментный код, перед установкой флага запроса на перенос данных в массив vram.
8)
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: 7seg на hc595 4digit

Сообщение Martian »

А встроенные спецэффекты будут? ;)
Бегущий сегмент по периметру, например.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 7seg на hc595 4digit

Сообщение BOB51 »

Нее...
То уже вопрос основной программы - что напишем, то и выведет на индикацию.
Если напрямую загружать "кракозябрами" массив предподготовки (без преобразования через знакогенератор) то выводить будет все, что загружено. Минимальный интервал между выводом в одну строку развертки со стороны контроллера динамической индикации (раз в 0,016 секунды), а со стороны основной программы - от момента установки флага запроса до точки переноса примерно такой же (или меньше - в зависимости от того, в какой момент относительно работы сканера был установлен флаг запроса).
Собственно это защита от "случайного сбоя" - индикация меняется только по окончании вывода предыдущей строки (нету "разрыва" индикации).
Но... гашения между выводом позиций также нету - это дополнительное время. Понадеемся на эффект быстродействия по переносу из сдвигового регистра в защелку у 595ых. У кого "живьем" - проверьте на "мерцание/паразитную засветку" как ощущение от индикаторов будет (не устают ли глаза при наблюдении).
Хоша... теоретически можно поставить "гасящий вывод" - один из слотов интервала задержки еще свободен... Но то уже если очень припечет...
Вобщем... похоже таки можно применять этот алгоритм...
8)
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: 7seg на hc595 4digit

Сообщение Martian »

На фото olegue (достаточно больших) не видно засветки
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 7seg на hc595 4digit

Сообщение BOB51 »

Фото - не то же, что глазом ощущать...
:wink:
Второй нюанс - какова будет реакция устройства при совместном применении критичных по времени (и разрыву протокола обмена) этого варианта динамической индикации и библиотек Adafruit_NeoPixel и OneWire?...
То проверять надо...
:dont_know:
У меня есть подобное применение прерывания по OCR0A совместно с термометром-показометром на DS18B20(проект К145М что на котуинке лежит), но там не столь плотно интервал занят - прерывание только флажок ставит. А тут один из слотов почти полностью заполнен.
Для некритичных ко времени и приостановке протоколов обмена и тех, что основаны на аппаратных модулях МК (UART, SPI, I2C) динамическая индикация на основе прерывания не повлияет.
:roll:
Аватара пользователя
Starichok51
Модератор
Сообщения: 19048
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: 7seg на hc595 4digit

Сообщение Starichok51 »

olegue писал(а):Теперь с нулями бегает , но незначащие нули спереди пишет.
нужно делать разветвленный анализ цифр:
если первый ноль, то выводим пробел (или пустое место), или не выводим ничего. иначе переходим к выводу всех цифр.
если первый ноль, анализируем вторую цифру на ноль, и так далее.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: 7seg на hc595 4digit

Сообщение OKF »

Какое там ещё ветвление?)

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

void printInt(uint16_t bin) {
  char chr = ' ';
  for (uint16_t div = 1000; div > 1; div /= 10) {
    uint8_t d = bin / div;
    if (chr != ' ' || d)
      chr = d + '0';
    printChar(chr);
    bin %= div;
  }
  printChar(bin + '0');
}
Исправить под себя.
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: 7seg на hc595 4digit

Сообщение olegue »

[uquote="BOB51",url="/forum/viewtopic.php?p=4543606#p4543606"]У кого "живьем" - проверьте на "мерцание/паразитную засветку" как ощущение от индикаторов будет (не устают ли глаза при наблюдении).

8)[/uquote]

На мой взгляд индикатор засвечен равномерно, индикация спокойная без каких либо артефактов.

Добавлено after 5 minutes 5 seconds:
[uquote="OKF",url="/forum/viewtopic.php?p=4543707#p4543707"]Какое там ещё ветвление?)
Спойлер

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

void printInt(uint16_t bin) {
  char chr = ' ';
  for (uint16_t div = 1000; div > 1; div /= 10) {
    uint8_t d = bin / div;
    if (chr != ' ' || d)
      chr = d + '0';
    printChar(chr);
    bin %= div;
  }
  printChar(bin + '0');
}
Исправить под себя.[/uquote]
Нонешние методики программирования не то что давешние.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 7seg на hc595 4digit

Сообщение BOB51 »

В принципе не так уж сложно незначащие нули в моем тест - примере погасить.
Находим фрагмент:
Спойлер

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

  // перекодировка в сегментный код
  for (byte m = 0; m <= 3; m++)
   { TrmDat[m] = znak(TrmDat[m]); }
Добавляем еще один флажок

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

volatile byte Zflag; // контрольный флаг
и меняем код данного фрагмента на свой.
Примерно вот такой:
Спойлер

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

Zflag = 0;
  if(TrmDat[0] == 0){ TrmDat[0] = fnt_bl; }
   else { TrmDat[0] = znak(TrmDat[0]); Zflag = 1; }
  if(Zflag){ TrmDat[1] = znak(TrmDat[1]); }
   else { if(TrmDat[1] == 0){TrmDat[1] = fnt_bl; }
           else { TrmDat[1] = znak(TrmDat[1]); Zflag = 1; }
        }
  if(Zflag){ TrmDat[2] = znak(TrmDat[2]); }
   else { if(TrmDat[2] == 0){TrmDat[2] = fnt_bl; }
           else { TrmDat[2] = znak(TrmDat[2]); }
        }
  TrmDat[3] = znak(TrmDat[3]);
(Можно тут и символы повставлять -
естественно без использования функции znak :wink: )
8)
Аватара пользователя
Starichok51
Модератор
Сообщения: 19048
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: 7seg на hc595 4digit

Сообщение Starichok51 »

OKF писал(а):Какое там ещё ветвление?
твой код будет писать незначащие нули спереди.
я тут сделал в протеусе проект с 74hc595, никаких "паразиток" не наблюдаю.
еще "до кучи" сделал в протеусе проект с MAX7219, тоже никаких "паразиток" не наблюдаю.
оба проекта без гашения перед следующим выводом символа.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: 7seg на hc595 4digit

Сообщение OKF »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4543882#p4543882"]твой код будет писать незначащие нули спереди.[/uquote]
Та вроде нет - пробелы.)
Это называется с выравниванием по правому краю.
Можно и по левому, если принт переставить):

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

    if (chr != ' ' || d) {
      chr = d + '0';
      printChar(chr);
    }
Аватара пользователя
Starichok51
Модератор
Сообщения: 19048
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: 7seg на hc595 4digit

Сообщение Starichok51 »

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

Добавлено after 53 minutes 51 second:
кусок кода из первого поста:

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

void dig(unsigned char d1, unsigned char d2) {
  digitalWrite(LATCH_PIN, LOW);
  d(d1);
  d(d2);
  digitalWrite(LATCH_PIN, HIGH);
}

void setup() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  Serial.begin(9600);
}
должно быть так:

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

void dig(unsigned char d1, unsigned char d2) {
  d(d1);
  d(d2);
  digitalWrite(LATCH_PIN, HIGH);
  digitalWrite(LATCH_PIN, LOW);
}

void setup() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);

  digitalWrite(CLK_PIN, LOW);
  digitalWrite(LATCH_PIN, LOW);

  Serial.begin(9600);
}
"засветки" и "паразитки" могут быть из-за того, что выход LATCH_PIN оставался в высоком уровне.
при этом из сдвигового регистра входящие данные сразу предавались в выходной регистр.
а импульс на "защелки" нужно подавать после всех принятых бит. тогда не будет "засветок" и "паразиток" .
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 7seg на hc595 4digit

Сообщение BOB51 »

По вопросам причин "паразиток" остался еще один момент - смена данных в ОЗУ "видеопамяти" должна производиться после окончания текущей строки развертки (или перед началом развертки новой строки). Это актуально для 595ых (и аппаратного варианта динамической развертки на выводах самого МК), но не для спецконтроллеров типа MAX7219 - в них все "особенности" уже предусмотрены изготовителем.
8)
Аватара пользователя
Starichok51
Модератор
Сообщения: 19048
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: 7seg на hc595 4digit

Сообщение Starichok51 »

я мог выше быть не прав, и не важно, когда произошла подача нуля на вход защелок.
в моем проекте для протеуса вывод в буфер индикации не синхронизирован с окончанием вывода всех 8 символов. тем не менее, я в протеусе не вижу "паразиток".
а вообще, логика в твоих словах о синхронизации правильная.
у меня таймер работает по 2 мс, то есть, частота вывода 500 Гц.
таким образом, полный вывод всей строки из 8 символов происходит с частотой 62,5 Гц.
в принципе, и у меня может быть сбой (паразитка), если вывод в буфер новой информации произойдет в середине вывода строки. но с такой скоростью динамического вывода я сбой не вижу.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 7seg на hc595 4digit

Сообщение BOB51 »

"Проблеск" при произвольной точке обновления зависит от многих причин - тут и время между запросами обновления, зависящее от длины исполняемых фрагментов основной программы между запросами на обновление, количество знакомест, модуль одновременно выводимых позиций (если портов сегментных ключей более одного) и прочие "стечения обстоятельств".
Иногда даже от момента взгляда на индикатор (типа "...уфф! и померещится же!...").
Давно уже все это учтено в спецконтроллерах. А к самодельной динамической индикации разве что для всяких рекламных щитов с "мультипликацией" да изредка бегущих строк (и то там уже давно спецконтроллеры подавляющее преимущество по применению получили) обращаются.
8)
Аватара пользователя
Starichok51
Модератор
Сообщения: 19048
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: 7seg на hc595 4digit

Сообщение Starichok51 »

если для 74hc595 можно сделать синхронизацию вывода в буфер после окончания вывода всей строки, а как быть со спецконтроллером MAX7219, у него не узнаешь, когда закончен вывод всех 8 разрядов?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 7seg на hc595 4digit

Сообщение BOB51 »

У MAX7219 это уже заложено в его внутренней прошивке - это же не просто регистр, а спецконтроллер динамической индикации.
К примеру, кусочек из моей самодельной библиотеки с описанием его программно доступных ресурсов:
Спойлер

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

#define addp0 1 // значение адреса регистра данных позиции 1 дисплея
#define addp1 2 // значение адреса регистра данных позиции 2 дисплея
#define addp2 3 // значение адреса регистра данных позиции 3 дисплея
#define addp3 4 // значение адреса регистра данных позиции 4 дисплея
#define addp4 5 // значение адреса регистра данных позиции 5 дисплея
#define addp5 6 // значение адреса регистра данных позиции 6 дисплея
#define addp6 7 // значение адреса регистра данных позиции 7 дисплея
#define addp7 8 // значение адреса регистра данных позиции 8 дисплея

#define No_Op 0 // значение адреса регистра No_Op
// регистр No_Op используется исключительно при каскадировании max7219
#define Dec_Mod 9// значение адреса регистра Decode_Mode
#define Intensit 0x0A // значение адреса регистра Intensity
#define Sc_Lim 0x0B // значение адреса регистра Scan_Limit
#define Shut_Dn 0x0C // значение адреса регистра Shut_Down
#define Disp_ts 0x0F // значение адреса регистра Display_test

#define Com_DM_0 0 // Dec_Mod, все позиции только под знакосинтез DM отключен
#define Com_DM_1 1 // Dec_Mod, B_fntN только для позиции 0, поз. 1-7 под знакосинтез
#define Com_DM_2 2 // Dec_Mod, B_fntN для позиций 0-3, поз. 4-7 под знакосинтез
#define Com_DM_3 3 // Dec_Mod, B_fntN для позиций 0-7

#define Com_int_0 0 // Intensit, уровень яркости 1/32 (минимальный)
#define Com_int_1 1 // Intensit, уровень яркости 3/32
#define Com_int_2 2 // Intensit, уровень яркости 5/32
#define Com_int_3 3 // Intensit, уровень яркости 7/32
#define Com_int_4 4 // Intensit, уровень яркости 9/32
#define Com_int_5 5 // Intensit, уровень яркости 11/32
#define Com_int_6 6 // Intensit, уровень яркости 13/32
#define Com_int_7 7 // Intensit, уровень яркости 15/32
#define Com_int_8 8 // Intensit, уровень яркости 17/32
#define Com_int_9 9 // Intensit, уровень яркости 19/32
#define Com_int_A 10 // Intensit, уровень яркости 21/32
#define Com_int_B 11 // Intensit, уровень яркости 23/32
#define Com_int_C 12 // Intensit, уровень яркости 25/32
#define Com_int_D 13 // Intensit, уровень яркости 27/32
#define Com_int_E 14 // Intensit, уровень яркости 29/32
#define Com_int_F 15 // Intensit, уровень яркости 31/32 (максимальный)

#define Com_SL_0 0 // Sc_Lim, индикация только в позиции 0 (max s I 10mA!)
#define Com_SL_1 1 // Sc_Lim, индикация только в позиции 0,1 (max s I 20mA!)
#define Com_SL_2 2 // Sc_Lim, индикация только в позиции 0,1,2 (max s I 30mA!)
#define Com_SL_3 3 // Sc_Lim, индикация только в позиции 0,1,2,3
#define Com_SL_4 4 // Sc_Lim, индикация только в позиции 0,1,2,3,4
#define Com_SL_5 5 // Sc_Lim, индикация только в позиции 0,1,2,3,4,5
#define Com_SL_6 6 // Sc_Lim, индикация только в позиции 0,1,2,3,4,5,6
#define Com_SL_7 7 // Sc_Lim, индикация только в позиции 0,1,2,3,4,5,6,7

#define Com_Shutdn_md 0 // Shut_Dn, значение данных команды Shutdown_mode
#define Com_Normal_md 1 // Shut_Dn, значение данных команды Normal_mode
#define Com_tst_on_md 1 // Disp_ts, значение данных команды display test on_mode
#define Com_tst_of_md 0 // Disp_ts, значение данных команды display test off_mode

и сама "библиотечка" (сделана "в рамках референса" ардуино)
max72m.zip
(5.17 КБ) 54 скачивания
8)
Аватара пользователя
Starichok51
Модератор
Сообщения: 19048
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: 7seg на hc595 4digit

Сообщение Starichok51 »

удивляюсь я сочинительством библиотек для самых простых дел.
для MAX7219 нужна всего одна подпрограмма (функция) отправки двух байтов команды, и ради этого сочинять библиотеку.
ладно, сочинил библиотеку, сделал, что хотел.
а зачем ты везде сделал задержки по 60 мкс? только тормозить вывод.
микросхема работает до 10 МГц, это значит, что она будет работать даже при тактовой частоте 20 МГц, и без всяких принудительных задержках.
а зачем тебе понадобилось создавать функцию overZnak? а также функцию znak, которая у тебя при выводе не используется?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Ответить

Вернуться в «AVR»