Forum: Mikrocontroller und Digitale Elektronik Elm Chan Wavetable Melody Generator


von Florian (Gast)


Lesenswert?

Hallo zusammen,

bin völliger Anfänger was die Atmel Programmierung angeht und habe heute 
mal versucht folgendes Projekt von Elm Chan ans Laufen zu bekommen:

 http://elm-chan.org/works/mxb/report.html

Hat auch alles wunderbar geklappt. Wollte einfach mal davon berichten, 
falls ein anderer Anfänger das gleiche vor hat.

Was man braucht:
* konstante 5V Betriebsspannung (z.B. über einen 7805 Spannungsregler)
* Steckbrett
* ATTiny45, am besten in IC Sockel
* ISP Programmieradapter
* Kondensator
* Alten Lautsprecher oder kleinen Summer


Den Schaltplan gibt es auf der Seite:
http://elm-chan.org/works/mxb/mg.png

Die Widerstände die dort eingezeichnet sind habe ich einfach 
weggelassen, da ich die passenden (33 Ohm) nicht hatte. Hat auch ohne 
funktioniert und ist nichts kaputt gegangen :-) Anstatt des 10µF 
Kondensator habe ich einen 100nF Keramik Kondensator genommen (da ich 
die anderen nicht hatte).

Den Source Code gibt es auch auf der Seite:
http://elm-chan.org/works/mxb/mg.zip

Habe die Dateien leider weder mit "avra" noch mit "avr-as" kompiliert 
bekommen, daher habe ich einfach die mitgelieferte .hex Datei direkt auf 
den Atmel übertragen. Mein Programmieradapter kann avr109 und avr910. 
Ersteres ist soweit ich weiss normalerweise schneller, hat aber nicht 
funktioniert. Letzteres hat funktioniert, z.B. so:

avrdude -p t45 -b 115200 -u -F -c avr910 -P /dev/ttyUSB0 -U 
flash:w:mg.hex -vvv

Danach ist man schon fast fertig, allerdings läuft der Atmel jetzt noch 
zu langsam, da er im Auslieferungszustand einen Prescaler für die 
Systemclock gesetzt hat. Ausserdem muss man "High Frequency PLL Clock" 
aktivieren. Dazu  muss man die Fuse bits im Low Fuse Byte anpassen, z.B. 
geht das mit avrdude so:
* avrdude -p t45 -b 115200 -u -F -c avr910 -P /dev/ttyUSB0 -t
* "write lfuse 0 0xe1"
* (Strg+D)

Danach kann man direkt die Lautsprecher anschliessen und sollte die 
Melodie hören, die wirklich toll klingt für so ein kleines Teil!


Hoffe das hilft irgendwem :-) Oder vielleicht hat ja jemand ein paar 
Anmerkungen (z.B. wozu die Widerstände sind? Lautstärkenbegrenzung? Ob 
man vielleicht doch lieber 10µF nehmen sollte oder obs egal ist? Ob man 
dem Lautsprecher noch einen Kondensator geben könnte, um den Klang noch 
besser zu machen, o.ä.? Was BOD=2.7V im Schaltplan bedeutet?)

Viele Grüße
Flo

von Paul Baumann (Gast)


Lesenswert?

Na dann: Glückwunsch zum gelungenen Aufbau.

Die Widerstände sollen eine Überlastung des Controllers verhindern, wenn 
die Impedanz des Lautsprechers zu klein wäre. Der Kondensator soll 
verhindern, daß die Betriebsspannung bei Laständerungen einbricht.


BOD bedeutet: Brown Out Detection, was soviel heißt wie Überwachung, ob 
die Betriebsspannung des Controllers "absackt".

Dafür gibt es auch eine "Fuse".

MfG Paul

von J!M! (Gast)


Lesenswert?

Hallo!

Ich brauche dringend Hilfe von jemandem, der es schon mal zum Laufen 
gebracht hat:
Progammieren tue ich zwar schon seit ziemlich lange, mit Perl hatte ich 
aber noch nie was am Hut gehabt.
Doch leider ist ja das Skript, das die txt-Datei in .asm konvertiert, in 
Perl geschrieben.
So, hab mir also ActivePerl runtergeladen und installiert. Das im 
Download mitgelieferte "example.pl" konnte ich einwandfrei ausführen, 
doch die "mel2asm.pl" partout nicht! Das Ganze unter WinXP.
Gebe ich in cmd ein "perl _:\...\mel2asm.pl", so scheint er in eine 
Endlosschleife zu gehen. Denn die Eingabeaufforderung wird nicht 
angezeigt, sondern cmd "hängt"  da so (also "C:\...\..>" wird nicht 
ausgegeben).
(Falls nicht klar was gemeint ist, poste ich auch noch mal n Sreenshot.)
Mache ich "#perl" am Anfang des Skriptes weg, dann kommt Fehlermeldung
[syntax errir at mel2asm.pl line 1, near "txt >"]

