/* BummBox V1.0 (c) Oliver Mezger 11.10.11
   Version ohne Interrupt fuer STK200
*/
#include <avr/io.h>
#include <util/delay.h>
const unsigned char muster[] = {0,0b10000001,0b01000010,0b00100100,0b00011000, // LED-Muster
  0b00111100,0b01111110,0b11111111,0b11100111,0b11000011,0b10000001};
const unsigned int ton[] = {F_CPU/264,F_CPU/275,F_CPU/297,F_CPU/317}; // Toene

int main(){
  unsigned int i=0,t;
  DDRB = 0xFF;
  PORTB = 0xFF;
  TCCR1A = 0b00100011; // Ausgang OC1B bei 0 setzen und bei OCR1B loeschen
  TCCR1B = 0b00011001; // Waveform Generation Mode: Fast PWM mit OCR1A als Top, Timer mit CPU-CLK
  while (1){
    if(!(PIND&1)){  // wenn Taste PD0
      t=3;            // Init Tonnummer
      for (i=1;i<5;i++){     // Zusammenlaufen bis Bumm
        PORTB = ~muster[i];  // Muster invertiert ausgeben
        OCR1A = ton[t];      // Ton ausgeben
        OCR1B = ton[t--]>>1; // Impulslaenge = Periodendauer/2
        TCCR1A |= 1<<COM1B1; // Ton an
        _delay_ms(100); 
        TCCR1A &= ~(1<<COM1B1); // Ton aus
        _delay_ms(900);
      }
      TCCR1A |= 1<<COM1B1;
      for (i=4;i<=10;i++){   // Bumm und Auseinanderbersten
        PORTB = ~muster[i];
        for (t=0;t<4000;t++){ // BummSound
          OCR1A = (OCR1A ^ 0xFFFF) +666+t; 
          OCR1B = OCR1A >>1;
        }
      }
      TCCR1A &= ~(1<<COM1B1); // Ton aus
      PORTB = 0xFF;
    }
  }
}
