Оптимизация кода led куба

maksmkv
Offline
Зарегистрирован: 07.04.2013
Светодиодный куб все равно мигает. Подозреваю, что  проблема в коде. Помогите поправить. Куб 8x8x8 через 74hc595

//Пин подключен к ST_CP входу 74HC595
int latchPin = 3;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 2;
//Пин подключен к DS входу 74HC595
int dataPin = 4;

int myPins[] = {6, 7, 8, 9, 10, 11, 12, 13};   //массив пинов - выходы для строк

byte MyMassive[64];  //массив диодов

int i,j,x,y,z,a;
const int b=2;

void setup() {
  
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
   
  for (i = 0; i <=7; i++) {   //столбы
    pinMode(myPins[i],OUTPUT);

   digitalWrite(latchPin, LOW);
    // передаем последовательно на dataPin
  }
  
        
     }


void loop() 
{
  
  for (x=0; x<=64; x++){

    MyMassive[x]=255;
   
   
 for(a=0; a<=100/b; a++){
 myMultiplyFunction();}

}}


byte myMultiplyFunction(){
  // устанавливаем синхронизацию "защелки" на LOW
       
     for(j=0; j<=7; j++)
     {   //этаж
       for(z=0; z<=7; z++)
       {
            shiftOut(dataPin, clockPin, MSBFIRST, MyMassive[z+(j*8)]); 

                    //"защелкиваем" регистр, тем самым устанавливая значения на выходах
       }
      
    digitalWrite(latchPin, HIGH);
    // пауза перед следующей итерацией

    digitalWrite(latchPin, LOW);
    // передаем последовательно на dataPin
    
    digitalWrite(myPins[j], HIGH); 
    delay(b);               // wait for a second
    digitalWrite(myPins[j], LOW);    // turn the LED off by making the voltage LOW
    }
         

}

 

maksim
Offline
Зарегистрирован: 12.02.2012

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

Делается примерно следующее. Заменяем shiftOut и digitalWrite на хардовый SPI и прямую запись в порты. Объявляем массив [8][8][8] (или [64][8] зависит от того как и чем заполняется) это будет видео-память. Далее выводим данные из видео-памяти в регистры и поджигаем нужные этажи не в циклах с задержками, а в прерывании по таймеру, не применяя деления (/) , умножения (*) и остатка от деления (%) - это увеличит частоту индикации. В итоге получаем относительно немигающию, то есть для глаза незаметную, динамическую индикацию, при чем работающую в фоновом режиме. А дальше остается только придумать как и чем заполнять массив (видео-память).

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Спасибо.