Angenommen ich würde mit dem AVR eine winzige Liedstelle aufnehmen und dann per PWM wiedergeben (alles 8Bit und andere Hürden aussen vor), klänge das Wiedergegebene noch nach dem eingespeistem Lied oder nach "rumgepipse"?
MfG Killer
@killer
zurueck zur ersten Frage: natuerlich
ein sehr einfacher Weg ist die Toene selbst als Noten abzulegen und den Takt dazu. Das ist sehr sparsam. Du must dann aber jeden Ton erzeugen, mit genuegend Abtaststellen, das verringert das Rauschen. Wichtig bei all diesen Vorgaengen ist die Mathematik. Du brauchst mindestens die doppelte Wiedergabefrequenz deiner hoechsten wiederzugebenden Frequenz. In diesem hatten einige Vorgaenger recht, wenn man digital ausgibt, muss man sich an das vorliegende Format halten. Wenn sehr hoch abgetastet wird - must du auch mit dieser Rate die Werte ausgeben. Macht aber das Filter dahinter sehr viel kleiner und einfacher.
Ich hoffe das hilft. Probier einfach mal einen Ton auszugeben mit 4 und dann mit 8 Stuetzstellen, ohne Filter. Du wirst es hoeren.
Du brauchst NUR den Sinus zu rechnen. Vorsicht aber bei dem DAC, wenn er nur positive Spannung erzeugt, musst du einen Offset dazurechnen und mit einem genuegend grossen C auskoppeln.
mfg
wawa
Angenommen ich würde mit dem AVR eine winzige Liedstelle aufnehmen und dann per PWM wiedergeben (alles 8Bit und andere Hürden aussen vor), klänge das Wiedergegebene noch nach dem eingespeistem Lied oder nach "rumgepipse"?
MfG Killer
Hallo
Bild hier
http://www.youtube.com/watch?v=Yw3iHIym58k
Die Hardware:
- Aktivlautsprecherboxen mit PC oder MP3-Player
- PC-Speaker aus einem alten PC (8Ohm)
- Chinch-Servo-Adapter
- Servo-XBus-Adapter
- ein RP6 mit 8MHz-ATMega32
Die Software:
Das analoge Lautsprechersignal liegt an PortA.4, der Speaker an PortC.0. Was an PA4 erkannt wird, wird direkt an PC0 wieder ausgegeben und zur Kontrolle an der LED angezeigt. Lautstärke wird langsam aufgedreht bis die LED flackert und der Speaker piept. Fehlt noch das Speichern und die Wiedergabe.Code:// RP6 als Tonband 1.Versuch 30.12.2007 mic #include "RP6RobotBaseLib.h" int main(void) { initRobotBase(); extIntOFF(); DDRC |= 1; cli(); while(1) { if (PINA & E_INT1) { setLEDs(1); PORTC |= 1; } else { setLEDs(0); PORTC &= ~1; } } return(0); }
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Also ich wollte immer schon mal ein lustiges Pfeiffen aus dem µC bringen. Ok, ok, der Tiefpass war noch nie richtig ausgelegt und der Piezo ist auch nicht wirklich geeignet. Aber was denkt Ihr - hab ich da überhaupt ne Chance. Ich denk an Töne wie beim R2D2 - oder beim Wasserkocher mit Pfeiffe![]()
Ciao sagt der JoeamBerg
Für solche kleinen Töne gibt es ja beispielsweise unter Bascom einen Befehl wie "Sound" wodurch man an jedem beliebigen I/O Pin einen Ton bzw. Piepsen erzeugen kann.
MfG Killer
Solange die Töne ungefähr gleich laut sind macht das mit den 8 Bit keine Probleme. Ein piepsiger Ton kommt eher durch einen kleinen Lautprecher, nicht durch 8 Bit daten. Es könnten eventuell die Höhen fehlen, weil man die Abtastrate nicht so hoch wählen will. Das wird am ehesten mit dem Telefon vergleichbar. Zum Ausprobieren kann man ja man am PC mit den Datenformaten (8 Bit Wav) spielen. Das wird vom AVR auch nicht schlechter klingen, wenn die Lautsprecher stimmen.
Ach je, schade, ich spreche nur Assembler und C (und C noch dazu recht schlecht [-o< )Zitat von Killer
Ciao sagt der JoeamBerg
Dann teste ih es demnächst mal.
Habe ich es bezüglich dem PWM Signal richtig verstanden, dass beide Signalleitungen (in diesem Fall für den Lautsprecher + und - ) vom µC ausgehen?
MfG Killer
Hallo
Auch wenn das Interesse eher gering ist, habe es noch weiter versucht. Hier nun eine Lösung ohne ADC und ohne PWM. Es ist blechern und kurz, aber mit etwas Phantasie kann man es erkennen:
Bild hier
http://www.youtube.com/watch?v=-XpAL3PlMAw
Das unkomfortable Progamm (888Bytes) löscht nach dem Start den Speicher, liest die Daten ein bis der Speicher voll ist und spielt dann endlos:
Leider hat der Mega32 nur 2kb SRam, vielleicht geht's auch mit dem Flash...Code:// RP6 als Tonband mit Aufnehmen und Abspielen 30.12.2007 mic #include "rblib.h" // bindet u.a io.h und stdlib.h ein #include "rblib.c" // und dient vorrangig dem Debuggen #define speichergroesse 1536 // der Mega32 hat nur 2kb sram int main(void) { uint8_t speicher[speichergroesse], temp, bit_nr; // Speicherplatz bereitstellen uint16_t byte_nr, i, dummy; // und ein paar Hilfsvariablen rblib_init(); // ein paar Initialisierungen setMotorPWM(0,0); // PWM=0 sperrt den Interrupt PORTA &= ~(1 << PINA4); // PINA4 liest die Daten ein DDRA &= ~(1 << PINA4); DDRC |= (1 << PINC0); // an PINC0 hängt der Speaker byte_nr=0; // Zähler für die Bytes bit_nr=8; // Zähler für die Bits for(i=0;i<speichergroesse;i++) speicher[i]=0; // Speicher löschen while(0) // Zum Einstellen des Pegels { // wird nicht verwendet if (PINA & (1 << PINA4)) { setLEDs(1); PORTC |= (1 << PINC0); } else { setLEDs(0); PORTC &= ~(1 << PINC0); } for(i=0;i<150;i++) dummy+=i; } cli(); // Keine Störung zulassen, wir lesen ein do // Schleife der Datenbytes { do // Schleife der Bits { if (PINA & (1 << PINA4)) // Pegel als High erkannt? { setLEDs(1); // Ja, LED an PORTC |= (1 << PINC0); // Speaker an speicher[byte_nr] += 1; // und Bit0 im Datenbyte setzen } else { setLEDs(0); // Nein, LED aus PORTC &= ~(1 << PINC0); // Speaker aus speicher[byte_nr] += 0; // für's Timing Bit0 nicht setzen } speicher[byte_nr] *= 2; // Speicherbyte nach links shiften for(i=0;i<300;i++) dummy+=i; // kurze Verzögerung, wir samplen mit 8MHz! } while(--bit_nr); // nächstes Bit einlesen bit_nr=8; // acht Bit komplett } while(byte_nr++ < speichergroesse); // nächstes Byte bis Speicher voll sei(); // eigentlich nicht nötig while(1) // und nun endlos abspielen { byte_nr=0; // erstes Byte bit_nr=8; // jeweils 8 Bits cli(); // wieder keine Störungen zulassen do // Schleife der Bytes { temp = speicher[byte_nr]; // Byte zwischenspeichern do // Schleife der Bits { if (temp > 127) // Bit 7 gesetzt? { setLEDs(1); // Ja, LED an PORTC |= (1 << PINC0); // Speaker an } else { setLEDs(0); // Nein, LED aus PORTC &= ~(1 << PINC0); // Speaker aus } temp *= 2; // Byte nach links shiften for(i=0;i<300;i++) dummy+=i; // wieder kurz warten (speichern fehlt!) } while(--bit_nr); // nächstes Bit bit_nr=8; // acht Bits fertig } while(byte_nr++ < speichergroesse); // nächstes Byte bis Speicherende sei(); } return(0); // das war's. Einfach und blechern }
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
hi radbruch,
da hast du mal wieder was umgesetzt, während noch diskutiert wird, ob es umsetzbar ist
ich bin sicher, deine grundlagenforschung wird noch gewürdigt werden, und dein code verwendung finden. könntest du mal ein bisschen sprache "samplen"? wäre sicher interessant, wie das klingt.
gruesse
EDIT:
an shaun hätte ich noch fragen: beeinflusst der lautsprecher den gewichteten DAC nicht? und fliesst der strom nicht teilweise über den 12ohm widerstand wieder über den µC, wenn dessen pin low ist?
EDIT2 @ oberallgeier: wie ein teekessel oder so wie r2d2 wird es anfangs nicht pfeifen können, aber wenn du ein rechtecksignal mit verschiedenen frequenzen über einen vorwiderstand (oder ideal mit einem transistor als verstärker.. oder noch idealer mit einem kleinen audio verstärker wie dem tba820) an einen lautsprecher gibst, sollte immerhin schon etwas zu hören sein. das hier http://www.elby-designs.com/avrsynth/8535-3.wav klingt ja schon ganz ordentlich für einen avr.
Lesezeichen