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; }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.