www.mikrocontroller.net

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


Autor: Sascha K. (quad2000)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sascha K. (quad2000)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Braten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Braten:
Das war eben auch meine Vermutung :)...

Autor: Sascha K. (quad2000)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Helmut -dc3yc (dc3yc)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: jimjack jimjack (jimjack)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha K. (quad2000)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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. :)

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.