Forum: Mikrocontroller und Digitale Elektronik SRAM-Verbrauch: wieviel platz für variablen?


von Kai (Gast)


Lesenswert?

Hallo Leute,

ich habe mal eine frage, angenommen ich haben einen avr (zb mega16)mirt
1K SRAM: wieviel variablen (zb Typ Word mit 2 Byte) kann ich nun
deklarieren in Bascom, ohne das es probleme gibt?

theoretisch wären es ja 512 Variablen, aber sicherlich wird auch vom
system selber SRAM benötigt.

für messwerterfassungen sind ja doch eine vielzahl nötig, wenn erst auf
abruf per rs232 übertragen werden soll.



Gibt es da eine Faustregel?

Besten Dank!

von Benedikt (Gast)


Lesenswert?

Du denkst schon richtig, 2Byte pro Word.
Dazu kommt noch Stack usw.

Was meinst du mit
"aber sicherlich wird auch vom system selber SRAM benötigt." ??

von Kai (Gast)


Lesenswert?

na ich meine, was nimmt sich der avr an sram, wenn ich mit lcd's,
intrrupts, timer, adc etc arbeite?
oder ist 100% des verfügbaren srams für meine variablen frei?

von Benedikt (Gast)


Lesenswert?

a) der AVR macht nichts, sondern nur dass, was du ihm sagst (also
programmierst). Was der Compiler macht ist eine andere Sache...

b) RAM-Variablen-Stack=freier Speicher.
RAM ist bekannt, Variablen auch, nur das mit dem Stack ist so eine
Sache. Bei jedem Interrupt scihert der Compiler alle Register usw. in
den Stack. Da können schon bis zu 100Bytes, oder bei vielen
verschachtelten Routinen auch mehr zusammenkommen.

von Kai (Gast)


Lesenswert?

intressant, und wie sollte der stack (gibts ja ne compiler option im
bascom menu) angelegt werden, wenn es so an die 800 word variablen
gibt, mit einigen subroutinen?

von Oliver (Gast)


Lesenswert?

Moin Moin,

ich habe ein Programm, welches viele SINGLE Variablen verwendet
und LOG10.
Nach einer gewissen Zeit spinnte das Programm, im LCD stand dann
nur Müll und ein RESET war die Folge.
Ich habe in BASCOM HW-Stack etc alle Werte verdoppelt und nun
läufts fehlerfrei.
Evt Stück für Stück die Werte erhöhen, bis im Progi keine
Fehler mehr auftreten.
Mich würde auch auch schon interessieren, wie viel RAM der Compiler
wirklich braucht, leider zeigt BASCOM das nicht an.
Mein Code ist nun auch schon 900 Zeilen lang (mit Komentaren aber)
und der ATMega8 zu 99% voll :)

mfg
Oliver

von Franz (Gast)


Lesenswert?

Hi Kai,

warum nutzt du 16-Bit-Variablen?

- weil du die Auflösung brauchst?
- oder weil es in BASIC so schön bequem ist?

In Assembler würde man 16-Bit-Werte nur nutzen, wenn es wirklich
erforderlich ist (Auflösung). Meist reichen nämlich 8-Bit-Werte.

Mfg. Franz

von crazy horse (Gast)


Lesenswert?

Üblicherweise gibts auch 2 Stacks, den Hardware-Stack, gehandelt durch
den SP, genutzt bei Interrupts, Calls und ggf. push/pop-Operationen und
dann noch den Datenstack, u.a. genutzt für Übergabe von Parametern an
Funktionen.

von Benedikt (Gast)


Lesenswert?

Da merkt man wer wirklich Ahnung vom programmieren hat.
Ohne jetzt irgendjemanden beleidigen zu wollen, aber es gibt ziemlich
viele Leute (auch hier im Forum), die Null Ahnung von uC haben, aber
diese in C oder BASCOM programmieren.
Einfach mal überall zur Sicherheit Fließkommazahlen einbauen usw. macht
ja bei Programmieren keinen Unterschied. Und wenn dann die ATmegas zu
klein und langsam werden, wundern sie sich, obwohl jeder mit etwas
Ahnung vom uC und von Assembler die 10 fache Geschwindigkeit rausholen
könnte. Aber das macht ja Arbeit, denn dazu muss man das Datenblatt
lesen...
Ich habe nicht gegen Compiler, die sind einfacher, aber es ist ebenso
einfacher ein Programm total zu versauen...

von Kai (Gast)


Lesenswert?

