Связка Mega2560 с p10 led module

dneese
Offline
Зарегистрирован: 20.12.2018

оно самое

LedP10 : Arduino library for P10 LED Display Panels

b707
Offline
Зарегистрирован: 26.05.2017

VsemDobra - смотрю вы код поправили. EEPROM.get() теперь стоит в правильном месте. А вот EEPROM.put() так вызывать нельзя, вы его вызываете при каждом "обороте" loop() - вы так в памяти дырку протрете очень быстро, у нее же ограничение на количество записей всего 100 тыс. раз

Надо придумать так, что бы данные скидывались в ЕЕПРОМ только перед выключением. Это вообще-то, непростая задачка. Для начала попробуйте писать данные в ЕЕПРОМ при нажатии кнопки, эта задачка попроще.

VsemDobra
Offline
Зарегистрирован: 24.03.2019

b707 пишет:

VsemDobra - смотрю вы код поправили. EEPROM.get() теперь стоит в правильном месте. А вот EEPROM.put() так вызывать нельзя, вы его вызываете при каждом "обороте" loop() - вы так в памяти дырку протрете очень быстро, у нее же ограничение на количество записей всего 100 тыс. раз

Надо придумать так, что бы данные скидывались в ЕЕПРОМ только перед выключением. Это вообще-то, непростая задачка. Для начала попробуйте писать данные в ЕЕПРОМ при нажатии кнопки, эта задачка попроще.

