Forum: Mikrocontroller und Digitale Elektronik C Verständnis Problem


von Alexander S. (amper)


Lesenswert?

Hallo Zusammen ,

zuerst einmal ich verwende AVRStudio mit WINAVR.

Jetzt zu meinem Problem ,

ich gebe folgende Befehle ein :

//prototypen:

funktion1{...}
funktion2{...}
funktion3{...}
funktion4{...}
funktion5{...}

//hauptprogramm:

int main(void)
{
funktion1{...};
funktion2{...};
funktion3{...};
funktion4{...};
funktion5{...};
}

allerdings führt er in der simulation nur die erste und die letzte 
Funtion aus.

Gehe ich jetzt aber her und fasse die Funktionen 1 bis 4 zusammen zu 
FunktionX dann wird FunktionX und Funktion5 ausgeführt.
Also folgendermaßen:

//prototypen:

funktionX
{
funktion1{...};
funktion2{...};
funktion3{...};
funktion4{...};
}
funktion5{...};

//hauptprogramm:

int main(void)
{

funktionX{fn1,fn2,fn3,fn4};
funktion5{};
}

Woran liegt das , bitte versuht esso einfach wie möglich zu halten denn 
ich habe erst mit C angefangen und daher noch nicht all zu viel Ahnung.

Danke im vorraus

Alex

von Sven P. (Gast)


Lesenswert?

Das ist kein C-Code! Hinter die Funktionen gehören allerhöchstens runde 
Klammern.

Mal davon abgesehen: Sind die Funktionen leer? Dann sind sie nämlich 
ganz schnell wegoptimiert.

von pcb (Gast)


Lesenswert?

ich fürchte du das hast zu einfach gehalten.
Du sollst schon den originalCode lifern. Oder zumindest nicht so stark 
vereinfachten.

von Alexander S. (amper)


Lesenswert?

hier also der funtionierende Code

/ Include Paths-------------------------------------------------
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>

// Defines------------------------------------------------------
#define t_sample   16e-006
#define t_min_cyc   15.625e-009
#define t_max_cyc       32e-006
#define factor    1.15470054
#define PI          3.14159265
#define twoPI    6.28318531
#define PI_3    1.04719755

// Global Variables---------------------------------------------

short int Setpoint_Speed = 5100;
short int Cycles;
float a_speed;
float f_I;
float m ;
float Setpoint_Volt = 400.00;
float t_act = 0;
float t_sec;


//
FuctionPredefinitions--------------------------------------
void readout(void)
{
  f_I = (Setpoint_Speed/60);
  a_speed = (f_I*twoPI);
  t_sec = (PI_3/a_speed);
  Cycles = (short int)(t_sec/(t_sample*2));
  m = (Setpoint_Volt/690);
}

void vector(float a_speed, float t_sec)
{
    float ta = 0;
    float tb = 0;
    float t0 = 0;
    float t7 = 0;
    ta = factor*m*t_sample*(sin(PI_3-(a_speed*t_act)));
    tb = factor*m*t_sample*(sin(a_speed*t_act));
    t0 = t7 = (t_sample-(ta+tb))/4;

    OCR0RB = OCR1RB = OCR2RB = 1023;
    OCR0SA = 1023   - (short int)(t0/t_min_cyc);
    OCR0SB = OCR0SA + 40;
    OCR1SA = OCR0SA - (short int)(ta/t_min_cyc);
    OCR1SB = OCR1SA + 40;
    OCR2SA = OCR1SA - (short int)(tb/t_min_cyc);
    OCR2SB = OCR2SA + 40;
}


void ini_PSC(void)
{
...
}




// Main----------------------------------------------

int main(void)
{
  PLLCSR = (1<<PLLF)|(1<<PLLE)|(1<<PLOCK);
  ini_PSC();
  sei();
  readout();
  vector(a_speed, t_sec);
}

gehe ich jetz aber her und mache die Funktionen die in "readout" stehen 
als
einzel Funktionen dann funktioniert da ganze nicht.

Danke

Gruß Alex

von Karl H. (kbuchegg)


Lesenswert?

Alexander S. wrote:

> gehe ich jetz aber her und mache die Funktionen die in "readout" stehen
> als
> einzel Funktionen dann funktioniert da ganze nicht.

