Forum: Mikrocontroller und Digitale Elektronik Melodiengenerator


von Andi (Gast)


Lesenswert?

hallo,

bin soweit mit meinem melodiengenerator gekommen.
jetzt fehlt mir timer2 mit dem ich die tonlänge ansteuern kann.

die main funktion funktioniert auch nicht recht.

kann mir bitte jemand weiterhelfen. ich komm einfach nicht mehr weiter.

in melodien.h sind meine tonfrequenzen.

gruß




#include <avr/io.h>
#include <avr/interrupt.h>
#include "melodien.h"


void Initalisierung_Timer0(void);
void Initalisierung_Timer1(void);
void Initalisierung_Timer2(void);
void Initalisierung_Buzzer(void);
void Tastenabfrage(void);

int i=0;

int millisec_50 = 0;
int millisec_50_flag = 0;

unsigned char Key;
unsigned char KeyOld;

unsigned char T1 = 0;
unsigned char T2 = 0;
unsigned char T3 = 0;






/*********************************************************************** 
*******
*
*  Ein Song ist durch eine Notentabelle definiert. Das erste Byte 
bestimmt das
*  Tempo. Ein langsames Tempo wird durch einen hohes Byte erzeugt, und 
umgekert.
*  Jeder Ton besteht aus zwei Bytes. Das erste gibt die Tonlänge an, das 
andere
*  die Frequenz. Die Frequenz von jedem Ton ist in den Header Files 
unter
*  "melodien.h" definiert. Der Timer0 kontrolliert das Tempo und die 
Länge von
*  jedem Ton, während Timer1 über die PWM die Frequenz vorgibt. Das 
vorletzte
*  Byte hat eine "0", welche das Ende einführt und das letze Byte 
wiederholt die
*  Melodie wenn es "1" ist, wenn "0" dann nicht.
*
************************************************************************ 
******/


/*********************************************************************** 
*******
*
*  Definition der Melodie über den Ton (z.B.: e2) und der Tonlänge 
(z.B.: 8)
*  Das Tempo wird durch das erster Byte (z.B.: bei FurElise wäre es 3) 
gewählt.
*
************************************************************************ 
******/




const int FurElise[]=
        {
            3,
            8,e2, 8,xd2, 8,e2, 8,xd2, 8,e2, 8,b1, 8,d2, 8,c2, 4,a1, 8,p,
            8,c1, 8,e1, 8,a1, 4,b1, 8,p, 8,e1, 8,xg1, 8,b1, 4,c2, 8,p, 
8,e1,
            8,e2, 8,xd2, 8,e2, 8,xd2, 8,e2, 8,b1, 8,d2, 8,c2, 4,a1, 8,p, 
8,c1,
            8,e1, 8,a1, 4,b1, 8,p, 8,e1, 8,c2, 8,b1, 4,a1,
            0, 1
        };





const int Mozart[] =
        {
            3,
            16,xf1, 16,e1, 16,xd1, 16,e1, 4,g1, 16,a1, 16,g1, 16,xf1, 
16,g1,
            4,b1, 16,c2, 16,b1, 16,xa1, 16,b1, 16,xf2, 16,e2, 16,xd2, 
16,e2,
            16,xf2, 16,e2, 16,xd2, 16,e2, 4,g2, 8,e2, 8,g2, 32,d2, 
32,e2,
            16,xf2, 8,e2, 8,d2, 8,e2, 32,d2, 32,e2, 16,xf2, 8,e2, 8,d2, 
8,e2,
            32,d2, 32,e2, 16,xf2, 8,e2, 8,d2, 8,xc2, 4,b1,
            0, 1
        };





const int Minuet[] =
        {
            2,
            4,d2, 8,g1, 8,a1, 8,b1, 8,c2, 4,d2, 4,g1, 4,g1, 4,e2, 8,c2,
            8,d2, 8,e2, 8,xf2, 4,g2, 4,g1, 4,g1, 4,c2, 8,d2, 8,c2, 8,b1,
            8,a1, 4,b1, 8,c2, 8,b1, 8,a1, 8,g1, 4,xf1, 8,g1, 8,a1, 8,b1,
            8,g1, 4,b1, 2,a1,
            0, 1
        };





