Hallo zusammen :) // Ich bin neu beim programmieren ca. 2 Wochen... Zusammenfassung: Ich habe mich entschieden für mein Berufskollege in MSR einen 5x5x5 würfle zu bauen dazu habe ich einen Atmega32 benutz, ich hatte leider keinen Kristall mehr zur hand also muss ich ihn auf dem inneren 8Mhz kern takten lassen. Problem : Hardware hat keinen Problem! Es ist nur die Software Ich habe jetzt 4 Tage lang an dem Programm gearbeitet jedoch funktioniert sie nicht korrekt aber sie sollte Theoretisch korrekt Funktionieren... Ich lasse euch einfach entscheiden ob ich was falsch gemacht habe oder nicht Ich danke euch für die Hilfe im Voraus!!!!! CODE: // aTmega32 5x5x5 LED-Cube Designed By Nikan Esmailpour /* [5] *21*22*23*24*25* *04*05*29*24*19* [4] *16*17*18*19*20* *03*06*28*23*18* pattern-> [3] *11*12*13*14*15* pinOut-> *02*07*27*22*17* [2] *06*07*08*09*10* *01*31*26*21*16* [1] *01*02*03*04*05* *00*30*25*20*15* ^ Array > [1][2][3][4][5] layer0 = 8 layer1 = 9 layer2 = 10 layer3 = 11 layer4 = 12 button1 = 13 button2 = 14 */ #include "TimerOne.h" //Setting The Counter To Zero/////////////////////////////////////// unsigned long cntr = 0; //Defining layerPattern To The First Layer////////////////////////// unsigned short layerPattern = 0x1; //Setting All The Led's Of All The Layers To Zero/////////////////// volatile unsigned short ledLayer0 = 0b0000000000000000000000000; volatile short ledLayer1 = 0b0000000000000000000000000; volatile short ledLayer2 = 0b0000000000000000000000000; volatile short ledLayer3 = 0b0000000000000000000000000; volatile short ledLayer4 = 0b0000000000000000000000000; //Defining All The Led's To Their Corresponding Pins//////////////// #define allOff 0b0000000000000000000000000 #define led1 0b00000001 //PORTB #define led2 0b01000000 //PORTA #define led3 0b00000010 //PORTA #define led4 0b00010000 //PORTC #define led5 0b10000000 //PORTC #define led6 0b00000010 //PORTB #define led7 0b10000000 //PORTA #define led8 0b00000100 //PORTA #define led9 0b00100000 //PORTC #define led10 0b00000001 //PORTC #define led11 0b00000100 //PORTB #define led12 0b10000000 //PORTB #define led13 0b00001000 //PORTA #define led14 0b01000000 //PORTC #define led15 0b00000010 //PORTC #define led16 0b00001000 //PORTB #define led17 0b01000000 //PORTB #define led18 0b00010000 //PORTA #define led19 0b10000000 //PORTC #define led20 0b00000100 //PORTC #define led21 0b00010000 //PORTB #define led22 0b00100000 //PORTB #define led23 0b00100000 //PORTA #define led24 0b00000001 //PORTA #define led25 0b00001000 //PORTC #define layer0 0x1 //PORTD #define layer1 0x2 //PORTD #define layer2 0x4 //PORTD #define layer3 0x8 //PORTD #define layer4 0x10 //PORTD #define button1 0b00100000 //PORTD #define button2 0b01000000 //PORTD //Defining The Matrix/////////////////////////////////////////////// int led[5][5]{ { led1, led6, led11, led16, led21 }, { led2, led7, led12, led17, led22 }, { led3, led8, led13, led18, led23 }, { led4, led9, led14, led19, led24 }, { led5, led10, led15, led20, led25 }, }; void setup(){ //Initializing The Interrupt////////////////////////////////////////////// Timer1.initialize(50000000); Timer1.attachInterrupt(IsrLayerShift, 10); // (microsecond) //Disabling The JTAG////////////////////////////////////////////////////// MCUCSR|= (1<<JTD); MCUCSR|= (1<<JTD); //Initializing The Inputs And Outputs///////////////////////////////// DDRA = 0xFF; DDRB = 0xFF; DDRC = 0xFF; DDRD = 0x9F; } //Switching The Layers From 0 To 4////////////////////////////////// void IsrLayerShift(){ if(layerPattern == layer0){ PORTA = ((ledLayer0 >> 5) & led2) | ((ledLayer0 << 1) & led3) | ((ledLayer0 >> 1) & led7) | ((ledLayer0 << 5) & led8) | ((ledLayer0 << 9) & led13) | ((ledLayer0 << 13) & led18) | ((ledLayer0 << 17) & led23) | ((ledLayer0 << 23) & led24); PORTB = ((ledLayer0 << 0) & led1) | ((ledLayer0 << 4) & led6) | ((ledLayer0 << 8) & led11) | ((ledLayer0 << 4) & led12) | ((ledLayer0 << 12) & led16) | ((ledLayer0 << 10) & led17) | ((ledLayer0 << 16) & led21) | ((ledLayer0 << 16) & led22); PORTC = ((ledLayer0 >> 1) & led4) | ((ledLayer0 >> 3) & led5) | ((ledLayer0 << 3) & led9) | ((ledLayer0 << 9) & led10) | ((ledLayer0 << 7) & led14) | ((ledLayer0 << 11) & led19) | ((ledLayer0 << 17) & led20) | ((ledLayer0 << 21) & led25); PORTD = ((ledLayer0 << 13) & led15); layerPattern = layerPattern << 1; } else if(layerPattern == layer1){ PORTA = ((ledLayer1 >> 5) & led2) | ((ledLayer1 << 1) & led3) | ((ledLayer1 >> 1) & led7) | ((ledLayer1 << 5) & led8) | ((ledLayer1 << 9) & led13) | ((ledLayer1 << 13) & led18) | ((ledLayer1 << 17) & led23) | ((ledLayer1 << 23) & led24); PORTB = ((ledLayer1 << 0) & led1) | ((ledLayer1 << 4) & led6) | ((ledLayer1 << 8) & led11) | ((ledLayer1 << 4) & led12) | ((ledLayer1 << 12) & led16) | ((ledLayer1 << 10) & led17) | ((ledLayer1 << 16) & led21) | ((ledLayer1 << 16) & led22); PORTC = ((ledLayer1 >> 1) & led4) | ((ledLayer1 >> 3) & led5) | ((ledLayer1 << 3) & led9) | ((ledLayer1 << 9) & led10) | ((ledLayer1 << 7) & led14) | ((ledLayer1 << 11) & led19) | ((ledLayer1 << 17) & led20) | ((ledLayer1 << 21) & led25); PORTD = ((ledLayer1 << 13) & led15); layerPattern = layerPattern << 1; } else if(layerPattern == layer2){ PORTA = ((ledLayer2 >> 5) & led2) | ((ledLayer2 << 1) & led3) | ((ledLayer2 >> 1) & led7) | ((ledLayer2 << 5) & led8) | ((ledLayer2 << 9) & led13) | ((ledLayer2 << 13) & led18) | ((ledLayer2 << 17) & led23) | ((ledLayer2 << 23) & led24); PORTB = ((ledLayer2 << 0) & led1) | ((ledLayer2 << 4) & led6) | ((ledLayer2 << 8) & led11) | ((ledLayer2 << 4) & led12) | ((ledLayer2 << 12) & led16) | ((ledLayer2 << 10) & led17) | ((ledLayer2 << 16) & led21) | ((ledLayer2 << 16) & led22); PORTC = ((ledLayer2 >> 1) & led4) | ((ledLayer2 >> 3) & led5) | ((ledLayer2 << 3) & led9) | ((ledLayer2 << 9) & led10) | ((ledLayer2 << 7) & led14) | ((ledLayer2 << 11) & led19) | ((ledLayer2 << 17) & led20) | ((ledLayer2 << 21) & led25); PORTD = ((ledLayer2 << 13) & led15); layerPattern = layerPattern << 1; } else if(layerPattern == layer3){ PORTA = ((ledLayer3 >> 5) & led2) | ((ledLayer3 << 1) & led3) | ((ledLayer3 >> 1) & led7) | ((ledLayer3 << 5) & led8) | ((ledLayer3 << 9) & led13) | ((ledLayer3 << 13) & led18) | ((ledLayer3 << 17) & led23) | ((ledLayer3 << 23) & led24); PORTB = ((ledLayer3 << 0) & led1) | ((ledLayer3 << 4) & led6) | ((ledLayer3 << 8) & led11) | ((ledLayer3 << 4) & led12) | ((ledLayer3 << 12) & led16) | ((ledLayer1 << 10) & led17) | ((ledLayer1 << 16) & led21) | ((ledLayer1 << 16) & led22); PORTC = ((ledLayer3 >> 1) & led4) | ((ledLayer3 >> 3) & led5) | ((ledLayer3 << 3) & led9) | ((ledLayer3 << 9) & led10) | ((ledLayer3 << 7) & led14) | ((ledLayer3 << 11) & led19) | ((ledLayer3 << 17) & led20) | ((ledLayer3 << 21) & led25); PORTD = ((ledLayer3 << 13) & led15); layerPattern = layerPattern << 1; } else{ PORTA = ((ledLayer4 >> 5) & led2) | ((ledLayer4 << 1) & led3) | ((ledLayer4 >> 1) & led7) | ((ledLayer4 << 5) & led8) | ((ledLayer4 << 9) & led13) | ((ledLayer4 << 13) & led18) | ((ledLayer4 << 17) & led23) | ((ledLayer4 << 23) & led24); PORTB = ((ledLayer4 << 0) & led1) | ((ledLayer4 << 4) & led6) | ((ledLayer4 << 8) & led11) | ((ledLayer4 << 4) & led12) | ((ledLayer4 << 12) & led16) | ((ledLayer4 << 10) & led17) | ((ledLayer4 << 16) & led21) | ((ledLayer4 << 16) & led22); PORTC = ((ledLayer4 >> 1) & led4) | ((ledLayer4 >> 3) & led5) | ((ledLayer4 << 3) & led9) | ((ledLayer4 << 9) & led10) | ((ledLayer4 << 7) & led14) | ((ledLayer4 << 11) & led19) | ((ledLayer4 << 17) & led20) | ((ledLayer4 << 21) & led25); PORTD = ((ledLayer4 << 13) & led15); layerPattern = layer0; } PORTD = PORTD & 0b11100000; PORTD = PORTD | layerPattern; } //Running The Images Over And Over Again//////////////////////////// void loop(){ for(cntr=0;cntr<1000;cntr++){ // Example ledLayer0 = led[][]|led[][]|led[][]|led[][]|led[][]; ledLayer1 = allOff; ledLayer2 = led[][]|led[][]|led[][]|led[][]|led[][]|led[][]|led[][]; ledLayer3 = led[][]|led[][]|led[][]|led[][]; ledLayer4 = allOff; } }
Es wäre hilfreich, wenn du sagen würdest, was du erwartest und was passiert. Und noch ein Hinweis: Wenn du den Code als Datei anhängst, wird dein Beitrag übersichtlicher und man kann sich den Kram auch schnell herunter laden und testen.
Hallo, ich finde solch eine Schreibweise als sehr umständlich.
1 | #define led1 0b00000001 //PORTB
|
Ich würde die led1 noch um den Port-Namen ergänzen und die Bitnummer anhängen.
1 | #define led1 B,0 //PORT.B0
|
Mit ein paar weiteren Macros, dann man die Initialisierung, Setzen und Löschen dieses Bits erledigen.
Nikan schrieb: > volatile unsigned short ledLayer0 = 0b0000000000000000000000000; > volatile short ledLayer1 = 0b0000000000000000000000000; Meinst du echt, dass 25 bit in einen short passen, und warum einer unsigned und die anderen nicht ? Nikan schrieb: > Timer1.initialize(50000000); Wirklich so viele Mikrosekunden ? Wirklich so ein Durcheinander mit LEDs und Pins ? Meinst du nicht, dass man alle "Layer" abschalten sollte BEVOR man PORTA PORTB PORTC PORTD neu belegt und erst nachher wieder einschaltet ? Meinst du nicht, dass in der loop etwas gewartet werden sollte damit überhaupt Zeit ist das Pattern anzuzeigen. ;
Ich habe jetzt viel geändert, aber mein array funktioniert nicht kann mir einer erklären warum der Würfel selber funktioniert jetzt wenn ich in binar schreibe z.B. 0b0001100011100011011111100 CODE: // aTmega32 5x5x5 LED-Cube Designed By Nikan Esmailpour /* [5] *21*22*23*24*25* *04*05*29*24*19* [4] *16*17*18*19*20* *03*06*28*23*18* pattern-> [3] *11*12*13*14*15* pinOut-> *02*07*27*22*17* [2] *06*07*08*09*10* *01*31*26*21*16* [1] *01*02*03*04*05* *00*30*25*20*15* ^ Array > [1][2][3][4][5] layer0 = 8 layer1 = 9 layer2 = 10 layer3 = 11 layer4 = 12 button1 = 13 button2 = 14 */ #include "TimerOne.h" //Defining allOff To Turn All Off//////////////////////////////////////////////////////////// #define allOff 0b0000000000000000000000000 //Defining The Led's/////////////////////////////////////////////////////////////////// ////// #define led1 0b00000001 //PORTB #define led2 0b01000000 //PORTA #define led3 0b00000010 //PORTA #define led4 0b00010000 //PORTC #define led5 0b10000000 //PORTD #define led6 0b00000010 //PORTB #define led7 0b10000000 //PORTA #define led8 0b00000100 //PORTA #define led9 0b00100000 //PORTC #define led10 0b00000001 //PORTC #define led11 0b00000100 //PORTB #define led12 0b10000000 //PORTB #define led13 0b00001000 //PORTA #define led14 0b01000000 //PORTC #define led15 0b00000010 //PORTC #define led16 0b00001000 //PORTB #define led17 0b01000000 //PORTB #define led18 0b00010000 //PORTA #define led19 0b10000000 //PORTC #define led20 0b00000100 //PORTC #define led21 0b00010000 //PORTB #define led22 0b00100000 //PORTB #define led23 0b00100000 //PORTA #define led24 0b00000001 //PORTA #define led25 0b00001000 //PORTC //Defining The Layer's///////////////////////////////////////////////////////////////// ///// #define layer0 0x1 //PORTD #define layer1 0x2 //PORTD #define layer2 0x4 //PORTD #define layer3 0x8 //PORTD #define layer4 0x10 //PORTD //Defining The Buttons///////////////////////////////////////////////////////////////// ///// #define button1 0b00100000 //PORTD #define button2 0b01000000 //PORTD //Setting Counter To 0////////////////////////////////////////////////////////////////////// int cntr = 0; //Defining The Array/////////////////////////////////////////////////////////////////// ///// int mux[5][5]{ { led1, led6, led11, led16, led21 }, { led2, led7, led12, led17, led22 }, { led3, led8, led13, led18, led23 }, { led4, led9, led14, led19, led24 }, { led5, led10, led15, led20, led25 }, }; //Setting All Layer's To 0////////////////////////////////////////////////////////////////// volatile unsigned long ledOnLayer0 = 0b0000000000000000000000000; volatile unsigned long ledOnLayer1 = 0b0000000000000000000000000; volatile unsigned long ledOnLayer2 = 0b0000000000000000000000000; volatile unsigned long ledOnLayer3 = 0b0000000000000000000000000; volatile unsigned long ledOnLayer4 = 0b0000000000000000000000000; volatile unsigned int actualLayer = 0x00; void setup() { //Disabling The JTAG//////////////////////////////////////////////////////////////////// //// MCUCSR = (1<<JTD); //Disable JTAG MCUCSR = (1<<JTD); //Defining The In And Outputs/////////////////////////////////////////////////////////////// DDRA = 0xFF; DDRB = 0xFF; DDRC = 0xFF; DDRD = 0x9F; //Setting The Layer To Start With/////////////////////////////////////////////////////////// actualLayer = layer0; //Initializing Timer for Interrupt////////////////////////////////////////////////////////// Timer1.initialize(5000000); Timer1.attachInterrupt(timerInterrupt,400); // (microsecond) } //Setting all the Leds To Their Corresponding Position////////////////////////////////////// void switchLayer(unsigned long ledOn){ PORTD = PORTD & 0b11100000; PORTA = ((ledOn << 5) & led2) | ((ledOn >> 1) & led3) | ((ledOn << 1) & led7) | ((ledOn >> 5) & led8) | ((ledOn >> 9) & led13) | ((ledOn >> 13) & led18) | ((ledOn >> 17) & led23) | ((ledOn >> 23) & led24); PORTB = ((ledOn << 0) & led1) | ((ledOn >> 5) & led6) | ((ledOn >> 8) & led11) | ((ledOn >> 4) & led12) | ((ledOn >> 12) & led16) | ((ledOn >> 10) & led17) | ((ledOn >> 16) & led21) | ((ledOn >> 16) & led22); PORTC = ((ledOn << 1) & led4) | ((ledOn >> 13) & led15) | ((ledOn >> 3) & led9) | ((ledOn >> 9) & led10) | ((ledOn >> 7) & led14) | ((ledOn >> 11) & led19) | ((ledOn >> 17) & led20) | ((ledOn >> 21) & led25); PORTD = ((ledOn >> 2) & led5); PORTD = PORTD | actualLayer; } //ISR Switching through layers from 0 to 4////////////////////////////////////////////////// void timerInterrupt(){ switch(actualLayer){ case layer0: switchLayer(ledOnLayer0); actualLayer = layer1; break; case layer1: switchLayer(ledOnLayer1); actualLayer = layer2; break; case layer2: switchLayer(ledOnLayer2); actualLayer = layer3; break; case layer3: switchLayer(ledOnLayer3); actualLayer = layer4; break; case layer4: switchLayer(ledOnLayer4); actualLayer = layer0; break; default: actualLayer = layer0; break; } } //Creating the Images////////////////////////////////////////////////////////////////// ///// void loop() { for(cntr=0;cntr<10000;cntr++){ ledOnLayer0 = allOff; ledOnLayer1 = allOff; ledOnLayer2 = 0b0000000000000000010000000; ledOnLayer3 = allOff; ledOnLayer4 = allOff; } for(cntr=0;cntr<10000;cntr++){ ledOnLayer0 = allOff; ledOnLayer1 = 0b1111111111111111111111111; ledOnLayer2 = 0b1111111111111111111111111; ledOnLayer3 = 0b1111111111111111111111111; ledOnLayer4 = allOff; } }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.