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
Lesezeichen