mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Melodiengenerator


Autor: Andi (Gast)
Datum:

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

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Timer2 fehlt wirklich...

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.