Hmm. Ich sehe in readout keine Funktionsaufrufe. Da sind nur
ganz normale Anweisungen enthalten.

Daher die Gegenprobe: Kannst du den Code mal so umändern, dass
er nicht mehr funktioniert und das ebenfalls posten.

von Stefan E. (sternst)


Lesenswert?

Bitte poste den Code, der nicht funktioniert. Wie sollen wir sonst 
herausfinden, was da schief läuft?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Welche "Funktionen" in Readout? Da sind keine. Poste doch mal Deine 
Version mit "Einzelfunktionen".

Zur besseren Lesbarkeit bitte den C-Quelltext zwischen
[С] und [/С] schreiben, dann wird aus


  [С]
  int funktion()
  {
    a = 1;
    return a;
  }
  [/С]

sowas:
1
int funktion()
2
{
3
  a = 1;
4
  return a;
5
}

von Alexander S. (amper)


Lesenswert?

In dieser Form, überspringt er mir die Aufrüfe zwischen "sei" und 
"vector"

/ Include Paths-------------------------------------------------
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>

// Defines------------------------------------------------------
#define t_sample   16e-006
#define t_min_cyc   15.625e-009
#define t_max_cyc       32e-006
#define factor    1.1547005#define PI          3.14159265
#define twoPI    6.28318531
#define PI_3    1.04719755

// Global Variables---------------------------------------------

short int Setpoint_Speed = 5100;
short int Cycles;
float a_speed;
float f_I;
float m ;
float Setpoint_Volt = 400.00;
float t_act = 0;
float t_sec;


//
FuctionPredefinitions--------------------------------------

