Оптимизация кода 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] зависит от того как и чем заполняется) это будет видео-память. Далее выводим данные из видео-памяти в регистры и поджигаем нужные этажи не в циклах с задержками, а в прерывании по таймеру, не применяя деления (/) , умножения (*) и остатка от деления (%) - это увеличит частоту индикации. В итоге получаем относительно немигающию, то есть для глаза незаметную, динамическую индикацию, при чем работающую в фоновом режиме. А дальше остается только придумать как и чем заполнять массив (видео-память).
Спасибо.