Здравствуйте b707. Про ограниченном колличестве циклов запись-стирание в EEPROM знаю и по этому не стал долго гонять  в таком режиме - сразу вернулся на предыдущюю версию скетча.  В теории  знаю, что  запись в EEPROM  по выключению  можно организовать с помощью аналогового компаратора. На практике  пока не по плечу.  По нажатию на кнопку в данном случае хороший вариант. Пока отсчитаются 100 тыс. нажатий может разберусь.  Подскажите пожалуйста правильно ли  EEPROM.put()  разместить таким образом , для каждой кнопки отдельно  или все таки луше  по событию - нажата одна из кнопок, записываем в EEPROM?  Спасибо.

   void loop(void)
 { 
  if(digitalRead(1)==HIGH)//если кнопка нажата ..
 { ui = ui+1; // прибавляем 1 
 EEPROM.put(1,bigNum);
 ShowClockNumbers( ui, true );
 delay(100);
 }
  if(digitalRead(2)==HIGH)//если кнопка нажата ..
 { ui = ui+10; // прибавляем 10
EEPROM.put(1,bigNum); ShowClockNumbers( ui, true );

delay(100);

sadman41
Offline
Зарегистрирован: 19.10.2016

Делайте так: как только нажата любая кнопка - запоминайте время нажатия (миллис) и взводите флаг "есть изменения". Дальше условие: если есть изменения и с момента последнего нажатия кнопки/кнопок прошло 30сек - пишите в еепром и сбрасывайте флаг, сигнализируя что изменений более нет.

bwn
Offline
Зарегистрирован: 25.08.2014

EEPROM.update ????? Вроде, наше все.

sadman41
Offline
Зарегистрирован: 19.10.2016

::put() унутре дёргает за ::update()

bwn
Offline
Зарегистрирован: 25.08.2014

Тогда, с чего дыра возьмется? Или я что то путаю?

sadman41
Offline
Зарегистрирован: 19.10.2016

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

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

А вообще - операции с EEPROM относительно медленные, проверка байта "есть изменения" быстрее в разы.

В этом случае, согласен. Если временных затыков нет, тогда зачем огород городить? ИМХО.

FoxJone
Offline
Зарегистрирован: 19.04.2019

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

Судя по всему, это самая живая тема про DMD (DMD2) в частности и про LED-модули вообще. Посему пожалуюсь тут на свое горе.

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

В свое время начинал с достаточно дорогого "илитного" железа, но чем дальше в кризис, тем дешевле комплектуха. Года два назад перешел на атмеги. Ну там в принципе ничего сложного, нашел DMD, разобрался, штампую во все поделки, использую в основном мини про, цена 100 рублей, мило дело! Тем более, что табло все были не большие (а зачем большое табло на весах или счетчике радиации?), мини тянет без проблем.

Но тут привалил заказ: монохромное табло 3*1 метр (288*96 пикселей, для конкретности). На табло выводятся данные с 6 датчиков в порядке очередности, датчики прилагаются (датчики цифровые, I2C - не проблема вообще). Процесс получения данных я освоил дня за три, еще два дня рисовал шрифт высотой 96 пикселей. Все это время гонял инфу на "карманном" табло в 3 модуля (96*16), но были вопросы насчет количества поддерживаемых модулей. Надо было тестировать. Как раз приволокли в разработку готовое табло 6*3 модуля, решил на нем погонять. Начал все на мини про (328 проц) - реально без тормозов и глюков поддерживает только 10 модулей. Без разницы, в каком они порядке стоят. Поставил Мегу2560. Те же самые 10 модулей! Однако, проблема! У меня то 54 модуля в цепи! Судя по внешнему виду табло, процам явно не хватает скорости обновления (я занимаюсь табло больше 10 лет, я в этом понимаю).

Ок, иду в закрома и начинаю смотреть, чего у меня есть мощного и быстрого... Нашел мощный и быстрый STM32... Попробовал  поставить его, но ни одна известная мне библиотека для P10 не стала с ним работать... А писать свое я был не готов, да и сроки жмут! Иду в закрома дальше, выковыриваю оттуда ESP8622 на плате Wemos D1 pro. Несмотря заявленное отсутствие поддержки DMD2, через день ковыряния он начинает замечательно показывать на табло все, что я хочу...

Ну как все... Большого табло у меня не было, а на маленьком в 18 модулей он летает + если прописать 54 (а я прописывал и 80) модулей, то его это не напрягает вообще... Но дьявол кроется в деталях!

В один прекрасный момент мне привозят это готовое табло 288*96 пикселей, я ставлю на него контроллер и с удивлением вижу на экране какой то бред. Нет, показывает он изумительно: четко, быстро, никакой ряби... Но не то! Начинаю курить коды...

На второй день к вечеру я докапался до нужного момента.... Сволочной аппаратный SPI (СофтСПаЙ не поддерживается ESPшкой)! Этот гад DMD2 ОДНИМ байтом (который по умолчанию не может быть больше 255) шлет в хаб (hub12) координаты пикселя по Х. То есть, если экран 7 модулей (224 пикселя) все работает отлично. Если ставишь 8 - экран пуст (считает себя длиной 0), если ставишь 9 - считает себя длиной 32 пикселя.

SoftDMD этой проблемы не имеет.

Вопрос, собственно такой: люди добрые, помозите сиротинушке, подскажите в горе-горьком!

Или как запустить SoftDMD на ESPшке. Или как обойти ограничение в 8 модулей на SpiDMD. Или какую железку взять, что бы на ней запустить SoftDMD и при том быструю. Или подскажите какие библиотеки под STM...

Hr.Smartus
Offline
Зарегистрирован: 27.05.2017

Возможно вам поможет эта ветка форума http://forum.freetronics.com/viewtopic.php?f=26&t=6352
Вообще советую там полазить, там много интересных вопросов задают, сам оттуда многое почерпнул

b707
Offline
Зарегистрирован: 26.05.2017

Если в коде СофтСПИ библиотеки этой проблемы нет - почему бы не посмотреть, как там осуществляется адресация и не перенести эту часть кода в ДМД2 ? - но только для этого надо быть уверенным. что ХАБ12 поддерживает адресацию больше байта.

Так что вопрос упирается в то, действительно ли вы проверили, что этой проблемы в СофтСПи нет - или вы просто так думаете.

 

Что касается СТМ - для нее есть экспериментальная библиотека DMDSTM (или STMDMD)дума. ее можно допилить, если навыки программирования имеются.

FoxJone
Offline
Зарегистрирован: 19.04.2019

Хаб12 100% поддерживает, потому что мне доводилось делать строки более 10 метров(не на дмд и вообще не на самодельных контроллерах).
На софтСПИ завтра посмотрю, но больно муторное занятие, откровенно говоря

ДмдСТМ я нашел, но!
"dont work stm32f103"
А у меня как раз такой

b707
Offline
Зарегистрирован: 26.05.2017

FoxJone пишет:
На софтСПИ завтра посмотрю, но больно муторное занятие, откровенно говоря

а чего там муторного? Там же в нижний уровень лезть не надо. Да и сама библиотека не особо навороченная, кмк

Hr.Smartus
Offline
Зарегистрирован: 27.05.2017

А что если для настолько большого табло использовать что-то мощнее, например распберри? https://youtu.be/oggOUJt_Ihc вот на амперке игрались с РГБ матрицами высокой плотности пикселей, думаю монохром она потянет элементарно. Там и частота позволяет, и библиотека может быть реализована иначе, что позволит подключить необходимое кол-во модулей

b707
Offline
Зарегистрирован: 26.05.2017

Hr.Smartus пишет:
А что если для настолько большого табло использовать что-то мощнее, например распберри?

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

Да и не уверен, что Расбери будет быстрее в этой задаче. Частота у нее может и больше, но Расбери уже не система реального времени и Думаю. скорее всего сильно проиграет в скорости той же ЕСП

b707
Offline
Зарегистрирован: 26.05.2017

FoxJone - не дождался ответа, глянул текст DMD2 - не совсем понятно, с чего вы взяли, что в SOFTDMD нет этой проблемы? - это не так. Координаты пикселей и в DMD и в SOFTDMD закодированы одинаково - байтом, так что и софтовый и хардварный ДМД будет одинаково глючить на больших матрицах.

 

FoxJone
Offline
Зарегистрирован: 19.04.2019

b707, согласен, сегодня тоже докопался до этого момента.

Просто у меня сложилось впечатление, что народ делал длинные строки на ДМД, поэтому я решил, что софтДМД позволяет это делать.
По итогам сегодняшних изысканий пришел к выводу, что табло длиннее 244 пикселей на ДМД не возможны в принципе. В принципе я проблему решил, но не самым красивым образом, прямо скажем понастроил костылей и подпорок со всех сторон проекта. Была бы еще неделя - разобрался бы и сделал красиво, но сроки горят, сдача была вчера...
На будущее себе наметил неспешно и с расстановкой выяснить возможность надстройки к ДМД, которая позволит давать вывод не на HUB12, а на HUB50. На стандартных китайческих контроллерах к этому хабу подключают вот такие разветвители HUB12, что позволяет подключать модули строками, не тянуть шлейфы змейкой туда-сюда. Цена такого хаба копейки (100 на Али, 300 в России), так что штука была бы очень полезная.
Но это в свободное время, коего в ближайший месяц точно не предвидится, да и дел там не на одну неделю.
b707
Offline
Зарегистрирован: 26.05.2017

FoxJone пишет:

По итогам сегодняшних изысканий пришел к выводу, что табло длиннее 244 пикселей на ДМД не возможны в принципе.
 
хм, почему именно 244-х? - странная цифра. Вроде должно быть 256 - ровно 8 матриц по горизонтали. Что касается "невозможно" - по-моему. всегда остается метод решения "в лоб": поменять тип параметров width и height с uint8_t на uint16_t по всей библиотеке. Если HUB12 это поддерживает - должно сработать.
Другой вопрос. что это именно "муторно", как вы писали выше :) Покопался в библиотеке - кривовато написано, размеры матрицы присутсвуют и в виде полей класса DMD и в виде локальных переменных... долго выискивать придется.
 
Цитата:
В принципе я проблему решил, но не самым красивым образом, прямо скажем понастроил костылей и подпорок со всех сторон проекта.
 
если не секрет - как решили?
 
 
FoxJone
Offline
Зарегистрирован: 19.04.2019

b707 пишет:
хм, почему именно 244-х? - странная цифра. Вроде должно быть 256 - ровно 8 матриц по горизонтали.

Опечатался, хотел сказать 224, то есть 7 модулей.  256 уже считает как 0 - проверил эксперементально. Видимо, отсчет идет от 0 до 255.

b707 пишет:
всегда остается метод решения "в лоб": поменять тип параметров width и height с uint8_t на uint16_t по всей библиотеке.

С этого начал, именно это меня и вывело на библиотеку SPI. Судя по всему, надо применять какие то другие методы, но настолько глубоко я не готов был лезть.

b707 пишет:
если не секрет - как решили?

Цифровую информацию вывожу на поле 224*96, а еще две колонки (64*96) подцепил к другому контроллеру (на мини про), который выводит туда обозначения. Синхронизация по 232.

Выглядит примерно так: поле1 >[ 2544 ] [кг]<поле2 

lean_74
Offline
Зарегистрирован: 22.12.2015

вопрос FoxJone, преобразователь уровней ставил при подключении к wemos d1? или напрямую? трехцветная панель c HUB75 у меня заработала сразу. a одноцветная  Р10 HUB12, чтото фигню какуюто показывает на esp8266, c pro mini все работает.

FoxJone
Offline
Зарегистрирован: 19.04.2019

lean_74 пишет:

вопрос FoxJone, преобразователь уровней ставил при подключении к wemos d1? или напрямую? трехцветная панель c HUB75 у меня заработала сразу. a одноцветная  Р10 HUB12, чтото фигню какуюто показывает на esp8266, c pro mini все работает.

У меня вемос д1 мини про, он прекрасно работает с 5в уровнями, так что подключаю на прямую. Пошла сразу, только инициируется через SPIDMD, а не через SoftDMD. СофтДМД не поддерживается. Единственно, надо прописывать пины, но это я везде делаю, стандартная распиновка мне не нравится, плохо на монтажку встает. Вот этот тест точно работает:

#include <SPI.h>
#include <DMD2.h>
#include <fonts/TahomaB16.h>

SPIDMD dmd(3, 2, 15, 16, 12, 0);

void setup() {
  dmd.setBrightness(255);
  dmd.selectFont(TahomaB16);
  dmd.begin();
  dmd.drawString(0, 0, "1234567890");
}

void loop() {
}

Вот с чем столкнулся, так это с тем, что вместе с ДМД не работает ВайФай-сервер. Было неприятным сюрпризом, потому что планировал сделать вебморду на управление, и даже уже сделал ее и оттестировал. А как начал собирать проект в кучу - всплыла несовместимость. Опять же времени разбираться уже не было, поэтому по быстрому накодил управляющую программку под винду, которая тупо шлет команды настройки на вемос. А жаль, потому что изначально планировал красиво управлять из под любого браузера (ПК, ноут, смарт).

То есть клиент+ДМД работает, а сервер+ДМД нет. Думаю, где то библиотеки пересекаются в таймерах, но это не точно.

lean_74
Offline
Зарегистрирован: 22.12.2015

FoxJone пишет:

То есть клиент+ДМД работает, а сервер+ДМД нет. 

Вот оно че! а я тут маюсь... Тогда ставим промини, как контроллер экрана и ему по uart-у esp-кой шлем чего выводить. По "деталькам" дешевле esp32,  и портов дополнительных с избытком. 

b707
Offline
Зарегистрирован: 26.05.2017

FoxJone пишет:

Вот с чем столкнулся, так это с тем, что вместе с ДМД не работает ВайФай-сервер. Было неприятным сюрпризом, потому что планировал сделать вебморду на управление, и даже уже сделал ее и оттестировал. А как начал собирать проект в кучу - всплыла несовместимость. Опять же времени разбираться уже не было

Это странно. Думаю причина в том, что "времени разбираться не было". Пересекаться там нечему, вообще-то - ДМД использует таймер по минимуму и ей все равно, на каком таймере висеть

FoxJone
Offline
Зарегистрирован: 19.04.2019

Апдейт к предыдущему: все таки запустил вайфай и вебморду.

Фишка оказалось в чем: все это добро надо было инициализировать ДО инициализации ДМД. И использовать в самом простом варианте: всякие ДНСсервера уже начинают виснуть. А так работает, хоть и не очень стабильно.

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

dneese
Offline
Зарегистрирован: 20.12.2018

кто спрашивал за скролинг двух независимых строк?

http://forum.freetronics.com/viewtopic.php?t=5900 тут решение для dmd

добавить в DMD.cpp

//**************************************************************************************
// stepSplitMarquee(int topRow, int bottomRow)
// This is a cut-down modification of stepMarquee(). It steps only the rows specified.
// Only horizontal, single step, left scroll is catered for.
// This function allows you to have only a part of the DMD array scrolling, while the
// remainder stays still and is not cleared during scrolling.
//**************************************************************************************

boolean DMD::stepSplitMarquee(int topRow, int bottomRow)
{
  boolean ret=false;
  marqueeOffsetX += -1;  // only scroll horizontally, 1 place left
  if (marqueeOffsetX < -marqueeWidth) { // if text has scrolled off the screen
    marqueeOffsetX = DMD_PIXELS_ACROSS * DisplaysWide; // set up to scroll again from the far right
    drawFilledBox(0, topRow, DisplaysWide*DMD_PIXELS_ACROSS-1, bottomRow, GRAPHICS_INVERSE); // clear the scroll rows
    ret=true; // indicates that this scroll has completed
  }

// This is the main change from the original function.
// It splits the left shift task into rows and bytes within a row to allow rows to be identified
// and treated separately.
  for (int row=topRow ;row<=bottomRow; row++) { // loop for each row in the scroll area
    for (int byteInRow=0; byteInRow<DisplaysWide*4; byteInRow++) { // loop for each byte within a row (4 per DMD across)
      int thisIndex = (DisplaysTotal*4)*(row%16) + (4*DisplaysWide*(row/16)) + byteInRow; //calculate index into screen buffer
      if ((byteInRow%(DisplaysWide*4)) == (DisplaysWide*4) -1) {  // if it's the last byte in a row
        bDMDScreenRAM[thisIndex]=(bDMDScreenRAM[thisIndex]<<1)+1;
        // shift bits left, and puts a '1' in last position (a '1' = LED OFF)
    
      } else {                                            // if it's NOT the last byte in a row
        bDMDScreenRAM[thisIndex]=(bDMDScreenRAM[thisIndex]<<1) +
                    ((bDMDScreenRAM[thisIndex+1] & 0x80) >>7);
        // shift bits left as well as the shifting the MSB of the next byte into the LSB
      }
    }
  }
  // Redraw last char on screen
  // required because 
  int strWidth=marqueeOffsetX;
  for (byte i=0; i < marqueeLength; i++) {
    int wide = charWidth(marqueeText[i]);
    if (strWidth+wide >= DisplaysWide*DMD_PIXELS_ACROSS) {
      drawChar(strWidth, marqueeOffsetY,marqueeText[i],GRAPHICS_NORMAL);
      return ret;
    }
    strWidth += wide+1;
  }
  return ret;
}

добавить в dmd.h

  //Move the marquee left 1 place - special case of stepMarquee()
  // which only scrolls a limited portion of the display 
  boolean stepSplitMarquee(int topRow, int bottomRow);

пример:

/*
Test sketch for split screen scrolling
NOTE that this sketch uses the Freetronics version of the DMD library available here:
https://github.com/freetronics/DMD/
but with the additional dmd.stepSplitMarquee() function.

I also suggest that you make sure this has been changed DMD.cpp
change the line:
  SPI.setClockDivider(SPI_CLOCK_DIV128);
to:
  SPI.setClockDivider(SPI_CLOCK_DIV2);  // system clock / 2 = 8MHz SPI CLK to shift registers
This provides a marked improvement in the DMD update time within the interrupt routine.
*/

#include "SPI.h"        
#include "DMD.h"        
#include "TimerOne.h"
#include "SystemFont5x7.h"

#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1

DMD dmd( DISPLAYS_ACROSS , DISPLAYS_DOWN);

void ScanDMD()
{
  dmd.scanDisplayBySPI();
}

void setup()
{
  Timer1.initialize( 4000 );   // I find the default 5000 gives a visible flicker         
  Timer1.attachInterrupt( ScanDMD );  
  dmd.selectFont(SystemFont5x7);
  dmd.clearScreen( true );     // start with a blank screen
}

void loop()
{
  unsigned long time;
  int n;
  boolean ret = false;

  // Show some stationary text on the bottom half, and scrolling text on the top half
  // scrolls 3 times
  dmd.drawString(0,8,"Stays still",11,GRAPHICS_NORMAL); // the stationary string
  dmd.drawMarquee("Scrolling text",14,0,0); // set up the marquee
  time = millis();
  n=0;
  while(n<3) {
    while (!ret) {
      if ((time+30) < millis()) {
        ret = dmd.stepSplitMarquee(0,7); // parameters are the top & bottom rows to be scrolled
        time = millis();
      }
    }
    ret = false;
    n++;
  }
  dmd.clearScreen( true );

  // Now some stationary text on the top half, and scrolling text on the bottom half
  // scrolls for 10 seconds
  dmd.drawString(0,0,"Stays still",11,GRAPHICS_NORMAL); // stationary text
  dmd.drawMarquee("Scrolling text",14,0,8); // set up the marquee
  time = millis();
  while ((millis() - time)<10000){ // loop for 10 seconds
    dmd.stepSplitMarquee(8,15); // only scroll rows 8 to 15
    delay(30);
  } // a slightly different way to loop for stepping the marquee
    // note that this does not test for completion of the scroll, but continues until
    // the 10 second time has expired
  dmd.clearScreen( true );

  // Now a bit of fun
  dmd.drawString(0,-4,"vvvvvvvvvvv",11,GRAPHICS_NORMAL); // note the position is above a single DMD so
                                                         // only part of the text will be visible
  dmd.drawString(0,13,"^^^^^^^^^^^",11,GRAPHICS_NORMAL); // and this is too far down a single DMD so
                                                         // only part will be visible
  // these 2 lines above use partial characters displayed on the screen by placing the text at non-standard positions
  // to give a graphical highlight effect.
  dmd.drawMarquee("Scrolling text",14,0,5);
  time = millis();
  while ((millis() - time)<10000){ // again we will scroll for 10 seconds
    dmd.stepSplitMarquee(5,11); 
    delay(30);
  }
  dmd.clearScreen( true );
}

 

lean_74
Offline
Зарегистрирован: 22.12.2015

dneese, спасибо, как раз то, что искал. 

b707
Offline
Зарегистрирован: 26.05.2017

Запустил DMD на STM32 (,блюпилл) в среде Ардуино. За основу взял библиотеку DMDSTM.h

https://github.com/mozok/DMDSTM

Библиотека в принципе рабочая, надо только примеры под СТМ32 переписать. Почему там в отзывах написано, что на STM32F103 не пашет - непонятно, видимо человек не разобрался.

Вот видео, хотя конечно на экране нифига не поймешь, что за плата там работает :)

