Forum: Mikrocontroller und Digitale Elektronik 5x5x5 LED Cube interrupt not working


von Nikan E. (nikan)


Lesenswert?

Hello folks,
I am building a LED Cube so far I've finished my 3x3x3 led cube and 
programmed it I had just 1 problem with the LED Cube... the 2kb Memory 
was just not enough for me it worked with 1 or 2 patterns but than it 
would be full after programming to about 98%. Anyways, it worked and now 
I wanted to build a 5x5x5 led cube I finished the schematic, the layout, 
etched and assembled it, but now I have just one problem with my 
program. I used the program for my 3x3x3 LED cube and just changed a few 
things. I get an error from terminal which tells me some weird things I 
think it has a problem with the interrupt but it is the same as the last 
one I used. I hope you guys can help me.

Thanks for the help :D


HERE IS MY PROGRAM



//
//  main.c
//  AT-Mega 16/32
//  LED Cube
//  Created by Nikan on 2015-10-01.
//
//##############################
//#####[00][01][02][03][04]#####
//#####[05][06][07][08][09]##### => LED_Layer_x = 0b[24]-[0]
//#####[10][11][12][13][14]#####
//#####[15][16][17][18][19]#####
//#####[20][21][22][23][24]#####
//##############################

#include <interrupt.h>
#include <io.h>

#define Layer0 0b00000001
#define Layer1 0b00000010
#define Layer2 0b00000100
#define Layer3 0b00001000
#define Layer4 0b00010000


unsigned long layer_pattern = 0b00000001;   // Definiert das Pattern 
muss mit Layer0 anfangen
unsigned short cntr = 0;                    // Stellt counter auf 0
volatile long LED_Layer_0=0x00;             // Stellt alle bits in 
Layer0 auf 0
volatile long LED_Layer_1=0x00;             // Stellt alle bits in 
Layer1 auf 0
volatile long LED_Layer_2=0x00;             // Stellt alle bits in 
Layer2 auf 0
volatile long LED_Layer_3=0x00;             // Stellt alle bits in 
Layer3 auf 0
volatile long LED_Layer_4=0x00;             // Stellt alle bits in 
Layer4 auf 0

//Interrupt

