Forum: Mikrocontroller und Digitale Elektronik Array Speicherüberlauf Memory Model Wickenhäuser


von Ch072 K. (chris072)


Lesenswert?

Servus,

wir haben eine Aufgabe wie folgt bekommen...

in einer Messreihe sollen 65535 Werte aufgenommen werden über einen A/D 
Wandler
Hardware: Wickenhäuser(Entwicklungsumgebung), AT89C51CC03

Wenn ich in der Entwicklungsumgebung ein Array wie folgt initalisiere:

#define wert 65535

....
....
int mw[wert]

erhalte ich eine Fehlermeldung vom Compiler:
crypto.c 28: Warning: overflow in converting constant expression from 
'unsigned int' to 'int'
crypto.c 28: Error: '-1' is an illegal array size

..habe auch schon das array mit "unsigned int" defeniert ...bekomme ich 
die selbe Fehlermeldung.

Weiß jemand wie man bei der Entwicklungsumgebung Wickenhäuser das Memory 
Model via Compiler Optionen einstellt, so dass er den Wert annimmt.

Als Alternative habe ich folgendes probiert.

#define wert 32767

....
....
int mw[1][wert] weil 2x32676 auch 65535 entsprechen

oder ist das nicht die gute Lösung zu dem Problem?

Gruß
Chris

von Peter II (Gast)


Lesenswert?

Christian Grischke schrieb:
> oder ist das nicht die gute Lösung zu dem Problem?

teste mal mit
1
#define wert 65535ul
2
3
....
4
....
5
int mw[wert]

von Ch072 K. (chris072)


Lesenswert?

Danke für deine Unterstützung.

