Оптимизация кода led куба
- Войдите на сайт для отправки комментариев
Ср, 10/06/2015 - 09:13
Светодиодный куб все равно мигает. Подозреваю, что проблема в коде. Помогите поправить. Куб 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
}
}
Конечно в коде, но никто вам не поможет, так как данный код оптимизировать нельзя. Можно только полностью переписать.
Делается примерно следующее. Заменяем shiftOut и digitalWrite на хардовый SPI и прямую запись в порты. Объявляем массив [8][8][8] (или [64][8] зависит от того как и чем заполняется) это будет видео-память. Далее выводим данные из видео-памяти в регистры и поджигаем нужные этажи не в циклах с задержками, а в прерывании по таймеру, не применяя деления (/) , умножения (*) и остатка от деления (%) - это увеличит частоту индикации. В итоге получаем относительно немигающию, то есть для глаза незаметную, динамическую индикацию, при чем работающую в фоновом режиме. А дальше остается только придумать как и чем заполнять массив (видео-память).
Спасибо.