Hi Martin,

zurück zum Thema PWM: Da gibt es verschiedene Modi - beim sogenannten CTC-Modus zählt der Timer so lange hoch, bis er einen bestimmten (frei wählbaren) Grenzwert erreicht. Ist das der Fall, wird der OC-Pin getoggelt, der Timer auf 0 gesetzt (daher auch CTC: Clear Timer on Compare) - und das Spiel fängt von vorne an. Es ist logisch, dass der Pin umso schneller getoggelt wird, je niedriger der Grenzwert ist. Dieser steht im OCR-Register (Output Compare Register) und bestimmt die Frequenz.

Soviel zur Theorie.

Als ersten Schritt zum Martinshorn-Programm solltest Du mal probieren, ob mit folgendem Code ein hörbarer Ton am Pin D.3 entsteht (ich habe nämlich keinen Mega48 da, an dem ich das probieren könnte):

Code:
$regfile = "m48def.dat"
$crystal = 1000000

DDRD.3=1
TCCR2A = &B00010010
TCCR2B = &B00000010
OCR2A = &B11111111

OCR2B=100

Do
Loop

End
Der Wert im Register OCR2B bestimmt die Tonhöhe: Bei 256 sind es etwa 244 Hz, bei 20 sind es 3125 Hz (Frequenz = 62.500 / OCR2B).

Wenn das funktioniert, kannst Du mit dem Wert von OCR2B herumexperimentieren, bis Du die richtigen Tonhöhen hast. Dann musst Du nur noch mit einem der anderen Timer dafür sorgen, dass der Wert von OCR2A im Takt des Martinshorns zwischen zwei geeigneten Werten hin- und hergesetzt wird.