MezData-Logo

Die BummBox

Funktion

No PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 Ton
0
1 LED leuchtet LED leuchtet
2 LED leuchtet LED leuchtet
3 LED leuchtet LED leuchtet
4 LED leuchtet LED leuchtet
Bumm!
5 LED leuchtet LED leuchtet
6 LED leuchtet LED leuchtet LED leuchtet LED leuchtet
7 LED leuchtet LED leuchtet LED leuchtet LED leuchtet LED leuchtet LED leuchtet
8 LED leuchtet LED leuchtet LED leuchtet LED leuchtet LED leuchtet LED leuchtet LED leuchtet LED leuchtet
9 LED leuchtet LED leuchtet LED leuchtet LED leuchtet LED leuchtet LED leuchtet
10 LED leuchtet LED leuchtet LED leuchtet LED leuchtet
11 LED leuchtet LED leuchtet

Nach dem Drücken der Taste PD0 wird ein langsam sinkener Ton abgespielt. Bumm und die Explosion mit Ton visualisiert.

Auf YouTube ansehen

Quelltext ohne Interrupt

Quellcode [Bummbox.c]
/* 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;
    }
  }
}