mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programmierungsproblem - 5x5x5 Led Cube Mit Atmega 32


Autor: Nikan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
  }
}

Autor: Georg G. (df2au)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich finde solch eine Schreibweise als sehr umständlich.
#define led1  0b00000001 //PORTB

Ich würde die led1 noch um den Port-Namen ergänzen und die Bitnummer 
anhängen.
#define led1  B,0 //PORT.B0

Mit ein paar weiteren Macros, dann man die Initialisierung, Setzen und 
Löschen dieses Bits erledigen.

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
;

Autor: Nikan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
  }

}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.