hi benedikt, genau so wie sprach mal ein automechaniker den ich kannte,
der fand das auch total dämlich,wenn die leute für einen
kupplungswechsel oder zylinderkopfdichtungswechsel zu ihm kamen.
das ist doch so einfach, da brauch mann doch nur die und die und die
schraube zu lösen und dann geht das. wenn die leute bißchen mehr, dann
könnte und so weiter.......ich sagte zu ihm dann das,was ich auch zu
dir sage: ich will benutzen, und nicht das zeug lernen. alles klar?
und mit bascom kann ich halt einen mc benutzen, und das ohne den total
umständlichen und komplizierten assemblerkram. oder schreibst du dein
betriebssystem für deinen computer auch selbst komplett neu? oder
entwickelst du für dein auto auch erstmal einen motor, bevor du damit
auch nur einen km fährst.


ich möchte mit meinem mc nicht den nobel-preis für software-entwicklung
bekommen noch 14 tage assembler-befehle studieren um eine led zum
leuchten zu bringen.

wenn ich mit der zeit merke,daß ich nicht weiter komme und über den
tellerrand schaue, dann frage ich.und entweder gibts darauf ne
sinnvolle antwort oder keine. nur diese schlaumeier-oberschullehrer
sprüche sind nicht nur destruktiv, sondern auch nicht hilfreich.


@franz ich will halt viel 5stellige zahlen speichern, und da ist der
variablentyp word mit 2 byte die einzige möglichkeit die ich kenne,
oder du zeigst mir,wie das auch mit 1 byte geht - das wäre natürlich
auch was!

von Benedikt (Gast)


Lesenswert?

@Kai
Wie schon zuvor geschrieben:
Ich habe niemanden spezielles gemeint, und erst recht nicht dicht.
Deine Frage mit dem Speicher ist nämlich komplizierter als man anfangs
denkt. Bei Assembler kann man das ganz noch einigermaßen im Kopf oder
durch simples zählen der Verschachtelungen ausrechnen, bei C und BASCOM
ist das ganze schon um ein vielfaches schwerer.
Anfänger OK (dazu hat jeder schließlich irgendwann gehört), aber was
ich garnicht mag, sind Anfänger die nach dem Testen des Demos das beim
Compiler dabei war, gleich einen mp3 Player mit Festplatte usw. bauen
wollen, aber nichtmal wissen welche Funktion die Leitungen WR\ und
RD\ haben usw.

Eine gewisse Grundlage und eine etwas Kenntnis des Mikrocontrollers
gehört schon dazu.

von wolli (Gast)


Lesenswert?

@Kai:

Einen uC zu programmieren hört sich nicht nach "benutzen" an, sondern
vielmehr nach "entwickeln". Eine Gerät mit einem uC kann man
"benutzten".

von Franz (Gast)


Lesenswert?

Hi Kai...

"@franz ich will halt viel 5stellige zahlen speichern, ..."

Da habe ich ja nix dagegen, dann schrei aber nicht rum, dass dein
Speicher nicht reicht. Entweder viele Variable oder speicherfressende,
beides wird wohl nix.

Du schreibst, du willst nur "benutzen". Ok, solange sich das auf die
Technik bezieht.

Wenn du aber meinst, du kannst die Forum-Teilnehmer "benutzen", weil
du zu faul zum Lesen/Lernen bist, dann kommst du sicherlich nicht weit.


Vielleicht solltest du erstmal etwas im Forum lesen (schmökern).
(Ich beziehe mich hier nicht nur auf diesen Thread, sondern auch auf
die anderen, in denen du schreibst, da stellst du nämlich auch Fragen,
die schon zigmal durchgekaut wurden.)

Mfg. Franz

von Kai (Gast)


Lesenswert?

@ "Vielleicht solltest du erstmal etwas im Forum lesen (schmökern).
(Ich beziehe mich hier nicht nur auf diesen Thread, sondern auch auf
die anderen, in denen du schreibst, da stellst du nämlich auch Fragen,
die schon zigmal durchgekaut wurden.)"

da hätte ich gerne mal die links dazu inkl der links, auf die du dich
beziehst zur untermauerung deiner these *gg

"Wenn du aber meinst, du kannst die Forum-Teilnehmer "benutzen",
weil
du zu faul zum Lesen/Lernen bist, dann kommst du sicherlich nicht
weit."
ich frage, und jedem steht es frei zu antworten oder nicht, da ist kein
"benutzen" möglich, da dies unweigerlich einen umungänglichen zwang
beinhaltet.
es gibt auch menschen, die ohne mc-controller in der praxis-buch unter
dem kopfkissen schlafen, und auch menschen, die das akzeptieren.

aber zurück zum thema, du wolltest zeigen, wie 5stelligen zahlen mit
weniger als 2 byte zum speichern gehen. wo war jetzt in deinem letzten
posting eine erklärung dafür?

von wolli (Gast)


Lesenswert?

Dummerweise reichen 2 Byte nicht zur Speicherung aller 5stelligen Zahlen
aus.

von Alex (Gast)


Lesenswert?

Hallo Kay

kannst du mir erklären, wie du die Zahl 65536 mit 2 Byte darstellst?
Ist ist 5-stellig, oder?

von Alex (Gast)


