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







Zitieren

Lesezeichen