Hallo, ich bin im Programmieren ein ziemlicher Anfänger und soll für die Schule mit CodeVision AVR ein Programm schreiben, das Lieder im RTTTL-Format abspielen kann. So weit so gut, ich habe mir auf ziemlich primitve Weise ein Programm geschrieben, wo ich die Töne "relativ einfach" eingeben kann. Diese möchte ich dann über einen Summer auf einem Bord mit einem ATmega168 ausgeben. Über die Funktion "Tonabspielen(;;)" möchte ich die Töne auf Frequenzen konvertieren und ausgeben. Jedoch klappt irgendetwas nicht. Die 1. Funktion wird aufgerufen, die 2. jedoch nicht. Könnt Ihr mir helfen? MfG Andrep P.S.: mein Code: #include <mega168.h> #include <delay.h> #include <stdlib.h> #define Summer PORTB.1 #define c1 7034 #define cis1 6653 #define d1 6268 #define dis1 5925 #define e1 5584 #define f1 5280 #define fis1 4980 #define g1 4701 #define gis1 4440 #define a1 4188 #define ais1 3954 #define h1 3730 #define c2 3523 #define cis2 3326 #define d2 3139 #define dis2 2962 #define e2 2795 #define f2 2639 #define fis2 2489 #define g2 2350 #define gis2 2219 #define a2 2093 #define ais2 1976 #define h2 1864 #define c3 1759 #define cis3 1661 #define d3 1567 #define dis3 1479 #define e3 1396 #define f3 1318 #define fis3 1244 #define g3 1174 #define gis3 1108 #define a3 1046 #define ais3 987 #define h3 932 //int x = 1; //Nummer von Lied (noch nicht benötigt) int o = 0; //Oktavennummer float T = 0; //Standartwert der Tonlänge 8.=5,33333 //4.=2,66666 int P = 0; //Geschwindigkeit von Lied int Ds = 0; //Zeit für Standartwert in ms long Bs = 0; //Zeit einer Viertelnote in ms int Dn = 0; //Tonlänge aktuell int on = 0; //Tonoktave aktuell int h = 0; //Tonhöhe aktuell int i = 0; //Zähler für Tonlänge int c = 0; //Beginn: Definition der Tonleiter int cis = 0; int d = 0; int dis = 0; int e = 0; int f = 0; int fis = 0; int G = 0; int gis = 0; int a = 0; int ais = 0; int b = 0; //Ende: Definition der Tonleiter void Tonabspielen(float,int,int); void main(void) { // Port C initialization DDRC=0x00; PORTC=0x02; //Taste // Port B initialization DDRB = 0x00; //Summer aus TCCR1A=0x40; TCCR1B=0x09; OCR1AH=0x00; OCR1AL=0x00; while (1) { if(!PINC.1 == 1) { //Beginn: Optional:Lied auswählen T = 4; o = 5; P = 160; //Ende: Opitonal: Lied auswählen //Beginn: Definition der Standardwerte für gewähltes Lied if(on == 4) //Werte für 4.Oktave festlegen { c = c1; cis = cis1; d = d1; dis = dis1; e = e1; f = f1; fis = fis1; G = g1; gis = gis1; a = a1; ais = ais1; b = h1; } if(on == 5) //Werte für 5.Oktave festlegen { c = c2; cis = cis2; d = d2; dis = dis2; e = e2; f = f2; fis = fis2; G = g2; gis = gis2; a = a2; ais = ais2; b = h2; } if(on == 6) //Werte für 6.Oktave festlegen { c = c3; cis = cis3; d = d3; dis = dis3; e = e3; f = f3; fis = fis3; G = g3; gis = gis3; a = a3; ais = ais3; b = h3; } Bs = (unsigned long)P/60*250; //Bs=P//60*0,25*1000 //Bs(160)=666.666 Ds = Bs*(4/Dn); //Ende: Definition der Standardwerte für gewähltes Lied //Beginn: Lied abspielen Tonabspielen(T,fis,o); Tonabspielen(5.333,a,o); Tonabspielen(8,fis,o); Tonabspielen(16,fis,o); Tonabspielen(8,ais,o); Tonabspielen(8,fis,o); Tonabspielen(8,e,o); Tonabspielen(T,fis,o); Tonabspielen(5.333,c,6); Tonabspielen(8,fis,o); Tonabspielen(16,fis,o); Tonabspielen(8,d,6); Tonabspielen(8,cis,6); Tonabspielen(8,a,o); Tonabspielen(8,fis,o); Tonabspielen(8,cis,6); Tonabspielen(16,fis,o); Tonabspielen(8,e,o); Tonabspielen(16,e,o); Tonabspielen(8,cis,o); Tonabspielen(8,gis,o); Tonabspielen(2.666,fis,o); //Ende: Lied abspielen } else { } } } void Tonabspielen(float Df,int H,int of) { Dn = Df; h = H; on = of; Ds = (unsigned int)Bs*(4/Dn); if(on == 4) { c = c1; cis = cis1; d = d1; dis = dis1; e = e1; f = f1; fis = fis1; G = g1; gis = gis1; a = a1; ais = ais1; b = h1; } if(on == 5) { c = c2; cis = cis2; d = d2; dis = dis2; e = e2; f = f2; fis = fis2; G = g2; gis = gis2; a = a2; ais = ais2; b = h2; } if(on == 6) { c = c3; cis = cis3; d = d3; dis = dis3; e = e3; f = f3; fis = fis3; G = g3; gis = gis3; a = a3; ais = ais3; b = h3; } OCR1AH = h >>8; OCR1AL = h & 0xFF; DDRB = 0x02; for(i = 0;i<Ds;i++) { delay_ms(1); } DDRB = 0x00; };
Tip an den Anfänger: Das lesen eine C-Buch ist keine vergeudete Zeit. Du initialisierst die Variablen c bis b vor dem Aufruf von Tonabspielen(). Innerhalb der Procedere auch noch mal. Wo liegt da der Sinn? Grüsse
Ds = (unsigned int)Bs*(4/Dn); dürfte beim zweiten Aufruf Null werden, wodurch die Schleife am Ende der Funktion nicht durchlaufen wird.
Markus M.: Mhm wohl ein kleiner Denkfehler :) pichnicker: Danke für den Tipp, eine Idee wie ich das umgehen könnte? Lg
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.