const int AuldLangSyne[] =
        {
            3,
            4,g2, 2,c3, 8,c3, 4,c3, 4,e3, 2,d3, 8,c3, 4,d3, 8,e3, 8,d3, 
2,c3,
            8,c3, 4,e3, 4,g3, 2,a3, 8,p, 4,a3, 2,g3, 8,e3, 4,e3, 4,c3, 
2,d3,
            8,c3, 4,d3, 8,e3, 8,d3, 2,c3, 8,a2, 4,a2, 4,g2, 2,c3, 4,p,
            0, 1
        };





const int Sirene1[] =
        {
            0,
            32,400, 32,397, 32,394, 32,391, 32,388, 32,385, 32,382, 
32,379,
            32,376, 32,373, 32,370, 32,367, 32,364, 32,361, 32,358, 
32,355,
            32,352, 32,349, 32,346, 32,343, 32,340, 32,337, 32,334, 
32,331,
            32,328, 32,325, 32,322, 32,319, 32,316, 32,313, 32,310, 
32,307,
            32,304, 32,301, 32,298, 32,298, 32,301, 32,304, 32,307, 
32,310,
            32,313, 32,316, 32,319, 32,322, 32,325, 32,328, 32,331, 
32,334,
            32,337, 32,340, 32,343, 32,346, 32,349, 32,352, 32,355, 
32,358,
            32,361, 32,364, 32,367, 32,370, 32,373, 32,376, 32,379, 
32,382,
            32,385, 32,388, 32,391, 32,394, 32,397, 32,400,
            0, 1
        };





const int Sirene2[] =
        {
            3,
            4,c2, 4,g2,
            0, 1
        };






const int Whistle[] =
        {
            0,
            32,200, 32,195, 32,190, 32,185, 32,180, 32,175, 32,170, 
32,165,
            32,160, 32,155, 32,150, 32,145, 32,140, 32,135, 32,130, 
32,125,
            32,120, 32,115, 32,110, 32,105, 32,100, 8,p, 32,200, 32,195,
            32,190, 32,185, 32,180, 32,175, 32,170, 32,165, 32,160, 
32,155,
            32,150, 32,145, 32,140, 32,135, 32,130, 32,125, 32,125, 
32,130,
            32,135, 32,140, 32,145, 32,150, 32,155, 32,160, 32,165, 
32,170,
            32,175, 32,180, 32,185, 32,190, 32,195, 32,200,
            0, 0
        };


const int *Melodie[] = { FurElise, Mozart, Minuet, AuldLangSyne, 
Sirene1, Sirene2, Whistle, 0};





/*********************************************************************** 
*******
*
*  Initalisierung von Timer0
*
*
*  Aufgabe: Entprellen
*
************************************************************************ 
******/


void Initalisierung_Timer0(void)
{
  TCCR0A &= ~(1<<WGM00);
  TCCR0A |= ~(1<<WGM01);
  TCCR0B &= ~((1<<WGM02)|(1<<CS02)|(1<<CS00));
  TCCR0B |= (1<<CS01);
  OCR0A = 115;
  TIMSK0 |=(1<<OCIE0A);
  sei ();
}





/*********************************************************************** 
*******
*
*  Interrupt Service Routine für Timer0
*
************************************************************************ 
******/


ISR(TIMER0_COMPA_vect)
{
  millisec_50 ++;            //Variable millisec_50 wird jede 50 µs um 
eins inkrementiert

  if (millisec_50==100)        //sobald Wert 100, dann sind 50 
Millisekunden vergangen

    {
      millisec_50_flag = 1;    //Flag wird gesetzt
      millisec_50 = 0;      //Variable wird wieder auf 0 gesetzt
    }
}





/*********************************************************************** 
*******
*
*  Initalisierung von Timer1
*
*
*  Aufgabe: gibt die Frequenz, somit den Ton, über die PWM wieder
*
************************************************************************ 
******/


