Здравствуйте.
Собрал светодиодный куб на основе
http://radiokot.ru/circuit/light/run/34/
Но после прошивки он работает не так как прописывал, подскажите где я не так делаю
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000
unsigned char date[5][5]={
{255,255,255,255,255},
{255,255,255,255,255},
{255,255,255,255,255},
{255,255,255,255,255}, //
{255,255,255,255,255},
};
unsigned char date1[5][5] = {
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0b00000100,0,0},
{0,0,0,0,0},
{0,0,0,0,0}, };
unsigned char date2[5][5] = {
{0,0,0,0,0},
{0,0b00001110,0b00001110,0b00001110,0},
{0,0b00001110,0b00001010,0b00001110,0},
{0,0b00001110,0b00001110,0b00001110,0},
{0,0,0,0,0}, };
unsigned char date3[5][5] = {
{255,255,255,255,255},
{255,0b00010001,0b00010001,0b00010001,255},
{255,0b00010001,0b00010001,0b00010001,255},
{255,0b00010001,0b00010001,0b00010001,255},
{255,255,255,255,255}, };
unsigned char i,a,b,sh;
unsigned char STAGE[5] = {247, 239, 223 , 191, 127};
unsigned char CLK_T[5] = {3, 5, 9, 17, 33};
int main(void)
{
DDRB = 0b00111110;
PORTB = 0b00000001; //управление триггерами
DDRC = 0b00011111; //данные на триггеры
PORTC = 0b00011111; // 1 не горит, 0 горит
DDRD = 0b11111000;
PORTD=0b11111000; //управление этажами
PORTB = 0xFF; //включение всех триггеров дабы потушить куб
asm("nop");
PORTB = 0x01; //сброс управляющего сигнала на триггеры
b=0; sh=0;
while(1)
{
switch(b){
case 0:
for(a=0;a<5;a++){
PORTD = STAGE[a]; //тушим этаж чтоб задать ему ряды
_delay_ms(20);
for(i=0;i<5;i++)
{
PORTC =~ date1[a]
; //берем из массива нужную строку (инверсия ибо включается нулем)
PORTB = CLK_T; //поочередное включение триггеров
asm("nop");
PORTB = 0x01; } // сброс комнды на триггер
_delay_ms(250); }
b=1; break;
case 1:
for(a=0;a<5;a++){
PORTD = STAGE[a];
_delay_ms(20);
for(i=0;i<5;i++)
{
PORTC =~ date2[a];
PORTB = CLK_T;
asm("nop");
PORTB = 0x01; }
_delay_ms(250); }
b=2; break;
case 2:
for(a=0;a<5;a++){
PORTD = STAGE[a];
for(i=0;i<5;i++)
{
PORTC =~ date3[a];
PORTB = CLK_T;
asm("nop");
PORTB = 0x01; }
_delay_ms(250); }
b=0; break;
}
}
}
Добавлено after 17 minutes 54 seconds:
В идеале он тут должен был сначала зажечь центральный светодиод , потом куб 3х3х3 и затем 5х5х5 и так повторяться, а получилось нечто совсем иное
Добавлено after 11 minutes 55 seconds:
http://img.radiokot.ru/files/97296/medi ... 7op7x3.gif
это гифка того что получается
Добавлено after 24 minutes 6 seconds:
Логика работы следующая:
1, Сначала снимаются управляющие сигналы с триггеров(PORTB), и на сами триггеры подаются 1. Вместе с этим подается питание на все этажи (PORTD). По командам PORTB = 0xFF; PORTB = 0x01; приходит управляющий сигнал на триггеры и тушит все светодиоды.
2, по switch(b) идет последовательная смена массивов эффектов. Каждый из этажей (PORTD = STAGE[a]
поочередно тушится чтобы заполнить данные на выходы триггеров из массива (PORTC =~ date3[a]
, при этом подача управляющего сигнала на необходимый триггер выбирается посредством PORTB = CLK_T.