https://youtu.be/AFy1Esi6yro

b707
Offline
Зарегистрирован: 26.05.2017

пишу сюда, потому что это единственная живая ветка на форуме, посвященная p10 DMD матрицам.

Допилил порт библиотеки DMD.h для плат на STM32 до относительно стабильного уровня, предлагаю желающим попробовать. Открыл ветку в Проектах: http://arduino.ru/forum/proekty/dmdstm32-versiya-biblioteki-dmd-dlya-stm32duino

FoxJone
Offline
Зарегистрирован: 19.04.2019

Спасибо, буду тестировать. Если что интересное появится - сообщу.

1982rodman
Offline
Зарегистрирован: 05.01.2019

1

1982rodman
Offline
Зарегистрирован: 05.01.2019

Привет всем! Подскажите, пожалуйста, в какую сторону копнуть? Собрал я на основе ардуино уно и модулей р10 с использованием библиотеки dmd2 таймер, который реализовал через использование millis(), все работает, но обнаружил такой факт. При количестве светодиодных модулей больше пяти штук ход таймера замедляется примерно 1,5 раза

FoxJone
Offline
Зарегистрирован: 19.04.2019

1982rodman пишет:
Привет всем! Подскажите, пожалуйста, в какую сторону лопнуть? Собрал я на основеработе ардуино уно и модулей р10 с использованием библиотеки dmd2 таймер, который реализовал через использование millis(), все работает, но обнаружил такой факт. При количестве светодиодных модулей больше пяти штук ход таймера замедляется примерно 1,5 раза

