www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Melodiengenerator? Hilfe, wie geht das !!!


Autor: Tomi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi leute,

habe eine aufgabe zu löse.
könnte mir da jemand helfen dass programm zu erstellen.
es geht um einen melodiengenerator.

hier die aufgabenstellung:
"Programmieren Sie einen Melodiengenerator, der acht in Tabellen 
festgelegte Melodien abspielt, indem mit drei
Tasten eine Kombination gedrückt wird. Alle Melodien sollen bekannt, 
erkennbar und dokumentiert sein."

also es würde reichen wenn es mit einer melodie klappen würde.

das programm wird im avr4 geschrieben.
als platine wird das atmega88 genutzt.

BITTE um HILFE !

gruß
tomi

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sir Sydom (sirsydom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab das mal mit nem atmega32 gemacht, interrupt gesteuert:

Code : music.h
#define TONE_C      654
#define TONE_CIS    693
#define TONE_DES    693
#define TONE_D      734
#define TONE_DIS    778
#define TONE_ES    778
#define TONE_E      824
#define TONE_F      873
#define TONE_FIS    925
#define TONE_GES    925
#define TONE_G      980
#define TONE_GIS    1038
#define TONE_AS    1038
#define TONE_A      1100
#define TONE_AIS    1165
#define TONE_B      1165
#define TONE_H      1235
#define TONE_c      1308
#define TONE_cis    1386
#define TONE_des    1386
#define TONE_d      1468
#define TONE_dis    1556
#define TONE_es    1556
#define TONE_e      1648
#define TONE_f      1746
#define TONE_fis    1850
#define TONE_ges    1850
#define TONE_g      1960
#define TONE_gis    2077
#define TONE_as    2077
#define TONE_a      2200
#define TONE_ais    2331
#define TONE_b      2331
#define TONE_h      2469
#define TONE_c1    2616
#define TONE_cis1    2772
#define TONE_des1    2772
#define TONE_d1    2937
#define TONE_dis1    3111
#define TONE_es1    3111
#define TONE_e1    3296
#define TONE_f1    3492
#define TONE_fis1    3700
#define TONE_ges1    3700
#define TONE_g1    3920
#define TONE_gis1    4153
#define TONE_as1    4153
#define TONE_a1    4400
#define TONE_ais1    4662
#define TONE_b1    4662
#define TONE_h1    4939
#define TONE_c2    5233
#define TONE_cis2    5544
#define TONE_des2    5544
#define TONE_d2    5874
#define TONE_dis2    6223
#define TONE_es2    6223
#define TONE_e2    6593
#define TONE_f2    6985
#define TONE_fis2    7400
#define TONE_ges2    7400
#define TONE_g2    7840
#define TONE_gis2    8306
#define TONE_as2    8306
#define TONE_a2    8800
#define TONE_ais2    9324
#define TONE_b2    9324
#define TONE_h2    9878
#define TONE_c3    10465
#define TONE_cis3    11087
#define TONE_des3    11087
#define TONE_d3    11747
#define TONE_dis3    12445
#define TONE_es3    12445
#define TONE_e3    13185
#define TONE_f3    13969
#define TONE_fis3    14800
#define TONE_ges3    14800
#define TONE_g3    15680
#define TONE_gis3    16612
#define TONE_as3    16612
#define TONE_a3    17600
#define TONE_ais3    18647
#define TONE_b3    18647
#define TONE_h3    19755


Code music.c :
#include <avr/io.h>
#include <avr/interrupt.h>
#include "music.h"

#define PAUSE  10

unsigned int speed  = 1500;
int pause = PAUSE;
unsigned int count  = 0;
unsigned int pos  = 0;
unsigned int melody1[27][2] =  {
            {TONE_g1, 8},
                {TONE_g1, 8},
              {TONE_a1, 4},
              {TONE_g1, 4},
            {TONE_c2, 4},
            {TONE_h1, 2},
            {TONE_g1, 8},
            {TONE_g1, 8},
            {TONE_a1, 4},
            {TONE_g1, 4},
            {TONE_d2, 4},
            {TONE_c2, 2},
            {TONE_g1, 8},
            {TONE_g1, 8},
            {TONE_g2, 4},
            {TONE_e2, 4},
            {TONE_c2, 8},
            {TONE_c2, 8},
            {TONE_h1, 4},
            {TONE_a1, 4},
            {TONE_f2, 8},
            {TONE_f2, 8},
            {TONE_e2, 4},
            {TONE_c2, 4},
            {TONE_d2, 4},
            {TONE_c2, 2}
            };
unsigned int length = 27;



void make_music(int freq, int time)
{
  TCCR0 = 0;
  if(freq < 4910)
  {
    TCCR0 = (1<<COM00) | (1<<CS02) | (1<<WGM01);
    OCR0 = 312500 / freq;
  }
  else
  {
    TCCR0 = (1<<COM00) | (1<<CS00) | (1<<CS01) | (1<<WGM01);
    OCR0 = 1250000 / freq;
  }

  count = (speed / time) / 10;
  OCR2  = 156;
  TIMSK = (1<<OCIE2);
  TCCR2 = 0;
  TCCR2 = (1<<WGM21) | (1<<CS22) | (1<<CS21) | (1<<CS20);  
  
  return;
}

ISR(TIMER2_COMP_vect)
{
  count--;
  if(count == 0)
  {
    TCCR0 = 0;
    pause--;
    count++;
    if(pause == 0)
    {
      TCCR2 = 0;
      start_melody(melody1);
      pause = PAUSE;
    }
  }
}

void start_melody(int melody[16][2])
{
  if(pos >= length-1)
    return;
  make_music(melody[pos][0], melody[pos][1]);
  pos++;
  return;
}

int main (void)
{  
  DDRB = 0xFF;
  sei();
  
  start_melody(melody1);
  

  while(1);
  return 0;
}

  

Autor: Andreas K. (oldcoolman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tomi,
zunächst mal... DU hast eine Aufgabe zu lösen.
will heissen , wenns ein anderer tut haste nix draus gelernt.

beschaff dir mal die frequenzen zu den benötigten noten.
Die Noten der Lieder.
Die Frequenzen must du dann mit dem timer erzeugen.

Gruß
Andi

Autor: xyz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>das programm wird im avr4 geschrieben.
Was ist das für eine Prog. Sprache?
Kenne ich noch nicht.

Autor: tomi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ oldcoolman:

also das mit den frequenzen hab ich.

es geht mir mehr um die timer.
ich brauche doch 2 timer, oder?
einen für die Tonhöhe und den anderen für die tonlänge.
die tonhöhe geht über die frequenz (PWM) aber die tonlänge ist mir nicht 
ganz klar.

gruß





Autor: SirSydom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
steht doch da. schau dir den code an! um genau zu sein die variable 
count

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.