Hallo Sternthaler,
Zitat Zitat von Sternthaler
So, eine neue Version
du bist aber schnell!
Zitat Zitat von Sternthaler
Was ist mit den 2 Bit? Würden dir die reichen?
Da es mir ebenso geht wie dir
Zitat Zitat von Sternthaler
Geduld, Wissen und ein gutes Ohr fehlen mir da für die Musik
bin ich in dieser Hinsicht leider vollkommen abhängig von meinem Sohn. Er wird sagen können, wieviele verschiedene Lautstärken man braucht. Bis morgen abend ist er allerdings noch weg.

Um rauszufinden, ab welcher "Geschwindigkeit" man überhaupt etwas hört, habe ich ein Testprogramm (nur 1 Motor) geschrieben.
Mit "bloßen" Ohren höre ich ab ungefähr 20 etwas. Mit Mikro und Verstärker schon ab 1!

Code:
// lautstärke test

#include "asuro.h"

void Sound1(uint16_t freq, uint16_t duration_msec, uint8_t amplitude)
{
   uint16_t wait_tics;
   uint32_t n,k,period_usec,dauer_usec;

   period_usec=1000000L/freq;
   dauer_usec=1000*(uint32_t)duration_msec;
   k=dauer_usec/period_usec;

   //IR Interuptfreq=36KHz
   //Wavefreq=18KHz

   wait_tics=18000/freq;

   MotorSpeed(amplitude, 0);

   for(n=0;n<k;n++)
   {
      MotorDir(FWD,FWD);
      Sleep(wait_tics);
      MotorDir(RWD,RWD);
      Sleep(wait_tics);
   }
   MotorSpeed(0,0);

}


  
int main(void)

{
  Init();

  	BackLED(ON,ON);
	StatusLED(RED);
	Sound1 (1000, 1000, 1);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 2);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 3);
	StatusLED(RED);
	Sound1 (1000, 1000, 4);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 5);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 6);
	StatusLED(RED);
	Sound1 (1000, 1000, 7);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 8);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 9);
	BackLED(OFF,OFF);
	StatusLED(RED);
	Sound1 (1000, 1000, 10);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 20);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 30);
	StatusLED(RED);
	Sound1 (1000, 1000, 40);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 50);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 60);
	StatusLED(RED);
	Sound1 (1000, 1000, 70);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 80);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 90);
	StatusLED(RED);
	Sound1 (1000, 1000, 100);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 110);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 120);
	StatusLED(RED);
	Sound1 (1000, 1000, 130);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 140);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 150);
	StatusLED(RED);
	Sound1 (1000, 1000, 160);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 170);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 180);
	StatusLED(RED);
	Sound1 (1000, 1000, 190);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 200);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 210);
	StatusLED(RED);
	Sound1 (1000, 1000, 220);
	StatusLED(YELLOW);
	Sound1 (1000, 1000, 230);
	StatusLED(GREEN);
	Sound1 (1000, 1000, 240);
	StatusLED(RED);
	Sound1 (1000, 1000, 250);
	
	StatusLED(OFF);



  	while (1);
  	return 0;
}
nochmal zu unseren gebundenen und angestoßenen Tönen:
für jede Tonlänge gibt es ja beide Varianten, wobei sich der angestoßene Ton aus zwei Tönen zusammensetzt: 20ms aus und dann Länge angestoßen = gebundener Ton - 20ms.

Das bedeutet, dass man in der Melodie für die angestoßenen Töne immer zwei Töne schreiben muss.

Beispiel:
#define vierg 750 //viertel gebunden
#define viera 730 //viertel angestoßen
#define anst 20 //Anstoßzeit = Differenz

Ein angestoßener Ton::
_OFF,anst,
F5,viera,

Vielleicht fällt dir hierzu ja auch noch eine Vereinfachung ein?

Gruss
M.

PS: Wenn es dir gelingt, den ASURO gleichzeitig während er Musik macht auch noch fahren zu lassen, bekommst du von mir einen ASURO-MUSIK-ORDEN!