Lesenswert?

@wolli

sorry, warst etwas schneller :-)

von Benedikt (Gast)


Lesenswert?

@Kai:
Wenn du viele Messdaten speichern willst, für die der interne RAM nicht
ausreichend, dann schließ doch einen externen SRAM an. Bis 512kB sind
alle problemlos zu bekommen.
Sobald bei mir der Speicher nicht ausreichend, mache ich das auch immer
so. Der interne RAM hat für Variablen bisher immer, außer ich musste
große Datenmengen abspeichern (Messwerte, Empfangspuffer usw.)

von Franz (Gast)


Lesenswert?

Hi

Müssen es denn unbedingt 5-stellige (oder besser 16-Bit-) Messwerte
sein? Oftmals reichen doch 8-Bit-Werte.

Ist denn die Erfassung deiner Messwerte so genau, dass es sich lohnt,
die hohe Auflösung auch zu speichern?

Schau dir doch mal den zu erwartenden Wertebereich deiner Messwerte an
(niedrigster Wert, höchster Wert) und vergleiche mal mit dem
Wertevorrat deiner 16-Bit Zahl. Nutzt du den voll aus?

Mfg: Franz

von Kai (Gast)


Lesenswert?

also bascom macht das so:
0...255 is "byte" mit 1Byte sram
0..65535 is "word" mit 2byte sram
dazwischen ist nichts, also muß ich um die zahl 60000 (höchstwert) bis
250(minwert) bei 4000 (durchschnittswert) halt den variablentyp word
benutzen.

@benedikt 512kb ist noch zu klein 2mb wären da schon besser da ich ne
menge zahlen (zeitmessung) abspeichern muß.....

von Sebastian (Gast)


Lesenswert?

also ich mach hier grad was mit nem mega162 und nem 512kb S-Ram. Das
externe Speicherinterface kann aber nur 64k ansprechen und 60kb vom
externen ram nutzen. hab den ram in 16 Bänke a 32kb aufgeteilt. bei 2mb
solltest du dir was gutes einfallen lassen, da du ja 20 Adressleitungen
bedienen musst. Bei Multiplex wird das dann bestimmt etwas langsam.

seb

von Franz (Gast)


Lesenswert?

Hi Kai

Werte von 60000, 4000, 250. Da bietet sich 16-Bit unsigned an, wenn man
den Speicherplatz dazu hat. Hat man ihn nicht, also ist das Speichern
möglichst vieler Werte wichtiger, dann sollte man sich erstmal fragen,
ob zwischen 250 und 60000 auch alle Zwischenwerte erforderlich sind.

Vergleich: Ein einfaches (billiges) Digitalmultimeter zeigt dreieinhalb
Digit, also einen Ziffernbereich von -1999 über 0 bis +1999. Wenn man
nun 12V abliest (12,06) streitet man sich nicht um die letzte Ziffer.
Man kann sie zwar schön ablesen, da sie als eindeutig erkennbare Ziffer
dargestellt wird, trotzdem verwirft man sie, weil man ja weiß, dass der
Messfehler der Geräte eine genaue Interpretation nicht mehr zulässt.

Ähnlich verhält es sich mit vielen anderen Sensoren/Messwerterfassern.
Um z.B. die 10 Bit Auflösung (das sind "nur" 0...1023) eines
AVR-Analogeingangs sauber nutzen zu können, muss schon ein gewaltiger
Aufwand an Hardware (Entstörung, Platinenlayout) und Software
(Sleep-Modus während der Messung, langsamer ADC-Takt) getrieben
werden.

Du möchtest aber 16 Bit Auflösung speichern. Ich weiß ja nicht, wo du
diese Werte her nimmst (welcher Sensor?), bezweifle aber erstmal, dass
die Werte so genau erfasst sind, dass sie im 16-Bit Format gespeichert
werden müssen.

Zugegeben, 8 Bit unsigned (0...255) ist etwas wenig Auflösung, trotzdem
für viele Zwecke völlig ausreichend (die Auflösung ist 1 zu 256, die
Auflösung von Prozentangaben zum Vergleich nur 1 zu 100).

Wie stark wäre denn dein Messergebnis beeinträchtigt, wenn du das
untere Byte ignorierst und nur das obere speicherst? Für sehr viele
Zwecke reicht dieses Raster aus, es ist immerhin zweieinhalb mal so
genau wie die Angabe in Prozent.

Mfg. Franz

von hmann (Gast)


Lesenswert?

Das mit den Adressleitungen bei externem Speicher ist doch auch nicht so
wild. Man kann doch I2C Speicher nehmen wenn das von der Geschwindigkeit
reicht.

von Kai (Gast)


Lesenswert?

die geschwindigkeit ist nicht das problem. für mich eher welches bauteil
wie anschließen und unter bascom ansprechen können.

gibts da irgendwie was vernünftiges?

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.