Hallo

Zur Einstimmung erstmal ein kleines Video:

Bild hier  
http://www.youtube.com/watch?v=a60aLP9_1_A

Mein Jukebox-Speaker hängt an SCL, die Frequenzen werden wie beim M32 mit dem Timer2 erzeugt und am OC2 ausgegeben (die IR-COMM-LEDs blinken im Takt). Bei der Ausgabe wird der Pegel an OC2 eingelesen und auf den SCL-Pin kopiert (der selbe Trick funktioniert ja auch am TXD):
Code:
// Tonerzeugung am RP6-Base mit beep() aus der M32-Library        9.1.2010 mic
// Der Speaker hängt an PC0(SCL)

// https://www.roboternetz.de/phpBB2/viewtopic.php?t=52013

#define ton_c 255-(15625/264)
#define ton_d 255-(15625/297)
#define ton_e 255-(15625/330)
#define ton_f 255-(15625/352)
#define ton_g 255-(15625/396)
#define ton_a 255-(15625/440)
#define ton_h 255-(15625/495)
#define ton_c1 255-(15625/528)

#define ganzton 400

#include "RP6RobotBaseLib.h"

void beep(uint8_t pitch, uint16_t time) // aus der Lib des M32
{
	//controlStatus.beep = true;
	//sound_timer = time;
	OCR2 = 255-pitch;
	// CTC-Mode, toggle OC2, prescaler /256
	TCCR2 =  (1 << WGM21) | (1 << COM20) | (1 << CS22) | (1 << CS21);

	setStopwatch1(0);
	DDRD |= (1<<PD7); // OC2-Pin auf Ausgang für Timer2 ;)
	while(getStopwatch1()<time)
	{
	   if(PIND & (1<<PD7)) PORTC |= 1; else PORTC &= ~1; // SCL mit OC2 togglen ;)
	}
	TCCR2 = 0; // Ton aus
	DDRD &= ~(1<<PD7); // OC2-Pin auf Eingang ;)
   PORTD &= ~(1<<PD7); // damit die IR-Comm-LED nicht durchbrennt
   PORTC &= ~1; // Lautsprecher aus
	mSleep(ganzton/10); // Trennung zwischen den Tönen
}

int main(void)
{
   initRobotBase();
   DDRC |= 1; // SCL auf Ausgang und Low Der Speaker
   PORTC &= ~1;
   DDRD &= ~(1<<PD7); // OC2-Pin auf Eingang
   PORTD &= ~(1<<PD7); // ohne PullUp
   startStopwatch1();

   beep(ton_c, ganzton); // Tonleiter rauf
   beep(ton_d, ganzton);
   beep(ton_e, ganzton);
   beep(ton_f, ganzton);
   beep(ton_g, ganzton);
   beep(ton_a, ganzton);
   beep(ton_h, ganzton);
   beep(ton_c1, ganzton);
   mSleep(1000);
   beep(ton_c1, ganzton/2); // und wieder runter
   beep(ton_h, ganzton/2);
   beep(ton_a, ganzton/2);
   beep(ton_g, ganzton/2);
   beep(ton_f, ganzton/2);
   beep(ton_e, ganzton/2);
   beep(ton_d, ganzton/2);
   beep(ton_c, ganzton/2);
   mSleep(2000);

   while(1)
   {
//Ode an die Freude (http://www.doktus.de/dok/25443/ode-an-die-freude.html)
   	beep(ton_e, ganzton);
   	beep(ton_e, ganzton);
   	beep(ton_f, ganzton);
   	beep(ton_g, ganzton);

   	beep(ton_g, ganzton);
   	beep(ton_f, ganzton);
   	beep(ton_e, ganzton);
   	beep(ton_d, ganzton);

   	beep(ton_c, ganzton);
   	beep(ton_c, ganzton);
   	beep(ton_d, ganzton);
   	beep(ton_e, ganzton);

   	beep(ton_e, ganzton+ganzton/2);
   	beep(ton_d, ganzton/2);
   	beep(ton_d, ganzton*2);
   	
   	beep(ton_e, ganzton);
   	beep(ton_e, ganzton);
   	beep(ton_f, ganzton);
   	beep(ton_g, ganzton);

   	beep(ton_g, ganzton);
   	beep(ton_f, ganzton);
   	beep(ton_e, ganzton);
   	beep(ton_d, ganzton);

   	beep(ton_c, ganzton);
   	beep(ton_c, ganzton);
   	beep(ton_d, ganzton);
   	beep(ton_e, ganzton);

   	beep(ton_d, ganzton+ganzton/2);
   	beep(ton_c, ganzton/2);
   	beep(ton_c, ganzton*2);

   	beep(ton_d, ganzton);
   	beep(ton_d, ganzton);
   	beep(ton_e, ganzton);
   	beep(ton_c, ganzton);

   	beep(ton_d, ganzton);
   	beep(ton_e, ganzton/2);
   	beep(ton_f, ganzton/2);
   	beep(ton_e, ganzton);
   	beep(ton_c, ganzton);

   	beep(ton_d, ganzton);
   	beep(ton_e, ganzton/2);
   	beep(ton_f, ganzton/2);
   	beep(ton_e, ganzton);
   	beep(ton_d, ganzton);

   	beep(ton_c, ganzton);
   	beep(ton_d, ganzton);
		mSleep(ganzton*2);

   	beep(ton_e, ganzton);
   	beep(ton_e, ganzton);
   	beep(ton_f, ganzton);
   	beep(ton_g, ganzton);

   	beep(ton_g, ganzton);
   	beep(ton_f, ganzton);
   	beep(ton_e, ganzton);
   	beep(ton_d, ganzton);

   	beep(ton_c, ganzton);
   	beep(ton_c, ganzton);
   	beep(ton_d, ganzton);
   	beep(ton_e, ganzton);

   	beep(ton_d, ganzton+ganzton/2);
   	beep(ton_c, ganzton/2);
   	beep(ton_c, ganzton*2);

   	mSleep(2000);
	}
   return(0);
}
Die Formel habe ich an die 8MHz des Base angepasst. Warum die Stopwatch() gelegentlich "stolpert" habe ich noch nicht rausbekommen, aber als Demo scheint mir das schon recht nett :)

@Dirk: Wie hast du deine Werte für die beep()-Funktion ermittelt?

Gruß

mic

[Edit]
Lautsprecher aus nach beep()