Родной таймер вообще не точный, а при больших нагрузках (а DMD сильно грузит МК) становится очень сильно не точный. Я с этим сталкивался неоднократно и теперь в таких случаях всегда добавляю в схему часы.

FoxJone
Offline
Зарегистрирован: 19.04.2019

дублит что то

1982rodman
Offline
Зарегистрирован: 05.01.2019

Имеете в виду такой

FoxJone
Offline
Зарегистрирован: 19.04.2019

Да любые. DS1302, DS1307, DS3231... Смотрите, какие вам удобнее подключать. 

Внешне они все почти одинаковые, как у вас на фото.

FoxJone
Offline
Зарегистрирован: 19.04.2019

del

1982rodman
Offline
Зарегистрирован: 05.01.2019

А там можно получить десятые доли секунды?

FoxJone
Offline
Зарегистрирован: 19.04.2019

1982rodman пишет:
А там можно получить десятые доли секунды?

Нет, это все простенькие дешевые часы для отсчета именно часов, минут и секунд.

Для вас тогда STM-овские часы серии M41Txx

http://www.farnell.com/datasheets/1732966.pdf

Но я вообще не представляю, гды я бы их смог быстро купить, в отличие от далассовского ширпотреба, который продается в любом радиоларьке.

1982rodman
Offline
Зарегистрирован: 05.01.2019

