Forum: Mikrocontroller und Digitale Elektronik Arrays bei 8051. Was muss ich beachten?


von Sascha K. (quad2000)


Lesenswert?

Hallo an alle,

ich verwende in meinem µC Programm für einen AT89C51CC03, das ich in 
Keil µVision 3 erstelle, einige Arrays.
Was muss ich dabei beachten?
Datentyp?
Speicherbereich?

Ich habe es bis jetzt so erstellt:

header:
extern xdata unsigned int test1 [50];

main:
xdata unsigned int test1 [50];

Ist das so richtig?

Ich habe folgendes Problem:
Ich habe ein Schleife, die mir Werte in den Feldern ablegt. Sie beginnt 
bei Feld 0. Wenn die max. Anzahl von 50 erreicht ist, wird die schleife 
wieder auf 0 zurückgesetzt und beginnt von neuem Werte in dem Array 
abzulegen. Wenn ich das mehrmals durchlaufe, habe ich Fehler im Programm 
(ich gebe die Werte über ein LCD Display aus).

An was kann das liegen?

Danke für die Hilfe.

Gruss Sascha

von Timmo H. (masterfx)


Lesenswert?

Eigentlich sollte das kein Problem sein. Ich denke eher, dass irgendwas 
am Code falsch ist (den du ja nicht gepostet hast). Vielleicht 
verursachst du auch irgendwo nen Stackoverflow weswegen dann deine 
globale Variable versehendlich überschrieben wird.

von Sascha K. (quad2000)


Lesenswert?

Hallo Timo H.

normalerweise Poste ich immer mein Code aber da es sich nur um eine 
Schleife handelt dachte ich,das ich ihn weglassen kann. Die Schleife 
funktioniert auch. Das habe ich ausgiebig getestet.

Die Idee mit dem Stack hatte ich auch schon. Zu dem Thema Stack hab ich 
schoneinmal ein Beitrag im Forum gepostet aber leider keine Antwort 
erhalten. Leider hab ich auch keine genauen Informationen über den Stack 
und ich habe noch keine Seite gefunden, die mir den Stack verständlich 
erklärt.

In meinem Programm sieht es so aus:

xdata unsigned int test 1 [50];
xdata unsigned int test 2 [50];
xdata unsigned int test n [50];

Ich habe 24 solcher Arrays in meinem Programm da ich sehr viele Werte 
abspeichern muss. Im Worst Case werden in alle Felder der Reihe nach 
Werte abgespeichert und auf meinem Display ausgegeben. Sobald die max. 
Feldanzahl erreicht wird, werden die neuen Werte wieder ab Feld 0 
abgespeichert. Die alten Werte werden überschrieben.
Sollte ich die Felder befor ich sie überschreibe auf 0 setzen?

Gruss und vielen Dank für die Hilfe Sascha

von Braten (Gast)


Lesenswert?

Könnte es daran liegen, dass du nicht bedacht hast das ein Array [50] 
von 0 bis 49 geht und nicht von 0 bis 50?

nur so eine Vermutung

> Anzahl von 50 erreicht ist, wird die schleife
> wieder auf 0 zurückgesetzt und beginnt von neuem Werte in dem Array
> abzulegen.

von Marian (Gast)


Lesenswert?

@Braten:
Das war eben auch meine Vermutung :)...

von Sascha K. (quad2000)


Lesenswert?

Danke für den Tipp. Ich habe aber an das gedach. Ich habe eine 
if-Abfrage in meinem Programm, die das Array-Feld abfrägt und mit 49 
Vergleicht.

von Helmut -. (dc3yc)


Lesenswert?

Sascha,

besitzt dein µC soviel RAM? Bei 24 Arrays á 50 Int sind das 2400Byte 
RAM. Ich glaube nicht, dass dein Proz soviel hat? Poste doch mal das 
.MAP-File, da steht das alles drin!

Servus,
Helmut.

von jimjack j. (jimjack)


Lesenswert?

Da ist es, dieser Controller hat nur 2048 Byte XRAM.

Aber da müsste der Compiler meckern und gar kein HEX-File erstellen.
Und das tut er auch, hab ich gerade mal getestet.

Komisch...

Steffen

von Sascha K. (quad2000)


Lesenswert?

Danke an alle für die Hilfe. Jetzt ist einiges klarer.

Aber Keil meckert bei mir nicht. Er erstellt ein Hexfile.

Komisch aber egal. Jetzt kann ich ja den Feler vermeiden.

Ich hab jetzt mien Programm so abgeändert, das ich nur noch 17 
Arrayfelder habe.

von R. W. (quakeman)


Lesenswert?

Wenn du die Daten sowieso immer nur sequenziell in die Arrays schreibst 
würde ich eher Ringbuffer dafür verwenden als Arrays. Aber das ist 
vielleicht eine Geschmacksfrage. :)

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.