Ich denke, dass ich es jetzt hinbekommen habe - leider fehlt mir die Original-Bascom-Startmelodie, aber diese hier klingt jetzt jedenfalls auch schön.

Verwendet habe ich die Basis-Delay-Funktion _delay_loop_2(i), welche bei 16MHz und i=1 etwa (+/- Setup-Delay) 0,25 µs wartet.

Ich ersetze in der sound()-Funktion lediglich jeweils _delay_ms(hoehe); durch _delay_loop_2(150*hoehe); - was dann in seiner Gesamtheit folgendermaßen aussieht:

Code:
void sound(uint8_t hoehe, uint16_t laenge)
{
	for(uint16_t i=0; i<laenge*15; i=i+(2*hoehe))
	{
		setportdon(7);
		_delay_loop_2(150*hoehe);
		setportdoff(7);
		_delay_loop_2(150*hoehe);
	}
}
Man kann sich mit Hilfe von void _delay_loop_2 (uint16_t __count) auch eine zweite waitms-Funktion bauen, die folgendermaßen aussieht (erfolgreich getestet bei z.B. 3s-Wartezeit):

Code:
void waitms2(uint16_t ms)
{
	for(; ms>16; ms-=16)
	{
		_delay_loop_2(64000); // 64000 = 16 * 4000
	}

	_delay_loop_2(4000*ms);
}
Kann mir jemand bitte bestätigen, dass es wie hier beschrieben dann funktioniert?

Den Sound kann man mit der Konstante 150 noch ein wenig variieren.

Ich würde dann auch gerne das C-Demoprogramm modifizieren wollen, wohl wissend, dass es insgesamt vlt. sinnvoller wäre, Timer zu verwenden - aber das würde für das Demoprogramm wohl zu weit gehen. Ich denke, dass diese kleine Änderung (im Prinzip nur die beiden Zeilen) okay sind - oder?

Viele Grüße,
Sören