FoxJone пишет:

1982rodman пишет:
Привет всем! Подскажите, пожалуйста, в какую сторону лопнуть? Собрал я на основеработе ардуино уно и модулей р10 с использованием библиотеки dmd2 таймер, который реализовал через использование millis(), все работает, но обнаружил такой факт. При количестве светодиодных модулей больше пяти штук ход таймера замедляется примерно 1,5 раза

Родной таймер вообще не точный, а при больших нагрузках (а DMD сильно грузит МК) становится очень сильно не точный. Я с этим сталкивался неоднократно и теперь в таких случаях всегда добавляю в схему часы.


Меня та точность устраивала. Возможно ли как-то решить по другому проблему?

dneese
Offline
Зарегистрирован: 20.12.2018

А разве нельзя брать секунду с DS1302 и делить её на десятые с помощью millis(),?

FoxJone
Offline
Зарегистрирован: 19.04.2019

1982rodman пишет:
Меня та точность устраивала. Возможно ли как-то решить по другому проблему?

Попробуйте micros, но это не точно. Эксперементируйте.

1982rodman
Offline
Зарегистрирован: 05.01.2019

Дак с этой функцией и тормозит

1982rodman
Offline
Зарегистрирован: 05.01.2019

FoxJone пишет:

1982rodman пишет:
Меня та точность устраивала. Возможно ли как-то решить по другому проблему?