Warum?

Ich hoffe wirklich, ihr könnt mir helfen, da es für ein Geschenk für 
meine beste Freundin zum bDay ist und mir es sehr am Herzen liegt!

Danke im Voraus!

MfG J!M!

von vlad (Gast)


Lesenswert?

das Programm funktioniert schon allerdings ist das kommandozeilen 
verhalten nicht so wie man es erwaeten würde.

das programm ließt daten von der Standardeingabe und gibt die 
umgewandelten auf der standardausgabe aus.

Kommandozeilenparameter werden ignoriert.

am begin des scriptes steht ein beispiel, wie das ding aufgerufen werden 
sollte und zwar:

perl mel2asm.pl < mel.txt > melody.asm

das heißt die datei mel.txt wird auf die standardeingabe umgeleitet.
Für das programm sieht es aus, als tippt jemand den inhalt der datei 
direkt ein.

und die Ausgabe des Programms wird in melody.asm umgeleitet.
wenn du das > melody.asm weglässt wird alles in der kommandozeile 
ausgegeben

von J!M! (Gast)


Lesenswert?

Vieeelen vieelen Dank!

Da ich keine Ahnung von Perl habe, dachte ich dass "mel2asm.pl < mel.txt 
> melody.asm" bereits ein Skriptbefehl ist, also das Skript selbst diese 
Einlese und Ausgabe macht, aber anscheinend war es nur ein Kommentar.

Nochmal Danke! däumchen

von Sven (Gast)


Lesenswert?

Hallo,

ich hatte das gleiche Problem mit mel2asm.pl und habe es in javascript 
(mit FSO) nachgebaut (win-XP) einfach drag & drop im explorer und 
melody.txt wird in melody.asm umgewandelt (evtl. etwas umständlich 
umgesetzt).
1
// Name : melody2asm.js
2
// Just drop file to this script
3
4
5
// get file(s) from argument-list
6
objArgs = WScript.Arguments;
7
8
if (objArgs.length > 0)
9
{
10
// get path of script
11
  SkriptPfad = WScript.ScriptFullName;
12
  SkriptPfad = SkriptPfad.substr(0,SkriptPfad.length - WScript.ScriptName.length);
13
14
  var filename_data,filename_out;
15
  for (var arg_index=0; arg_index < objArgs.length; arg_index++)
16
  { filename_data=objArgs.item(arg_index);
17
    if (filename_data.substr(filename_data.length-3,3) == "txt")
18
    { filename_out=filename_data.substr(0,filename_data.length-3)+"asm";
19
20
      data_asm="";
21
      file_load(filename_data);
22
      write_file(filename_out,data_asm);
23
24
    }
25
    else
26
    { WScript.echo("Concerning data-file must be a text file (*.txt) : "+filename_data); }
27
  }
28
29
  function file_load(newfile)
30
  { var isdata=true;
31
    { var file = new ActiveXObject("Scripting.FileSystemObject");
32
      if (file.FileExists(newfile)==true) 
33
      { var datafile=file.OpenTextFile(newfile,1,false,0);
34
        var full_data = datafile.ReadAll();
35
        var data_line = full_data.split("\r");
36
        var temp;
37
        var count=0,i,k,time,cntall=0;
38
        var data_array;
39
        for (i=0; i < data_line.length;i++)
40
        { isdata=true;
41
          if (data_line[i].length < 5) { isdata=false;}
42
          if (data_line[i].indexOf(";") >= 0){ isdata=false;}
43
          data_line[i]=data_line[i].slice(1);
44
45
          if (isdata)
46
          { data_array = data_line[i].split(" ");
47
            for (k=0;k < data_array.length;k++)
48
            { temp=data_array[k];
49
              if (k==0) 
50
               { time=parseInt(temp);int1=time&255;putbyte(time&255);putbyte(time>>8);}
51
              else
52
               { if (k==(data_array.length-1)) {temp=temp+"|en";}
53
                 putbyte(temp);
54
               }
55
            }
56
      
57
          } // if isdata
58
        }
59
        data_asm+="\r\n\; "+cntall;
60
        datafile.Close();
61
62
        function putbyte(dat)
63
        { if (count>=16) {count=0;}
64
          if (count==0 )
65
           {data_asm+="\r\n\t.db "+dat;}
66
          else
67
           {data_asm+=", "+dat;}
68
          count++;
69
          cntall++;
70
        }
71
72
     } // if file exist
73
     else
74
     { alert("File doesn't exist");}
75
   }
76
  }
77
78
79
  function write_file(filename,data)
80
  {fso=new ActiveXObject("Scripting.FileSystemObject");
81
   file=fso.OpenTextFile(filename,2,true);
82
   file.write(data);
83
   file.close(); 
84
  }
85
86
}
87
else
88
{ WScript.echo("Concerning file must be dropped to this script");
89
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.