www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik lpc2294, C, werte in array schreiben geht nicht, wieso?


Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo forum,

ich möchte in meinem µC-Programm, das auf einem lpc2294 laufen soll, ein 
array mit werten, in einer schleife die einen ad ausliest beschreiben, 
um danach etwas statistik zu betreiben.
Es lässt sich alles compilieren und auf den lpc aufspielen nur das 
programm läft nicht sobald ich den kommentar an der stelle XXX im QC 
aufhebe.

#include <stdio.h>                          /* I/O Functions */
#include <LPC22XX.H>                        /* LPC22XX 
PeripheralRegisters */
#include <math.h>

extern void init_serial (void);

int sendchar (int ch);

long adout0 ();
long adout1 ();

double sqrt(double);

int main (void) {

  int i,j;
  long a,b,ma,mb;
  double z,aa,bb;

//variablen für statistik

long aaa[1500],bbb[1500],xa,xb;
double sxa,sxb;
       sxa=sxb=0;

  init_serial();                           /* Initialize Serial 
Interface*/

  IODIR0 = 0x00000100;                      /* P0.8 defined as Output */

// 20x den mittelwert ermitteln

for (j=1; j<=20; j=j+1)
 {

// den ad i mal auslesen und die ergebnisse aufsummieren

  ma=mb=0;
  for (i=1; i<=1500; i=i+1)
  {
    IOCLR0 = 0x00000100;                    /* Turn LED On  (P0.8 = 0) 
*/
    a=adout0();
    b=adout1();
    IOSET0 = 0x00000100;                    /* Turn LED Off (P0.8 = 1) 
*/
    ma=ma+a;
    mb=mb+b;

//  aaa[i]=a;            XXX hier problem!
//  bbb[i]=b;            XXX hier problem!
  }

//mittelwert

  aa=(double)ma/1500;
  bb=(double)mb/1500;

//mittelwert über ht ausgeben

  printf ("%f  %f \n",aa,bb);

 }
 printf ("..........................\n");
  while(1);
}

weis einer warum das programm nicht läuft sobald ich in der schleife
aaa[i] einen wert zuweisen möchte?


gruß

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die beiden Arrays benötigen ca. 12kB. Mglw. ist der Stack zu klein. 
Testweise die Arrays in BSS legen, also aaa und bbb "global" außerhalb 
von main() definieren. Wenn das funktioniert und die arrays unbedingt 
nicht global definiert sein sollen, weitere Informationen zu verwendetem 
Toolset geben und Startup-Code mit Stack-Init zeigen.

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

Bewertung
0 lesenswert
nicht lesenswert
Das von Martin mag das eine Problem sein.

Das andere ist, dass Arrays in C bei 0 beginnend indiziert
werden.

Wenn du ein Array

long aa[5];

definierst, dann gibt es in diesem Array die Indizes
0, 1, 2, 3, 4  (zähl nach, es sind genau 5).


und jetzt überleg mal, was an

  for (i=1; i<=1500; i=i+1)
  {
 ....
    aa[i] = ...

falsch sein könnte.

Autor: klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest die Variablen als static deklarieren...

Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hello nerds,

also ich habe jetzt die größe des arrays auf 15 reduziert und es 
funktioniert prima.

Mein lpc hat 16kB sram und 256kB flash speicher, eine memorymap ist 
vorhanden, schön wäre es wenn ich direkt aus der schleife werte an 
bestimmte speicheradressen im flash-speicher schreiben könnte...ich weis 
halt nur nicht wie so etwas aussehen könnte, hab schon mal was über 
pointer gelesen aber raff es nicht so richtig...

beste grüße und vielen dank für die hilfe!

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Flashspeicher läßt sich nicht einfach so beschreiben wie RAM.

- Vor dem Schreiben mußt du einen ganzen Flashsektor löschen.
- Die kleinste "Einheit" an Daten, die auf einmal geschrieben werden
  muß, ist 256 Byte.
- Das ganze ist relativ langsam.
- Die Anzahl an Schreibzyklen / Lebensdauer des Flash ist begrenzt.

Ich denke, das ist nicht was du wirklich suchst.

Ansonsten, Stichwort: IAP im User Manual nachschlagen.

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.