ISR(TIMER0_COMPA_vect){

    if(layer_pattern == Layer0){
        //Layer0
        PORTA = ((LED_Layer_0 << 6) & 0b00000001) | ((LED_Layer_0 << 4) 
& 0b00000010) | ((LED_Layer_0 << 12) & 0b00000100) | ((LED_Layer_0 << 
10) & 0b00001000) | ((LED_Layer_0 << 8) & 0b00010000) | ((LED_Layer_0 << 
6) & 0b00100000) | ((LED_Layer_0 << 4) & 0b01000000) | ((LED_Layer_0 << 
12) & 0b10000000);

        PORTB = ((LED_Layer_0 << 0) & 0b00000001) | ((LED_Layer_0 << 0) 
& 0b00000010) | ((LED_Layer_0 << 0) & 0b00000100) | ((LED_Layer_0 << 0) 
& 0b00001000) | ((LED_Layer_0 << 0) & 0b00010000) | ((LED_Layer_0 << 4) 
& 0b00100000) | ((LED_Layer_0 << 2) & 0b01000000) | ((LED_Layer_0 << 0) 
& 0b10000000);

        PORTC = ((LED_Layer_0 << 11) & 0b00000001) | ((LED_Layer_0 << 
11) & 0b00000010) | ((LED_Layer_0 << 11) & 0b00000100) | ((LED_Layer_0 
<< 11) & 0b00001000) | ((LED_Layer_0 << 21) & 0b00010000) | 
((LED_Layer_0 << 21) & 0b00100000) | ((LED_Layer_0 << 21) & 0b01000000) 
| ((LED_Layer_0 << 21) & 0b10000000);

        PORTD = ((LED_Layer_0 << 13) & 0b10000000);
        //
        layer_pattern = layer_pattern <<1;
    }




    else if(layer_pattern == Layer1){
        //Layer1
        PORTA = ((LED_Layer_0 << 6) & 0b00000001) | ((LED_Layer_0 << 4) 
& 0b00000010) | ((LED_Layer_0 << 12) & 0b00000100) | ((LED_Layer_0 << 
10) & 0b00001000) | ((LED_Layer_0 << 8) & 0b00010000) | ((LED_Layer_0 << 
6) & 0b00100000) | ((LED_Layer_0 << 4) & 0b01000000) | ((LED_Layer_0 << 
12) & 0b10000000);

        PORTB = ((LED_Layer_0 << 0) & 0b00000001) | ((LED_Layer_0 << 0) 
& 0b00000010) | ((LED_Layer_0 << 0) & 0b00000100) | ((LED_Layer_0 << 0) 
& 0b00001000) | ((LED_Layer_0 << 0) & 0b00010000) | ((LED_Layer_0 << 4) 
& 0b00100000) | ((LED_Layer_0 << 2) & 0b01000000) | ((LED_Layer_0 << 0) 
& 0b10000000);

        PORTC = ((LED_Layer_0 << 11) & 0b00000001) | ((LED_Layer_0 << 
11) & 0b00000010) | ((LED_Layer_0 << 11) & 0b00000100) | ((LED_Layer_0 
<< 11) & 0b00001000) | ((LED_Layer_0 << 21) & 0b00010000) | 
((LED_Layer_0 << 21) & 0b00100000) | ((LED_Layer_0 << 21) & 0b01000000) 
| ((LED_Layer_0 << 21) & 0b10000000);

        PORTD = ((LED_Layer_0 << 13) & 0b10000000);
        //
        layer_pattern = layer_pattern << 1;
    }





    else if(layer_pattern == Layer2){
        //Layer2
        PORTA = ((LED_Layer_0 << 6) & 0b00000001) | ((LED_Layer_0 << 4) 
& 0b00000010) | ((LED_Layer_0 << 12) & 0b00000100) | ((LED_Layer_0 << 
10) & 0b00001000) | ((LED_Layer_0 << 8) & 0b00010000) | ((LED_Layer_0 << 
6) & 0b00100000) | ((LED_Layer_0 << 4) & 0b01000000) | ((LED_Layer_0 << 
12) & 0b10000000);

        PORTB = ((LED_Layer_0 << 0) & 0b00000001) | ((LED_Layer_0 << 0) 
& 0b00000010) | ((LED_Layer_0 << 0) & 0b00000100) | ((LED_Layer_0 << 0) 
& 0b00001000) | ((LED_Layer_0 << 0) & 0b00010000) | ((LED_Layer_0 << 4) 
& 0b00100000) | ((LED_Layer_0 << 2) & 0b01000000) | ((LED_Layer_0 << 0) 
& 0b10000000);

        PORTC = ((LED_Layer_0 << 11) & 0b00000001) | ((LED_Layer_0 << 
11) & 0b00000010) | ((LED_Layer_0 << 11) & 0b00000100) | ((LED_Layer_0 
<< 11) & 0b00001000) | ((LED_Layer_0 << 21) & 0b00010000) | 
((LED_Layer_0 << 21) & 0b00100000) | ((LED_Layer_0 << 21) & 0b01000000) 
| ((LED_Layer_0 << 21) & 0b10000000);

        PORTD = ((LED_Layer_0 << 13) & 0b10000000);
        //
        layer_pattern = layer_pattern << 1;
    }





    else if(layer_pattern == Layer3){
        //Layer3
        PORTA = ((LED_Layer_0 << 6) & 0b00000001) | ((LED_Layer_0 << 4) 
& 0b00000010) | ((LED_Layer_0 << 12) & 0b00000100) | ((LED_Layer_0 << 
10) & 0b00001000) | ((LED_Layer_0 << 8) & 0b00010000) | ((LED_Layer_0 << 
6) & 0b00100000) | ((LED_Layer_0 << 4) & 0b01000000) | ((LED_Layer_0 << 
12) & 0b10000000);

        PORTB = ((LED_Layer_0 << 0) & 0b00000001) | ((LED_Layer_0 << 0) 
& 0b00000010) | ((LED_Layer_0 << 0) & 0b00000100) | ((LED_Layer_0 << 0) 
& 0b00001000) | ((LED_Layer_0 << 0) & 0b00010000) | ((LED_Layer_0 << 4) 
& 0b00100000) | ((LED_Layer_0 << 2) & 0b01000000) | ((LED_Layer_0 << 0) 
& 0b10000000);

        PORTC = ((LED_Layer_0 << 11) & 0b00000001) | ((LED_Layer_0 << 
11) & 0b00000010) | ((LED_Layer_0 << 11) & 0b00000100) | ((LED_Layer_0 
<< 11) & 0b00001000) | ((LED_Layer_0 << 21) & 0b00010000) | 
((LED_Layer_0 << 21) & 0b00100000) | ((LED_Layer_0 << 21) & 0b01000000) 
| ((LED_Layer_0 << 21) & 0b10000000);

        PORTD = ((LED_Layer_0 << 13) & 0b10000000);
        //
        layer_pattern = layer_pattern << 1;
    }





    else{
        //Layer4
        PORTA = ((LED_Layer_0 << 6) & 0b00000001) | ((LED_Layer_0 << 4) 
& 0b00000010) | ((LED_Layer_0 << 12) & 0b00000100) | ((LED_Layer_0 << 
10) & 0b00001000) | ((LED_Layer_0 << 8) & 0b00010000) | ((LED_Layer_0 << 
6) & 0b00100000) | ((LED_Layer_0 << 4) & 0b01000000) | ((LED_Layer_0 << 
12) & 0b10000000);

        PORTB = ((LED_Layer_0 << 0) & 0b00000001) | ((LED_Layer_0 << 0) 
& 0b00000010) | ((LED_Layer_0 << 0) & 0b00000100) | ((LED_Layer_0 << 0) 
& 0b00001000) | ((LED_Layer_0 << 0) & 0b00010000) | ((LED_Layer_0 << 4) 
& 0b00100000) | ((LED_Layer_0 << 2) & 0b01000000) | ((LED_Layer_0 << 0) 
& 0b10000000);

        PORTC = ((LED_Layer_0 << 11) & 0b00000001) | ((LED_Layer_0 << 
11) & 0b00000010) | ((LED_Layer_0 << 11) & 0b00000100) | ((LED_Layer_0 
<< 11) & 0b00001000) | ((LED_Layer_0 << 21) & 0b00010000) | 
((LED_Layer_0 << 21) & 0b00100000) | ((LED_Layer_0 << 21) & 0b01000000) 
| ((LED_Layer_0 << 21) & 0b10000000);

        PORTD = ((LED_Layer_0 << 13) & 0b10000000);
        //
        layer_pattern = Layer0;
    }



    PORTD = PORTD & 0b01111100;         // Alle bits auf 1 stellen außer 
die Layer bits, die müssen auf 1 sein.
    PORTD = PORTD | layer_pattern;      // Bestimmt das es nur auf den 
layern wechseln soll und nirgendwo anders

}


    //Initialising

    void init (void){

        DDRA =  0b11111111;  //  (Output +) All Pins

        DDRB =  0b11111111;  //  (Output +) All Pins

        DDRC =  0b11111111;  //  (Output +) All Pins

        DDRD =  0b11111100;  //  (Output +) Pins 2-7 / Pins 0-1 Are Set 
As Input

    // Configure Timer 0
    TCCR0A = (1<<WGM01); // CTC Modus
    TCCR0B |= (1<<CS02) | (1 << CS00);
    OCR0A = 20;

    // Allow Compare Interrupt
    TIMSK |= (1<<OCIE0A);

    // Activate Global Interrupts
    sei();
}