void Current_freq(Short int Setpiont_Speed)
{
  f_I = (Setpoint_Speed/60);
{


void Angle_speed(float f_I)
{
  a_speed = (f_I*twoPI);
}


void Sectortime(float a_speed)
{
  t_sec = (PI_3/a_speed);
}


void Cycles(float t_sec)
{
  Cycles = (short int)(t_sec/(t_sample*2));
}


void Modulationindex(float Setpoint_Volt)
{
  m = (Setpoint_Volt/690);
}



void vector(float a_speed, float t_sec)
{
    float ta = 0;
    float tb = 0;
    float t0 = 0;
    float t7 = 0;
    ta = factor*m*t_sample*(sin(PI_3-(a_speed*t_act)));
    tb = factor*m*t_sample*(sin(a_speed*t_act));
    t0 = t7 = (t_sample-(ta+tb))/4;

    OCR0RB = OCR1RB = OCR2RB = 1023;
    OCR0SA = 1023   - (short int)(t0/t_min_cyc);
    OCR0SB = OCR0SA + 40;
    OCR1SA = OCR0SA - (short int)(ta/t_min_cyc);
    OCR1SB = OCR1SA + 40;
    OCR2SA = OCR1SA - (short int)(tb/t_min_cyc);
    OCR2SB = OCR2SA + 40;
}


void ini_PSC(void)
{
...
}




// Main----------------------------------------------

int main(void)
{
  PLLCSR = (1<<PLLF)|(1<<PLLE)|(1<<PLOCK);
  ini_PSC();
  sei();
  Current_freq(Setpiont_Speed);
  Angle_speed(f_I);
  Sectortime(a_speed);
  Cycles(t_sec);
  Modulationindex(Setpoint_Volt);
  vector(a_speed, t_sec);
}

von Stefan E. (sternst)


Lesenswert?

Du hast vermutlich den Optimizer aktiviert, und der hat die Funktionen 
"geinlined".
Achte mal in der Simulation auf die globalen Variablen. Die 
entsprechenden Anweisungen werden sicher ausgeführt, aber eben nicht in 
einer separaten Funktion, sondern direkt dort, wo der Aufruf der 
Funktion steht.

von Alexander S. (amper)


Lesenswert?

Wenn es so wäre würde er doch nicht dreimal 0000 in die OCRn-Register 
schreiben. Da er ja dann eine Berechnung durchführt, oder ist das ein 
irr glauben ?

Gruß Alex

von holger (Gast)


Lesenswert?

float a_speed; // Globale Variable

void vector(float a_speed, ... // Parameter

Hmm, welche von den beiden nimmt der Compiler denn da ?

von Alexander S. (amper)


Lesenswert?

Also verwendet der Complier den einfacher zu verarbeitenden wert der in 
meinem fall logischer weise di globale Variable ist !?

Gruß Alex

von Karl H. (kbuchegg)


Lesenswert?

holger wrote:
> float a_speed; // Globale Variable
>
> void vector(float a_speed, ... // Parameter
>
> Hmm, welche von den beiden nimmt der Compiler denn da ?

Immer von innen nach aussen.
Wenn es im innersten Block keine Variable mit diesem Namen gibt,
dann wird der nächst äussere Blick untersucht, bis ganz
zum Schluß die globalen Variablen zu Zug kommen.

Allerdings ist es programmier-taktisch nicht sehr klug
funktionslokale Variablen den gleichen Namen wie globalen
Variablen zu geben. Das führt auf lange Sicht immer zu
Verwirrungen.

@Alexander:
Hast du dir die globalen Variablen schon mal angesehen?
Es gibt keinen Grund warum die Funktionen nicht aufgerufen
werden sollten, ausser der Optimizer hat sie geinlined, wie
Stefan schon angemerkt hat. Aber auch dann müssten die
globalen Variablen die richtigen Werte annehmen.


PS: Das

void Cycles(float t_sec)
{
  Cycles = (short int)(t_sec/(t_sample*2));
}

ist auch nicht sehr schlau. Gewöhn dir an, den Dingen eindeutige
Namen zu geben. Eine Funktion die Cycles heist und eine Variable
die Cycles heist ist nicht besonders schlau. Sowas führt praktisch
immer zu Misverständnissen und Verwirrungen im Laufe der Programmierung.

von Stefan E. (sternst)


Lesenswert?

holger wrote:
> float a_speed; // Globale Variable
>
> void vector(float a_speed, ... // Parameter
>
> Hmm, welche von den beiden nimmt der Compiler denn da ?

Na, beide natürlich. ;-)

Nein, er nimmt in der Funktion natürlich den Parameter, aber der hat 
durch den Funktionsaufruf ja den Wert der globalen Variable.

von Stefan E. (sternst)


Lesenswert?

Alexander S. wrote:
> Wenn es so wäre würde er doch nicht dreimal 0000 in die OCRn-Register
> schreiben. Da er ja dann eine Berechnung durchführt, oder ist das ein
> irr glauben ?

Wie jetzt, ist das eine theoretische Überlegung, oder werden die 
Register bei deinem Beispiel mit falschen Werten gefüllt?

von Alexander S. (amper)


Lesenswert?

Nein, in der funktionierenden version stimmen die die Werte (bis auf 
Rundungsfehler), nur in der version die nicht funktioniert werden 0x0000 
in alle register geschrieben.
Ich bin halt davon ausgegangen, daß er die einzelfunktion nicht ausführt 
und deswegen die Nullwerte der Globalen Variablen zum multiplizieren 
verwendet.

Gruß Alex

von HildeK (Gast)


Lesenswert?

Autor: Alexander S. (amper)
Datum: 25.04.2008 20:35
schrieb:

>void Current_freq(Short int Setpiont_Speed)
>{
>  f_I = (Setpoint_Speed/60);
>{

^^^
Eigentlich müsste das ja der Compiler schon mit Error belegen: Die 
letzte Klammer hat die falsche Richtung.
Kann es das nicht sein? Der Aufruf von Curren_freq ist der erste, der 
nicht mehr funktioniert.

Oder hast du hier nur falsch gepostet?

von Stefan E. (sternst)


Lesenswert?

Und das ist ja wohl auch alles andere als koscher:

> #define factor    1.1547005#define PI          3.14159265

Bitte poste nochmal genau den Code, der zwar ohne Fehler compiliert, 
aber die Register falsch füllt.

von Alexander S. (amper)


Angehängte Dateien:

Lesenswert?

Guten morgen zusammen,

hier einmal zuesrt der code der soweit mal funktioniert.

von Alexander S. (amper)


Lesenswert?

Sorry leute,

ich muß wohl gestern irgendwo eine fehl eingabe gemacht haben denn ich 
habe es gerade noch mal "falsch" geschrieben allerdings hat es 
funktioniert.

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.