mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Elm Chan Wavetable Melody Generator


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: J!M! (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: vlad (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: J!M! (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).
// Name : melody2asm.js
// Just drop file to this script


// get file(s) from argument-list
objArgs = WScript.Arguments;

if (objArgs.length > 0)
{
// get path of script
  SkriptPfad = WScript.ScriptFullName;
  SkriptPfad = SkriptPfad.substr(0,SkriptPfad.length - WScript.ScriptName.length);

  var filename_data,filename_out;
  for (var arg_index=0; arg_index < objArgs.length; arg_index++)
  { filename_data=objArgs.item(arg_index);
    if (filename_data.substr(filename_data.length-3,3) == "txt")
    { filename_out=filename_data.substr(0,filename_data.length-3)+"asm";

      data_asm="";
      file_load(filename_data);
      write_file(filename_out,data_asm);

    }
    else
    { WScript.echo("Concerning data-file must be a text file (*.txt) : "+filename_data); }
  }

  function file_load(newfile)
  { var isdata=true;
    { var file = new ActiveXObject("Scripting.FileSystemObject");
      if (file.FileExists(newfile)==true) 
      { var datafile=file.OpenTextFile(newfile,1,false,0);
        var full_data = datafile.ReadAll();
        var data_line = full_data.split("\r");
        var temp;
        var count=0,i,k,time,cntall=0;
        var data_array;
        for (i=0; i < data_line.length;i++)
        { isdata=true;
          if (data_line[i].length < 5) { isdata=false;}
          if (data_line[i].indexOf(";") >= 0){ isdata=false;}
          data_line[i]=data_line[i].slice(1);

          if (isdata)
          { data_array = data_line[i].split(" ");
            for (k=0;k < data_array.length;k++)
            { temp=data_array[k];
              if (k==0) 
               { time=parseInt(temp);int1=time&255;putbyte(time&255);putbyte(time>>8);}
              else
               { if (k==(data_array.length-1)) {temp=temp+"|en";}
                 putbyte(temp);
               }
            }
      
          } // if isdata
        }
        data_asm+="\r\n\; "+cntall;
        datafile.Close();

        function putbyte(dat)
        { if (count>=16) {count=0;}
          if (count==0 )
           {data_asm+="\r\n\t.db "+dat;}
          else
           {data_asm+=", "+dat;}
          count++;
          cntall++;
        }

     } // if file exist
     else
     { alert("File doesn't exist");}
   }
  }


  function write_file(filename,data)
  {fso=new ActiveXObject("Scripting.FileSystemObject");
   file=fso.OpenTextFile(filename,2,true);
   file.write(data);
   file.close(); 
  }

}
else
{ WScript.echo("Concerning file must be dropped to this script");
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.