/****** Includes ******/ #include #include #include #define F_CPU 4000000L /* Timer */ volatile char milli = 0; volatile char sec = 0; volatile char step = 0; volatile unsigned char cube[3][3][3]; ISR (TIMER1_COMPA_vect) { if(milli == 100) { sec++; // sec = sec + 1; milli=0; } else { milli++; } if(sec==5) { sec=0; step=myRand(23); //step=22; } } /******************* ANIMATIONS ************/ /* pre definitions */ void turn_on( int xpos, int ypos ) { switch( xpos ) { case 0: switch( ypos ) { case 0: PORTC |= (1<= RAND_MAX - (RAND_MAX % UpperBound) ); return x % UpperBound; } void delay_ms(uint16_t x) { uint8_t y, z; for ( ; x > 0 ; x--){ for ( y = 0 ; y < 90 ; y++){ for ( z = 0 ; z < 6 ; z++){ asm volatile ("nop"); } } } } /* animations */ /* random rain */ void rain() { clear(); turn_on( myRand(3) , myRand(3) ); delay_ms(1000); power(2); delay_ms(500); power(1); delay_ms(450); power(0); delay_ms(400); } /* up-down */ void updown() { clear(); for(int x=0;x<3;x++) { for(int y=0;y<3;y++) turn_on( x , y ); } power(0); delay_ms(500); power(1); delay_ms(500); power(2); delay_ms(500); if(step==7) { power(1); delay_ms(500); } } /* lauf */ void lauf() { for(int z=0; z<3; z++) { clear(); power(2-z); turn_on( 0, 0); delay_ms(500); turn_on( 0, 1); delay_ms(500); turn_on( 0, 2); delay_ms(500); turn_on( 1, 2); delay_ms(500); turn_on( 2, 2); delay_ms(500); turn_on( 2, 1); delay_ms(500); turn_on( 2, 0); delay_ms(500); turn_on( 1, 0); delay_ms(500); } clear(); turn_on( 1, 1); for(int i=0; i<3; i++) { power(i); delay_ms(250); } } /* dreh */ void dreh() { clear(); turn_on( 1, 0); turn_on( 1, 1); turn_on( 1, 2); while(sec<1) { power(0); delay_ms(20); power(1); delay_ms(20); power(2); delay_ms(20); } if(step==3) clear(); turn_on( 2, 0); turn_on( 1, 1); turn_on( 0, 2); while(sec<2) { power(0); delay_ms(20); power(1); delay_ms(20); power(2); delay_ms(20); } if(step==3) clear(); turn_on( 0, 1); turn_on( 1, 1); turn_on( 2, 1); while(sec<3) { power(0); delay_ms(20); power(1); delay_ms(20); power(2); delay_ms(20); } if(step==3) clear(); turn_on( 0, 0); turn_on( 1, 1); turn_on( 2, 2); while(sec<4) { power(0); delay_ms(20); power(1); delay_ms(20); power(2); delay_ms(20); } if(step==3) { clear(); turn_on( 1, 0); turn_on( 1, 1); turn_on( 1, 2); } while(sec<5 && sec>3) { power(0); delay_ms(20); power(1); delay_ms(20); power(2); delay_ms(20); } } /* leftright */ void leftright() { clear(); for(int i=0; i<3; i++) turn_on( 0 , i ); for(int i=0; i<9; i++) { power(0); delay_ms(21); power(1); delay_ms(21); power(2); delay_ms(21); } clear(); for(int i=0; i<3; i++) turn_on( 1 , i ); for(int i=0; i<9; i++) { power(0); delay_ms(21); power(1); delay_ms(21); power(2); delay_ms(21); } clear(); for(int i=0; i<3; i++) turn_on( 2 , i ); for(int i=0; i<9; i++) { power(0); delay_ms(21); power(1); delay_ms(21); power(2); delay_ms(21); } if (step==6) { clear(); for(int i=0; i<3; i++) turn_on( 1 , i ); for(int i=0; i<9; i++) { power(0); delay_ms(21); power(1); delay_ms(21); power(2); delay_ms(21); } } } /* frontrear */ void frontrear() { clear(); for(int i=0; i<3; i++) turn_on( i , 0 ); for(int i=0; i<9; i++) { power(0); delay_ms(21); power(1); delay_ms(21); power(2); delay_ms(21); } clear(); for(int i=0; i<3; i++) turn_on( i , 1 ); for(int i=0; i<9; i++) { power(0); delay_ms(21); power(1); delay_ms(21); power(2); delay_ms(21); } clear(); for(int i=0; i<3; i++) turn_on( i , 2 ); for(int i=0; i<9; i++) { power(0); delay_ms(21); power(1); delay_ms(21); power(2); delay_ms(21); } if (step==8) { clear(); for(int i=0; i<3; i++) turn_on( i , 1 ); for(int i=0; i<9; i++) { power(0); delay_ms(21); power(1); delay_ms(21); power(2); delay_ms(21); } } } /* drehfast */ void drehfast(int speed) { clear(); turn_on( 1, 0); turn_on( 1, 1); turn_on( 1, 2); for(int i=0; i 4*10^6 / 4*10^4 = 10^2; => Interrupt wird jede Millisekunde aufgerufen (100Hz) OCR1A = 39999; // Interupts allg. aktivieren sei(); /****** Endlos-Scheife ******/ while(1) { switch(step) { case 0: rain(); break; case 1: updown(); break; case 2: lauf(); break; case 3: sec=0; milli=0; dreh(); break; case 4: sec=0; milli=0; dreh(); // dreh adding break; case 5: leftright(); break; case 6: leftright(); // knight rider break; case 7: updown(); // knight rider break; case 8: frontrear(); // knight rider break; case 9: frontrear(); break; case 10: drehfast(9); break; case 11: drehfast(9); // add remove break; case 12: drehfast(5); // add remove faster break; case 13: randbl(); break; case 14: randrm(); break; case 15: randbl(); // double rand blink break; case 16: buildcube(); break; case 17: drehagain(); break; case 18: lauf2(); break; case 19: buildcube2(); break; case 20: rain2(); break; case 21: randfill(); break; case 22: invrandbl(); break; } } return 0; }