Er bringt die selbe Fehlermeldung "illegal array size"
und wie oben beschrieben :-(

Gruss
Chris

von Peter D. (peda)


Lesenswert?

Hast Du denn überhaupt 128kB externes SRAM angeschlossen?
Der CC03 hat max 2kB intern.

Der 8051 kann auch nur max 64kB adressieren. Dein Compiler muß daher 
SRAM-Banking unterstützen (Huge-Model?).

von micha (Gast)


Lesenswert?

Hm, wie viel Speicher/RAM hat ein AT89C51CC03 und wie groß ist ein int 
und wie groß ist dann die gesamte Speicheranforderung von 65535 
Einträgen? Hängt externes RAM dran? Soll es eventuell im Flash abgelegt 
werden? Wenn ja, wie wird es angesteuert? Sollen wirklich alle 65535 
Messwerte vorgehalten werden oder soll ein (gleitendes) Mittel berechnet 
werden?

von Ch072 K. (chris072)


Lesenswert?

Hallo,

Nein, auf dem Entwicklungsboard ist kein externes SRAM oder Speicher 
angeschlossen.

Der AT89C51CC03 hat 64k on-Chip Flash Memory;2048 Byte On-Chip ERAM;256 
Byte On-Chip RAM; 2kB on-Chip EEPROM

Eigentlich brauche ich nur char Variablen... weil der A/D Wandler im 8 
Bit Modus läuft.

Die Aufgabenstellung sagt aus das man 65535 Meßwerte aufnehmen soll und 
danach werden die Meßwerte zum PC übertragen und in gnuplot grafisch 
dargestellt.

Ich muss die Meßwerte weg speichern so dass ich sie nachdem Abschluß der 
Messung kompakt zum PC übertragen kann.

Gruss
Chris

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christian Grischke schrieb:
> Die Aufgabenstellung sagt aus das man 65535 Meßwerte aufnehmen soll

Das mag Deine Aufgabenstellung zwar aussagen, aber das ist so nicht 
umsetzbar.

Du kannst für Deine Messwerte nur das RAM nutzen, und davon hat Dein µC 
nicht ansatzweise so viel, wie für 64k Messwerte erforderlich wären.

Zumal Dein Programm auch für sich selbst RAM benötigt (Stack, andere 
Variablen etc.)

Also wirst Du Deine 64k Messungen in kleinen Häppchen durchführen und an 
den PC übertragen müssen.

64k Messungen, die Du zwischenspeicherst und dann am Stück an den PC 
überträgst, sind mit diesem µC nicht möglich.

von Peter D. (peda)


Lesenswert?

SPI-RAM wäre noch ne Möglichkeit, z.B. 23LCV512.

von Karl H. (kbuchegg)


Lesenswert?

Christian Grischke schrieb:

> Die Aufgabenstellung sagt aus das man 65535 Meßwerte aufnehmen soll und
> danach werden die Meßwerte zum PC übertragen und in gnuplot grafisch
> dargestellt.

Sagt die Aufgabenstellung explizit, dass du
* zuerst 65535 Messungen durchführen sollst und
* danach die Messwerte zum PC übertragen sollst

oder lässt sich die Aufgabenstellung auch so interpretieren, dass 65535 
Messungen durchgeführt werden sollen, deren Ergebnis jeweils zum PC (und 
zwar direkt nach der Messung) zum PC übertragen werden soll.

Der Unterschied: im letzten Fall brauchst du nicht zwischenspeicheren, 
jeder Messwert wird sofort nachdem er gewonnen wurde an den PC 
übertragen. Brauchst du nichts zwischenspeichern dann brauchst du auch 
kein Array.

Manchmal macht man sich selbst das Leben schwer, indem man auf Details 
besteht, die in der Aufgabenstellung überhaupt nicht gefordert wurden.

: Bearbeitet durch User
von Ch072 K. (chris072)


Lesenswert?

Hallo,

ich denke ich habe die Aufgabenstellung vielleicht mißverstanden, aber 
es wird zweideutig beschriebene in meine Augen, hier die Aufgabe:

in den Absatz ...Ist jeweils eine Messung beendet, so wird der Messwert 
zusammen mit der aktuellen Uhrzeit in folgendem Format an den PC 
gesendet:

kann heißen nach einer Messung zum PC senden oder wenn die Anzahl der 
Messungen erreicht sind und wenn der User die max. 65535 eingibt dann 
zum PC senden.

Aufgabe:
......
in welchem zeitlichen Abstand die Messwerte erfasst werden sollen. 
Hierbei sollen zwei Möglichkeiten vorhanden sein:
•  Erfassung im Sekundenabstand, wobei der Anwender einen Wert aus dem 
Bereich 0 … 65.535 Sekunden eingeben kann
•  Erfassung im Minutenabstand, wobei der Anwender einen Wert aus dem 
Bereich 0 … 65.535 Minuten eingeben kann
–  wie viele Messungen nacheinander mit dem ausgewählten Zeitabstand 
durchgeführt werden sollen. Hierbei sind Angaben zwischen 1 und 65.535 
möglich.
Am Ende der Eingaben werden zur Kontrolle die gewählten Werte noch 
einmal auf dem Terminalmonitor angezeigt.
Dann wird auf Tastendruck der gesamte Messzyklus gestartet.

Ist die ausgewählte Anzahl der Messungen durchgeführt worden, so soll 
das Programm anhalten und erst nach einem RESET erneut starten.

Ist jeweils eine Messung beendet, so wird der Messwert zusammen mit der 
aktuellen Uhrzeit in folgendem Format an den PC gesendet:
…………………
   22 12:55:00 152
   23 12:57:00  16
   24 12:59:00 166

…………………
Spalte :   Nummer der Messung: 1 … bis zur ausgewählten Anzahl
Spalte :  aktuelle Uhrzeit im Format „Stunden:Minuten:Sekunden“
Spalte :  der aktuelle Messwert (8-Bit-Auflösung)

Die drei Spalten sind jeweils durch ein einfaches Blank (Leerzeichen) 
getrennt, jede Messung steht in einer einzelnen Zeile.

Auf der PC-Seite werden die Datensätze von HyperTerm empfangen und in 
einer Datei abgespeichert.

Nach Beendigung der gesamten Messung wird „gnuplot“ aufgerufen und alle 
Messdaten in Form einer Kurve visualisiert.
Dazu müssen Sie natürlich ebenfalls eine entsprechende Kommandodatei für 
„gnuplot“ erstellen.

Gruss
Chris

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christian Grischke schrieb:
> in den Absatz ...Ist jeweils eine Messung beendet, so wird der Messwert
> zusammen mit der aktuellen Uhrzeit in folgendem Format an den PC
> gesendet:
>
> kann heißen nach einer Messung zum PC senden oder wenn die Anzahl der
> Messungen erreicht sind und wenn der User die max. 65535 eingibt dann
> zum PC senden.

Nein. Das ist nicht zwei-, sondern eindeutig.

Ist jeweils eine Messung beendet, so wird der Messwert
(...) an den PC gesendet .

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian Grischke schrieb:
> oder wenn die Anzahl der Messungen erreicht sind
Weil das mit dem zur Verfügung stehenden Controller technisch nicht 
machbar ist, scheidet diese Möglichkeit aus.

Ergo bleibt einfach ein Programm übrig, dass eine bestimmte Anzahl 
Messungen mit einer einstellbaren Pausenzeit dazwischen macht, und die 
Daten jeweils sofort über die SIO an das Terminal abschickt.


Fazit: wie so oft liegt das Problem nicht an der Aufgabe selber, sondern 
an der Interpretation und der unvollständigen Information bei der 
Fragestellung...

: Bearbeitet durch Moderator
von Karl H. (kbuchegg)


Lesenswert?

Chris072 Grischke schrieb:

> aber
> es wird zweideutig beschriebene

finde ich nicht

Die Worte 'jeweils' bzw. der Artikel 'der' lasse nur eine Interpretation 
zu.
1
 Ist jeweils eine Messung beendet, so wird der Messwert 
2
     *******                               ***

Die Gesamtheit aller Messungen wird in der Aufgabenstellung einmal 
'Messzyklus' genannt, ein anderes mal die "gesamten Messungen'. Wären 
sie gemeint, dann würde da auch nicht 'so wird der Messwert ... 
übertragen' stehen, sondern 'so werden die Messwerte ... übertragen'.

Fazit: Auf Details achten!
In der Programmierung besonders wichtig.

: Bearbeitet durch User
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.