Попробуйте micros, но это не точно. Эксперементируйте.


Пробовал. Так же

FoxJone
Offline
Зарегистрирован: 19.04.2019

Вообще, если не секрет, что это у вас за девайс и какая его цель?

1982rodman
Offline
Зарегистрирован: 05.01.2019

Да я табло для спортзала нашего делал

1982rodman
Offline
Зарегистрирован: 05.01.2019

А может отдельно ардуину нано, например, для таймера выделить

FoxJone
Offline
Зарегистрирован: 19.04.2019

1982rodman пишет:
Да я табло для спортзала нашего делал

Забейте на десятые доли. Я тоже делал табло для спортзала, отказался от отображения десятых, потому, что все равно их мелькания не видно на табло. время я вообще считал на компьютере судьи (и там на интерфейсе судьи были и десятые и сотые - тоже гемора схватил, но сделал), а на табло тупо слал раз в секунду количество секунд.

Заказчику просто объяснил, что из за скорости обновления светодиодов физически невозможно отображать десятые на табло, а на компе все это есть. Заказчика устроило.

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

1982rodman
Offline
Зарегистрирован: 05.01.2019

Да я как бы нашел выход, в коде методом подбора умножил millis() на коэффициент. Считает нормально, сверял на интервале 40 мин. Почти без погрешности. Только десятые не отображаются как нужно-проскакивают

1982rodman
Offline
Зарегистрирован: 05.01.2019

С компьютером я тоже делал. Там проще было. Тут пульт