Projekte
workwind
NIBO2 - Sound_Entchen
main.c
Projekte
Forum
Doku
Öffentliche Projekte
Startseite
Beispielprogramme
Projekte von anderen
Welcome
Username
Passwort
Eingeloggt bleiben
Zugangsdaten vergessen?
Registrieren
Projektverwaltung
⇨ Please choose! ⇦
——————————————————
✎ Create new project...
★ Browse existing projects...
——————————————————
⚬ MotorTest#1
⚬ C Tutorial 8#1
⚬ NIBO2 C Project#1
⚙ C Tutorial 15#1
⚬ 2010_11_18_el_test001#1
NIBO2 - S...d_Entchen
main.c
Project details
Compiler settings
Nachrichten
Sie sind nicht eingeloggt.
Neuigkeiten
★
NiboRoboLib 3.6
2017-01-17: Neue Version 3.6
★
NiboRoboLib 3.4.1
2016-04-16: Neue Version 3.4.1
★
Coding Tutorial
2015-11-22: Jetzt auch für den NIBO burger!
Site-Statistic
7416 private projects
378 public projects
16172649 lines compiled
58122 builds
NIBO
@
nibo2___sound_entchen/main.c [read only]
/* NIBO2 C project */ #include <avr/io.h> #include <util/delay.h> /* Notentabelle */ enum { C0, C0_, D0, D0_, E0, F0, F0_, G0, G0_, A0, A0_, H0, C1, C1_, D1, D1_, E1, F1, F1_, G1, G1_, A1, A1_, H1, C2, C2_, D2, D2_, E2, F2, F2_, G2, G2_, A2, A2_, H2, C3, C3_, D3, D3_, E3, F3, F3_, G3, G3_, A3, A3_, H3, C4, C4_, D4, D4_, E4, F4, F4_, G4, G4_, A4, A4_, H4, C5, C5_, D5, D5_, E5, F5, F5_, G5, G5_, A5, A5_, H5, C6, C6_, D6, D6_, E6, F6, F6_, G6, G6_, A6, A6_, H6, C7, C7_, D7, D7_, E7, F7, F7_, G7, G7_, A7, A7_, H7, P__= 255 }; /* Alle meine Entchen - Noten und Spieldauer "C2, 20" beudeutet die Note C2 für 200 ms (20 * 10 ms) spielen "P__, 40" beudeutet 400 ms Pause Viertelnote: 200 ms / Halbe Note: 400 ms */ uint8_t music[] = { C2, 20, D2, 20, E2, 20, F2, 20, G2, 40, G2, 40, A2, 20, A2, 20, A2, 20, A2, 20, G2, 40, P__, 20, A2, 20, A2, 20, A2, 20, A2, 20, G2, 40, P__, 20, F2, 20, F2, 20, F2, 20, F2, 20, E2, 40, E2, 40, D2, 20, D2, 20, D2, 20, D2, 20, C2, 40, P__, 40, }; /* Timer Werte für die verschiedenen Noten Die Werte gehen über 2 Oktaven, der weitere Tonumfang wird über die Konfiguration des Timers erreicht. Die Werte werden als TOP Wert in den Timer geladen (er zählt also bis zum erreichen des Wertes, invertiert den Port-Pin und fängt dann wieder von vorne an zu zählen. Infos: http://de.wikipedia.org/wiki/Oktave http://www.sengpielaudio.com/Rechner-notennamen.htm (MIDI Noten und die dazugehörenden Frequenzen) Die Frequenz für ein C berechnet sich aus: f = 8.176 Hz * (2^Oktave) Ein Dis berechnet sich aus: f = 9.723 * (2^Oktave) Der Timer kann von 1 bis 256 zählen. Die Timer-Werte müssen also in dem Intervall landen: 1953/8.176 = 238 (niedrigster Ton C0) 1953/(2*15.434) = 63 (höchster Ton H1) Um die nächste Oktave zu ereichen lässt man den Timer einfach doppelt so schnell laufen. Da der Timer jedoch häufig nur Vierer-Schritte anbietet, muss man zwei Oktaven überspringen und den Timer dann 4 mal so schnell laufen lassen. */ uint8_t pitch_table [] = { /* 1. Oktave */ 1953/8.176, 1953/8.662, 1953/9.177, 1953/9.723, 1953/10.301, 1953/10.913, 1953/11.562, 1953/12.250, 1953/12.987, 1953/13.750, 1953/14.568, 1953/15.434, /* 2. Oktave */ 1953/(2*8.176), 1953/(2*8.662), 1953/(2*9.177), 1953/(2*9.723), 1953/(2*10.301), 1953/(2*10.913), 1953/(2*11.562), 1953/(2*12.250), 1953/(2*12.987), 1953/(2*13.750), 1953/(2*14.568), 1953/(2*15.434) }; /* Eine einzelne Note spielen (duration in 10 ms) */ void play_tone(uint8_t pitch, uint16_t duration) { if (pitch==P__) { /* Pause ohne Ton... */ while (duration--) _delay_ms(10); return; } if (duration) { duration--; } /* Prescaler für Timer 0 nach Oktave wählen (2^Oktave...) */ if (pitch>=C6) { /* Oktaven 6 und 7 */ /* Timergeschwindigkeit 1 (PS=8) */ TCCR0 = 0x1a; pitch -= 12*6; /* 6 Oktaven abziehen, dafür Timer 64 (2^6) mal so schnell */ } else if (pitch>=C5) { /* Oktave 5 */ /* Timergeschwindigkeit 1 (PS=32) */ TCCR0 = 0x1b; pitch -= 12*5; /* 5 Oktaven abziehen, dafür Timer 32 (2^5) mal so schnell */ } else if (pitch>=C4) { /* Oktave 4 */ /* Timergeschwindigkeit 1 (PS=64) */ TCCR0 = 0x1c; pitch -= 12*4; /* 4 Oktaven abziehen, dafür Timer 16 (2^4) mal so schnell */ } else if (pitch>=C3) { /* Oktave 3 */ /* Timergeschwindigkeit 1 (PS=128) */ TCCR0 = 0x1d; pitch -= 12*3; /* 3 Oktaven abziehen, dafür Timer 8 (2^3) mal so schnell */ } else if (pitch>=C2) { /* Oktave 2 */ /* Timergeschwindigkeit 1 (PS=256) */ TCCR0 = 0x1e; pitch -= 12*2; /* 2 Oktaven abziehen, dafür Timer 4 (2^2) mal so schnell */ } else { /* Oktave 0 und 1 */ /* Timergeschwindigkeit 1 (PS=1024) */ TCCR0 = 0x1f; } /* Timer Wert aus der Note berechnen */ OCR0 = pitch_table[pitch]; while (duration--) { _delay_ms(10); } /* 10ms Pause nach jeder gespielten Note */ TCCR0 = 0x00; _delay_ms(10); } /* das ganze Stück spielen */ void play_music (char * music, uint16_t size) { while (size--) { uint16_t pitch = *music++; uint16_t duration = *music++; play_tone(pitch, duration); } } int main() { /* AUDIO Pin auf Ausgang schalten */ DDRB |= _BV(4); while(1) { play_music(music, sizeof(music)/2); /* Tonleiter con C1 bis H7 */ uint8_t i=C1; while (i<=H7) { play_tone(i++, 20); } _delay_ms(500); } }
Compiler results:
Werbung
Online
brandi20b03191419
lashawndawatson81733
loriniles410565581