void Initialisierung_Timer1(void)             // Timer 1
{
  TCCR1A &= ~((1<<WGM10)|(1<<WGM11));          // Bytes werden auf Low 
gesetzt
  TCCR1B &= ~((1<<WGM13)|(1<<CS10)|(1<<CS12));
  TCCR1B|=(1<<WGM12)|(1<<CS11);
  TIMSK1 |= (1<<OCIE2A);
  OCR1A=*Melodie[i];
}





/*********************************************************************** 
*******
*
*  Interrupt Service Routine für Timer1
*
************************************************************************ 
******/


ISR(TIMER1_COMPA_vect)
{
  if ((PORTD)&(1<<PD5))

    PORTD&=~(1<<PD5);

    else
      PORTD |=(1<<PD5);
}





/*********************************************************************** 
*******
*
*  Initalisierung von Timer2
*
*
*  Aufgabe: kontrolliert die Tonlänge
*
************************************************************************ 
******/





/*********************************************************************** 
*******
*
*  Interrupt Service Routine für Timer2
*
************************************************************************ 
******/





/*********************************************************************** 
*******
*
*  Buzzer-Initialisierung
*
*
*  Aufgabe: durch den Buzzer wird die Melodie wiedergegeben
*
************************************************************************ 
******/


void Initialisierung_Buzzer (void)
{
  DDRD |= (1<<PD5);
  PORTD &=~(1<<PD5);
}





/*********************************************************************** 
******
*
*  Tastenabfrage
*
*
*  Aufgabe: überprüft ob eine/mehrere Tasten gedrückt sind
*
************************************************************************ 
*****/


void Tastenabfrage(void)
{
  DDRC &= ~((1<<PC0)|(1<<PC1)|(1<<PC2));           // Bit 0-3 von PORTC 
als Eingänge deklariert
  PORTC |= ((1<<PC0)|(1<<PC1)|(1<<PC2));           // Pull-up 
Widerstände aktiviert
  DDRD  |= (1<<PD7);                    // als Ausgang deklariert
  PORTD &= ~(1<<PD7);

  Key = PINC;

  if(!(Key & (1<<PC2)) && (KeyOld & (1<<PC2))) T1=1;      // S3 gedrückt
  if(!(Key & (1<<PC1)) && (KeyOld & (1<<PC1))) T2=1;      // S2 gedrückt
  if(!(Key & (1<<PC0)) && (KeyOld & (1<<PC0))) T3=1;      // S1 gedrückt

  KeyOld = Key;
}





/*********************************************************************** 
******
*
*  Melodienauswahl
*
*
*  Aufgabe: Melodieauswahl durch 3-Tasten-Kombination
*
************************************************************************ 
*****/


int main(void)

{
  Initialisierung_Buzzer();
  Initialisierung_Timer1();
  //Initialisierung_Timer2();



    while (1)
    {

      if(PINC & ((1<<PC0) & (1<<PC1) & (1<<PC2)))
      {
        Ton=0;
        OCR1A = Whistle[i];
        i++;
      }


      else if(PINC & ((0<<PC0) & (1<<PC1) & (1<<PC2)))
      {
        Ton=0;
        OCR1A = *Melodie[i];
        i=2;
      }



      else if(PINC & ((1<<PC0) & (0<<PC1) & (1<<PC2)))
      {
        Ton=0;
        OCR1A = *Melodie[i];
        i=3;
      }


      else if(PINC & ((0<<PC0) & (0<<PC1) & (1<<PC2)))
      {
        Ton=0;
        OCR1A = *Melodie[i];
        i=4;
      }



      else if(PINC & ((1<<PC0) & (1<<PC1) & (0<<PC2)))
      {
        Ton=0;
        OCR1A = *Melodie[i];
        i=5;
      }


      else if(PINC & ((0<<PC0) & (1<<PC1) & (0<<PC2)))
      {
        Ton=0;
        OCR1A = *Melodie[i];
        i=6;
      }


      else if(PINC & ((1<<PC0) & (0<<PC1) & (0<<PC2)))
      {
        Ton=0;
        OCR1A = *Melodie[i];
        i=7;
      }


      else
      {
        Ton=0;
        OCR1A = *Melodie[8];
      }
   }

   return 0;
}

von ozo (Gast)


Lesenswert?

Der Timer2 fehlt wirklich...

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.