//  Main

int main(void){

    init();
    while(1){



        for(cntr=0;cntr<60000;cntr++){
            LED_Layer_0 = 0b0000000000000000000000000;
            LED_Layer_1 = 0b0000000000000000000000000;
            LED_Layer_2 = 0b0000000000000000000000000;
            LED_Layer_3 = 0b0000000000000000000000000;
            LED_Layer_4 = 0b0000000000000000000000000;
        }




    }
}




HERE IS TERMINALS STATEMENT




-------- begin --------
avr-gcc (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is 
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.


Compiling C: main.c
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -MMD -MP -MF 
.dep/main.o.d main.c -o main.o
In file included from main.c:9:0:
main.c: In function 'TIMER0_COMPA_vect':
main.c:29:5: warning: 'TIMER0_COMPA_vect' appears to be a misspelled 
signal handler [enabled by default]
 ISR(TIMER0_COMPA_vect){
     ^
./interrupt.h:126:10: note: in definition of macro 'ISR'
     void vector (void)
          ^
main.c: In function 'init':
main.c:132:5: error: 'TCCR0A' undeclared (first use in this function)
     TCCR0A = (1<<WGM01); // CTC Modus
     ^
main.c:132:5: note: each undeclared identifier is reported only once for 
each function it appears in
main.c:133:5: error: 'TCCR0B' undeclared (first use in this function)
     TCCR0B |= (1<<CS02) | (1 << CS00);
     ^
main.c:134:5: error: 'OCR0A' undeclared (first use in this function)
     OCR0A = 20;
     ^
main.c:137:18: error: 'OCIE0A' undeclared (first use in this function)
     TIMSK |= (1<<OCIE0A);
                  ^
make: *** [main.o] Error 1

von MaWin (Gast)


Lesenswert?

Dein io.h kommt nicht aus avr/

Das Programm ist ungefähr 20 mal so lang  wie nötig.

Du solltest vielleicht mal kernen, was ein Array ist und eie man es 
indiziert.

Hoffen wir, dass die 6000er Schleife bloss ein Platzhalter ist.

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
Noch kein Account? Hier anmelden.