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
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] |
Danke für deine Unterstützung. Er bringt die selbe Fehlermeldung "illegal array size" und wie oben beschrieben :-( Gruss Chris
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?).
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?
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
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.
SPI-RAM wäre noch ne Möglichkeit, z.B. 23LCV512.
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
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
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 .
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.