www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ich brauche hilfe beim c programmierung!!


Autor: med (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo leute,

Ich versuche gerade ein c programm  im CCS Compiler zu schreiben um dem 
Mittelwert eine Schwingungs signal zu brechnen.Ich arbeite mit dem 
Pic18F2026 und benutze ein CCS compiler, dennoch sollte ich den Programm 
so erweitern so dass man die Amplitude des Signals im bezug auf 
Mittelwert auch berechnen kann .
Das Programm schreibe ich neu.Es geht darum einen C Programm zu 
schreiben zur Abtastung ein 100 Hz Signal.Das Programm soll zum beispiel 
100 werte einlesen ,dann den Mittelwert geben und dann die Amplitude im 
Bezug auf dem Mittelwert zu berechnen.

Das programm muss ich danach im CCS Compiler schreiben und dann über den 
Pic 18F2620 einspielen. Der Pic ist mit eienem Sensor verbunden , durch 
schütteln der Sensor soll er zum beispiel 100 werte ausgeben , den der 
Mittelwert berechnen, als auch die Amplitude.

Ich bin gerade ein Anfänger und brauche dringend ein C Code Programm
MFG
Med

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Teil des Programms kriegst du selbst hin
und bei welchem Teil, konkret, hast du Probleme?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es sich tatsächlich immer um ein Sinus-Signal handelt, wäre es doch 
besser mittels Spitzenwertgleichrichtung diesen zu erfassen, und daraus 
den Mittelwert zu rechnen. Das würde zwar etwas Hardware bedeuten ist 
aber bzgl. der Erfassung dann wiederum einfacher.

Ich habe das Gefühl, dass Du einen fertigen Code suchst ! Dann bleibst 
Du aber immer Anfänger ! Mach Dir doch zuerst mal Gedanken darüber, mit 
welcher Abtastrate Du mindestens Abtasten must (Shannon) und danach wie 
die Mittelwertbildung in Psuedo-Code bzw. im Ablaufdiagramm aussehen 
müsste. Die Amplitudenberechnung ist auch interessant, da hier z.B. ein 
Faktor z.B. *1.414 ins Spiel kommt.

Dein Problem hört sich nach einer Hausaufgabe (Schule, Studium) an. 
Diese solltest Du besser selbst lösen. Hier kannst Du nur Tipps 
erwarten.

Autor: med (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Gefühl, dass Du einen fertigen Code suchst ! Dann bleibst
Du aber immer Anfänger ! Mach Dir doch zuerst mal Gedanken darüber, mit
welcher Abtastrate Du mindestens Abtasten must (Shannon) und danach wie
die Mittelwertbildung in Psuedo-Code bzw. im Ablaufdiagramm aussehen
müsste. Die Amplitudenberechnung ist auch interessant, da hier z.B. ein
Faktor z.B. *1.414 ins Spiel kommt.

Dein Problem hört sich nach einer Hausaufgabe (Schule, Studium) an.
Diese solltest Du besser selbst lösen. Hier kannst Du nur Tipps
erwarten.

Es handelt es sich um ein Projekt!!Fertige Programme halt ich nichts 
davon !! nur dass ich zum erstmal mit einem Pic programmierung 
zusammensetze  , und das ist nicht einfach!!

Abtastrate habe ich mich 500us ausgesucht damit kriege ich mindestens 20 
Abtastpunkte pro Periode bei einem 100Hz frequenz!!

Autor: med (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Teil des Programms kriegst du selbst hin
und bei welchem Teil, konkret, hast du Probleme?

Mittelwertbildung habe ich schon geschafft, das Problem ist das Min Max 
bei einem Amplitudenberchnung , der Compiler schmeißt er mir immer 
irgendwelche werte!!

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da es sich C-Code handelt, ist es uninteressant ob du zum ersten mal mit 
einem PIC arbeitest. Der gleiche C-Code auf einem PC würde den gleichen 
Müll herauswerfen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
med wrote:
> Welchen Teil des Programms kriegst du selbst hin
> und bei welchem Teil, konkret, hast du Probleme?
>
> Mittelwertbildung habe ich schon geschafft, das Problem ist das Min Max
> bei einem Amplitudenberchnung , der Compiler schmeißt er mir immer
> irgendwelche werte!!

Wo liegt das Problem?
Die Funktion ist doch eigentlich ziemlich einfach, wenn du
die Werte mal in einem Array hast
   Min = Array[0];
   Max = Array[0];

   for( i = 1; i < 100; ++i ) {
     if( Array[i] < Min )
       Min = Array[i];

     if( Array[i] > Max )
       Max = Array[i];
   }

Also einfach mal annehmen das erste Array Element wäre das
Minimum bzw. Maximum. Danach alle anderen Array Elemente
durchgehen und nachsehen, ob sie nicht vielleicht doch kleiner
sind als das bisherige Minimum. Wenn ja, dann kann das bisherige
Minimum offensichtlich nicht das wahre sein, sondern es gibt ein
neues Minimum. Ist man durch das Array durch, so hat man den
kleinsten Wert gefunden, welcher dann das Minimum der Werte im
Array darstellt.
Selbiges sinngemäß für Maximum und der Größer-Beziehung.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
med wrote:
> der Compiler schmeißt er mir immer irgendwelche werte!!

Der Compiler schmeißt Dir irgendwelche Werte?!
Oder war's der Linker, oder vielleicht doch der Editor?

Autor: med (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
an kbuchegg,

Vielen dank  für den Antwort,
Ich probiere es gerade!!

Autor: med (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
an severino,

ich glaube der Compiler(debugger)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>> der Compiler schmeißt er mir immer irgendwelche werte!!
>>
>> Der Compiler schmeißt Dir irgendwelche Werte?!
>> Oder war's der Linker, oder vielleicht doch der Editor?

> ich glaube der Compiler(debugger)

Na, dann musst du in Deckung gehen. Nicht dass er dich noch
erwischt!

(Sorry, aber das war ein Aufgelegter. Ich hätte nicht schlafen
können, wenn ich den ausgelassen hätte)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich brauche hilfe beim c programmierung!!

Du brauchst auch ganz dringend Nachhilfe in Grammatik.

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> der Compiler schmeißt er mir immer irgendwelche werte!!

Diesen Satz bitte einmal langsam auf der Zunge zergehen lassen.
Was will uns diese willkürliche Kombination von Worten und Buchstaben 
eigentlich sagen?

Zugegeben, das mit den Pronomen ist schwer...
>>ich den Programm  [ ] nein, falsch.
>>einen C Programm  [ ] leider auch noch nicht richtig.
>>Das Programm      [x] Treffer, am Ende hat es geklappt!

Es ist eine ganz schlechte Idee, mit einer Fremdsprache (c) anzufangen, 
bevor man die Muttersprache kennt!

Jochen Müller

Autor: med (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja

gemein seid ihr aufjedemfall zur Anfänger !
Ich habe es ausprobiert Min umd Max stimmen  immer  noch nicht!!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jochen Müller wrote:
> Es ist eine ganz schlechte Idee, mit einer Fremdsprache (c) anzufangen,
> bevor man die Muttersprache kennt!
Woher weißt Du Schlaumeier eigentlich, dass deutsch seine/ihre 
Muttersprache ist? Ich schätze mal, dem ist eher nicht so! Und Leute wie 
Du sollten hier einfach mal den Rand halten, wenn sie nur 
unqualifiziertes Zeug von sich zu geben haben (gleiches gilt 
selbstverständlich auch für den "gast" von 18:36)!

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

> Ich habe es ausprobiert Min umd Max stimmen  immer  noch nicht!!
Zeig uns bitte Deinen Code; sonst wird es nur ein Ratespiel.

Gruß

Fred

Autor: med (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void main()
{
   int16 value[],mittel,min,max;
   unsigned int16 sum;
   int i ;


   setup_adc_ports(AN0_TO_AN1|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_4|ADC_TAD_MUL_16);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

    while(1)
    {
    if(input(pin_b1)==1)
{

   for(i=0;i<1;i++)
   {
     set_adc_channel(1);

   for (i=0;i<100;i++)
    {
        value[i]=read_adc();
        delay_us(500);
    }
   sum=0;

   for(i=0;i<100;i++)
    {
    sum=sum+value[i];
    }

    mittel=sum/100;



   min=value[0];
   max=value[0];

   for(i=0;i<100;i++)
      {

    if (value[i]>max)
     {
      max=value[i];
     }

    if(value[i]<min)
       {
      min=value[i];
       }

     for(i=0;i<100;i++)
     {
     printf("%Li\n", value[i]);
     }

     }
     printf("mittelwert %li\n", mittel);
     printf("min %Li\n", min);
     printf("max %Li\n", max);
     printf("Summe %Lu\n", sum);
    }

    }
   }
}


Ausgabe lautet:

520
521
520
520
521
521
521
522
523
522
523
522
522
524
523
522
523
523
523
524
524
524
522
524
524
525
525
527
526
526
526
523
527
528
527
527
528
528
528
528
528
528
530
529
529
530
529
529
530
529
531
530
530
530
531
531
534
531
531
531
531
531
533
532
533
533
533
532
533
533
533
534
533
534
534
534
534
534
537
534
535
536
535
534
535
532
535
536
535
536
536
533
536
535
535
535
538
536
535
536
mittelwert 529
min 520
max 520
Summe 52927

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Du druckst momentan die "Ergebnisse" bei jedem Durchlauf der 
min/max-Such-Schleife aus. Stelle die Ausgabe so um, dass die 
Suchschleife zunächst vollständig durchlaufen wird; dann kommt auch das 
raus, was Du möchstest.

Gruß

Fred

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei der Maximalwertberechnung und Ausgabe stimmt etwas mit den Klammern 
nicht! Bitte formatiere den Code mal und mache die Einrückungen richtig, 
so dass zusammengehörende Klammern untereinander stehen. Dann müsstest 
Du sehen, dass die erste der beiden for-Schleifen keine schließende 
Klammer hat (zumindest nicht an der richtigen Stelle)...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
med wrote:
> void main()
> {
>    int16 value[],

Warum sagst du deinem Compiler nicht, dass du ein
Array mit 100 Einträgen haben willst?

     int16 value[100],mittel,min,max;

Das musst du schon machen, woher soll der Compiler sonst
wissen wieviel Speicher er dafür reservieren soll?

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Schleife ist falsch verschachtelt.
Du machst mit der Ausgabe unten den Schleifenzähler von oben kaputt!

Jochen Müller



   for(i=0;i<100;i++)
      {

    if (value[i]>max)
     {
      max=value[i];
     }

    if(value[i]<min)
       {
      min=value[i];
       }

     for(i=0;i<100;i++)
     {
     printf("%Li\n", value[i]);
     }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und dann solltest du dir nochmal Gedanken darüber machen,
was wohl passieren wird, wenn all deine Schleifenvariablen
immer i heissen.

Vor allen Dingen in Fällen, wie diesem:
  for( i = 0; i < 100; ++i ) {

    ...
    for( i = 0; i < 100; ++i ) {

      ...
    }
  }

Die ausserste Schleife wird nur einmal durchlaufen, nicht
100 mal. Denn beim ersten Schleifendurchlauf wird das i
von der inneren Schleife bis auf 100 hochgezählt, wodurch
die Abbruchbedingung für die äussere Schleife ebenfalls
erfüllt ist.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke das ist das Problem:

   for(i=0;i<100;i++)
      {

     for(i=0;i<100;i++)
     {
     }

     }

Die zweite i Schleife bricht die erste ab.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So könnte das aussehen
#define NR_VALUES 100

void main()
{
  int16 value[NR_VALUES],mittel,min,max;
  unsigned int16 sum;
  int i;

  setup_adc_ports(AN0_TO_AN1|VSS_VDD);
  setup_adc(ADC_CLOCK_DIV_4|ADC_TAD_MUL_16);
  setup_spi(SPI_SS_DISABLED);
  setup_wdt(WDT_OFF);
  setup_timer_0(RTCC_INTERNAL);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);

  while( 1 )
  {
    if( input( pin_b1 ) == 1 )
    {
      // vom Kanal 1 mal die Messewerte einlesen
      set_adc_channel( 1 );
      for( i = 0; i < NR_VALUES; i++ )
      {
        value[i] = read_adc();
        delay_us( 500 );
      }

      // Mittelwert berechnen:
      // Zuerst die Summe aller Messwerte bestimmen
      // und durch die Anzahl der Messwerte dividieren
      sum = 0;
      for( i = 0; i < NR_VALUES; i++ )
        sum = sum + value[i];
      mittel = sum / NR_VALUES;

      // Minimum und Maximum bestimmen
      //   Annahme: in value[0] steht bereits der kleinste
      //   bzw. grösste Wert
      min = value[0];
      max = value[0];

      //   jetzt die Annahme überprüfen, ob nicht doch einer
      //   der anderen Werte kleiner oder grösser ist
      for( i = 0; i < NR_VALUES; i++ )
      {
        if( value[i] > max )
          max = value[i];

        if( value[i] < min )
          min = value[i];
      }

      // das wars: die Ergebnisse ausgeben
      for( i = 0; i < NR_VALUES; i++ )
        printf("%Li\n", value[i]);

      printf( "mittelwert %li\n", mittel );
      printf( "min %Li\n", min );
      printf( "max %Li\n", max );
      printf( "Summe %Lu\n", sum );
    }
  }
}

Macht doch gleich einen Unterschied, wenn das ganze vernünftig
formatiert und eingerückt ist. Dann findet man auch solche
Fehler viel leichter.

Mit ein paar Funktionen wirds allerdings noch einfacher
zu durchschauen
#define NR_VALUES 100

int16 value[NR_VALUES];
int16 mittel
int16 min, max;

void SetupHardware()
{
  setup_adc_ports(AN0_TO_AN1|VSS_VDD);
  setup_adc(ADC_CLOCK_DIV_4|ADC_TAD_MUL_16);
  setup_spi(SPI_SS_DISABLED);
  setup_wdt(WDT_OFF);
  setup_timer_0(RTCC_INTERNAL);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);
}

void ReadValues()
{
  int16 i;

  // vom Kanal 1 mal die Messewerte einlesen
  set_adc_channel( 1 );
  for( i = 0; i < NR_VALUES; i++ )
  {
    value[i] = read_adc();
    delay_us( 500 );
  }
}

void BerechneMittel()
{
  unsigned int16 sum;
  int16 i;

  // Mittelwert berechnen:
  // Zuerst die Summe aller Messwerte bestimmen
  // und durch die Anzahl der Messwerte dividieren
  sum = 0;
  for( i = 0; i < NR_VALUES; i++ )
    sum = sum + value[i];
  mittel = sum / NR_VALUES;
}

void BerechneMinMax()
{
  int16 i;

  // Minimum und Maximum bestimmen
  //   Annahme: in value[0] steht bereits der kleinste
  //   bzw. grösste Wert
  min = value[0];
  max = value[0];

  //   jetzt die Annahme überprüfen, ob nicht doch einer
  //   der anderen Werte kleiner oder grösser ist
  for( i = 0; i < NR_VALUES; i++ )
  {
    if( value[i] > max )
      max = value[i];

    if( value[i] < min )
      min = value[i];
  }
}

void PrintErgebnisse()
{
  int16 i;

  // das wars: die Ergebnisse ausgeben
  for( i = 0; i < NR_VALUES; i++ )
    printf("%Li\n", value[i]);

  printf( "mittelwert %li\n", mittel );
  printf( "min %Li\n", min );
  printf( "max %Li\n", max );
  printf( "Summe %Lu\n", sum );
}

void main()
{

  int i;

  SetupHardware();

  while( 1 )
  {
    if( input( pin_b1 ) == 1 )
    {
      ReadValues();
      BerechneMittel();
      BerechneMinMax();

      PrintErgebnisse();
    }
  }
}

Schau wie einfach dadurch das Hauptprogramm wird. Es ist unmittelbar
zu sehen, dass da kein Logikfehler mehr drinnen sein kann.
AUch die einzelnen Funktionen sind einfach genug, dass man auf
Anhieb sieht, dass da kein Logikfehler enthalten sein kann.

Autor: med (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank an alle,
Es hat endlich funktionniert!! Problem lag an der Struktur ,die erste 
ausgabe hat die Min Max suche verhindert

und besondere Dank an kbuchegg  ,das programm was sie geschrieben haben 
ist sehr klar und ausführlich!!

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>und besondere Dank an kbuchegg  ,
das programm was sie geschrieben haben ist sehr klar und ausführlich!!

Ja, sicher.
Aber helfen würde es dem Jungen sicher mehr, wenn er seine Fehler SELBST 
findet und keine fertige Schonkost VORGEKAUT bekommt, so gut das auch 
gemeint sein wird.

Und der Fehler IN DIESEM FALL war so simpel, dass er ihn auch ganz ohne 
Forum gefunden hätte, wenn er das als SELBSTVERSTÄNDLICH zu erwartende 
Minimum an Aufmerksamkeit und Sorgfalt aufgewendet hätte.

Fertige Häppchen zum Abtippen helfen da ganz sicher nicht!

Jochen Müller

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jochen Müller wrote:

> Fertige Häppchen zum Abtippen helfen da ganz sicher nicht!

Ab und zu muss man dem Nachwuchs auch mal konkret zeigen, wie
man es besser machen kann.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Sorry, aber das war ein Aufgelegter. Ich hätte nicht schlafen
> können, wenn ich den ausgelassen hätte
> Ab und zu muss man dem Nachwuchs auch mal konkret zeigen, wie
> man es besser machen kann.

Einen hätt' ich dann auch noch...
Was passiert wohl in BerechneMittel, wenn NR_VALUES höher gesetzt wird 
oder die ADC-Ergebnisse z.B. um 700 herum liegen?

Autor: <!-- --> (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ja, sicher.
>Aber helfen würde es dem Jungen sicher mehr, wenn er seine Fehler SELBST
>findet und keine fertige Schonkost VORGEKAUT bekommt, so gut das auch
>gemeint sein wird.

darum geht es doch gar nicht. kbuchegg freut sich über solche anfänger, 
je unselbstständiger, desto besser, dann fragen sie wenigstens nix, 
wofür kbuchegg länger als eine stunde recherchieren muss. und eine 
stunde, selbstlos für andere verschwendet, ist durchaus angemessen, 
damit er sein unvorstellbares können unter beweis stellen kann!

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>damit er sein unvorstellbares können unter beweis stellen kann!

Obiger Kommentar ist mal wieder ein Argument für die "Gast-Postings 
verbieten" Fraktion.

Die Beiträge von Karl heinz Buchegger gehören zu den wenigen in diesem 
Forum, aus denen man etwas lernen kann. Man sollte daher für seine 
Hilfsbereitschaft dankbar sein. Ob es wirklich sinnvoll ist, anderen 
Leuten komplette Hausaufgaben oder Teile ihrer Diplomarbeit hier 
vorzukauen ist ein anderes Thema.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
gäbe es noch eine netten Weg die globalen Variablen zu vermeiden? Weil 
die sind ja in C etwas verpönt. Ich habe leider noch keinen Weg gefunden 
sowas elegant zu lösen. (Das mehere Funktionen auf die gleichen Daten 
zugreifen)

Autor: Martin L. (melvin_the_moose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datenkapselung in ANSI-C kann man erreichen, indem man zu kapselnde 
Daten in einer C-Datei static definiert.
Z.B. am Dateianfang:
static int16 value[NR_VALUES];
static int16 mittel
static int16 min, max;
Als Schnittstelle kann man je eine get- und/oder set-Funktion 
implementieren (oder es lassen, wenn der Zugriff nur innerhalb des 
Moduls erfolgen soll).

Gruß

Martin

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ob es wirklich sinnvoll ist, anderen Leuten komplette
> Hausaufgaben oder Teile ihrer Diplomarbeit hier
> vorzukauen ist ein anderes Thema.

Mein erster Gedanke beim Lesen der Überschrift.....

"Bis hierher konnte ich mich so durchmogeln"

Gruss Otto

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<!-- --> wrote:

> darum geht es doch gar nicht. kbuchegg freut sich über solche anfänger,
> je unselbstständiger, desto besser, dann fragen sie wenigstens nix,
> wofür kbuchegg länger als eine stunde recherchieren muss. und eine
> stunde, selbstlos für andere verschwendet, ist durchaus angemessen,
> damit er sein unvorstellbares können unter beweis stellen kann!

Ja natürlich, es gibt immer wieder einen, der alles mies machen muß.

kbuchegg ist ja nicht erst seit gestern hier.
Ich halte ihn durchaus für fähig, selber abschätzen zu können, wieviel 
Aufwand er in eine Antwort steckt.

Hier sind keine Antwortmaschinen am Werk.
Wenns einem Spaß macht, kann ne Antwort durchaus mal ausführlicher sein.


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter wrote:
> Hallo,
> gäbe es noch eine netten Weg die globalen Variablen zu vermeiden? Weil
> die sind ja in C etwas verpönt. Ich habe leider noch keinen Weg gefunden
> sowas elegant zu lösen. (Das mehere Funktionen auf die gleichen Daten
> zugreifen)

Wenn du globale Variablen vermeiden willst, dann führt dich der
Weg zu Funktionsargumenten bzw. Returnvalues.
Ein oder mehrere Werte wird an eine Funktion (in Form von
Argumenten) übergeben. Damit hat die Funktion alles was sie braucht
um ihre Berechnungen anstellen zu können. Um das Ergebnis dieser
Berechnung zurück zum Aufrufer zu bringen, gibt es 2 Möglichkeiten.
Handelt es sich um einen Wert, dann kann man dafür den Return Wert
der Funktion benutzen. Hat man mehrere Ergebnisse, dann wird dafür
meist nicht der Return Wert benutzt, sondern der Rückfluß findet
ebenfalls über die Argumentschnittstelle der Funktion statt.

Hier verweise ich dich aber an dein C-Buch. Das jetzt im Detail
mit allen Feinheiten auszuführen würde zu weit führen. Das
Beispiel abgewandelt und auf die Mittlewertsfunktion angewendet,
würde so aussehen:
unsigned int16 BerechneMittel( int werte[], int AnzahlWerte )
{
  unsigned int16 sum;
  int16 i;

  // Mittelwert berechnen:
  // Zuerst die Summe aller Messwerte bestimmen
  // und durch die Anzahl der Messwerte dividieren
  sum = 0;
  for( i = 0; i < AnzahlWerte; i++ )
    sum = sum + werte[i];

  return sum / AnzahlWerte;
}

....
int main()
{
  ....


    if( input( pin_b1 ) == 1 )
    {
      ReadValues();
      mittel = BerechneMittel( value, NR_VALUES );
      ....




------------------------------------------------------------
@<!-- --> (Gast)
Das ist einfach nur armselig was du da von dir gibst.
Selbst zu faul jemandem weiterzuhelfen, aber rummosern.

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.