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


von Thorsten H. (imonkey)


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ß

von Martin T. (mthomas) (Moderator) Benutzerseite


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.

von Karl H. (kbuchegg)


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.

von klausy (Gast)


Lesenswert?

Du solltest die Variablen als static deklarieren...

von Thorsten H. (imonkey)


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!

von ARM-Fan (Gast)


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.

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.