Nach dem Drücken der Taste PD0 wird ein langsam sinkener Ton abgespielt. Bumm und die Explosion mit Ton visualisiert.
Auf YouTube ansehen
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; } } }
/* 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; } } }