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:
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
}
Leider hat der Mega32 nur 2kb SRam, vielleicht geht's auch mit dem Flash...

Gruß

mic