Forum: Mikrocontroller und Digitale Elektronik AVR, C-Code Funktion aufrufen


von Andre P. (andrep)


Lesenswert?

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;
};

von Markus M. (mark_m)


Lesenswert?

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

von pichnicker (Gast)


Lesenswert?

Ds = (unsigned int)Bs*(4/Dn);
dürfte beim zweiten Aufruf Null werden, wodurch die Schleife am Ende der 
Funktion nicht durchlaufen wird.

von Andre P. (andrep)


Lesenswert?

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
Noch kein Account? Hier anmelden.