Hallo zusammen, ich habe hier eine RGB LED, bei der ich mittels Taster verschiedene Farben einstellen kann. Ich würde jetzt gerne verschiedene eingestellte Farben speichern, wobei ich nur eine Zahl zwischen 0 und 1536 speichern muss, da sich aus der dann die Farbe berechnen lässt. Mein erster Gedanke war nun das speichern mit einer einfach verketteten Liste im EEPROM zu machen. Ich habe daraufhin ein bisschen hier im Forum gelesen und auch das AVR Tutorial zum Thema EEPROM befragt. Leider bin ich mir jetzt nicht ganz sicher was die beste Lösung wäre die Werte (wieviele es werden weiß ich nicht, aber auf jeden Fall nicht so viele, dass sie den EEPROM sprengen würden) zu speichern. Ich habe gelesen, dass einige sagen auf keinen Fall malloc auf einem AVR verwenden, andere jedoch sagen das ist kein Problem, v.a. da ich ja nur eine "Größe" allokiere. Auf der anderen Seite könnte ich aber auch (wenn ich das im Tutorial richtig verstanden habe) eine feste Startadresse nehmen und dann immer um ein Byte weitergehen, wobei ich hier aber nicht weiß, wann die "Liste" zu ende ist. Deshalb würde ich die Lösung mit einer einfach verketteten Liste bevorzugen, wollte aber eben nochmal fragen ob das sinnvoll ist/ob es noch eine bessere Lösung gibt, auf die ich grad nicht komme. Danke für eure Hilfe :) Grüße Mathias
Du wirst vermutlich pro Farbe 2 Byte verwenden, obwohl nur Werte bis 1536 vorkommmen. Dafür würden ja 11 Bit reichen. Die restlichen 5 Bits stehen dir zur Verfügung. Du kannst beispielsweise in einer Liste immer nach dem letzen Eintrag einen Wert mit gesetztem Bit 15 eintragen, um das Ende zu erkennen. Bei gültigen Einträgen die hohen Bits dann einfach wegmaskieren. Eine verkettete Liste würde zu jedem Element die Adresse des Nachfolgers enthalten. Es scheint mir aber anhand deiner Beschreibung, dass das nicht nötig ist, und eine lineare Liste genügt. Grüße, Peter
Mathias Dubdidu schrieb: > Mein erster Gedanke war nun das speichern mit einer einfach verketteten > Liste im EEPROM zu machen. Keine so gute Idee > Ich habe daraufhin ein bisschen hier im Forum > gelesen und auch das AVR Tutorial zum Thema EEPROM befragt. > Leider bin ich mir jetzt nicht ganz sicher was die beste Lösung wäre die > Werte (wieviele es werden weiß ich nicht, aber auf jeden Fall nicht so > viele, dass sie den EEPROM sprengen würden) zu speichern. Ich habe > gelesen, dass einige sagen auf keinen Fall malloc auf einem AVR > verwenden, andere jedoch sagen das ist kein Problem, v.a. da ich ja nur > eine "Größe" allokiere. Wenn du sowieso nur eine Größe speicherst, spricht doch nichts dagegen, den kompletten verfügbaren Speicher ganz einfach für ein fix dimensioniertes Array zu benutzen. Dazu noch einen Zähler, der dir sagt, wieviele Einträge vom Array gültig sind (muss aber auch gar nicht sein) und gut ists. > richtig verstanden habe) eine feste Startadresse nehmen und dann immer > um ein Byte weitergehen, wobei ich hier aber nicht weiß, wann die > "Liste" zu ende ist. Deshalb würde ich die Lösung mit einer einfach > verketteten Liste bevorzugen Ich glaube ehrlich gesagt nicht, dass du das wirklich bevorzugen willst. Viel Aufwand für nichts und dazu dann auch noch viele Bytes für Verwaltungsinformation, die du anders besser gebrauchen kannst
D.h. ich müsste doch mit folgendem Array den gesamten Speicher belegen können:
1 | uint16_t arEE[256]; |
da der EEPROM beim Mega168 512 Byte groß ist. Das schreibe ich einmal
rein und lese bzw. schreibe dann immer die einzelnen Elemente. Das
Element nach dem letzten gültigen würde ich dann einfach mit einer Zahl
> 1536 belegen.
Den EEPROM kann ich einfach so komplett beschreiben ohne irgendwas
"kaputt" zu machen oder?
Danke für die Hilfe!
Gruß, Mathias
Bedenke auch, dass du bei einer Liste dann auch User-Interface Möglichkeiten brauchst um * einen neuen Eintrag anzulegen * einen Eintrag zu verändern * einen Eintrag zu löschen. Mit einer Tabelle von, sagen wir mal 15 Werten brauchst du das nicht. Die sind am Anfang einfach alle 0, so dass deine LED damit nichts macht wenn der Eintrag ausgewählt wird. Dein Benutzer kann einen beliebigen Eintrag aus dieser Tabelle anwählen, woraufhin die LED diesen Wert annimmt, und auch verändern. Mehr braucht er eigentlich nicht. Gefällt ihm die Einstellung nicht, dann verändert er den Wert oder wählt einen anderen an. Aber: Er hat immer genau 15 Einstellungen aus denen er wählen kann. Das ist für ihn übersichtlicher und einfacher in der Benutzung. Und für dich ist es einfacher in der Programmierung, weil du programmintern einfach nur ein Array mit 15 Einträgen brauchst :-) (Die 15 jetzt nur als Beispiel, um irgendeine Zahl zu nennen. In der Praxis kannst du deinen kompletten noch freien Speicher dafür hernehmen)
Ja, du hast recht das mit der verketteten Liste ist nicht so der Renner. Werde es jetzt mit dem großen Array machen und das Stück für Stück füllen. Muss ich bei den Fuses noch was beachten, dass mir der EEPROM beim Chip-Flashen nicht auch gelöscht wird? Gruß
Mathias Dubdidu schrieb: > Ja, du hast recht das mit der verketteten Liste ist nicht so der Renner. > Werde es jetzt mit dem großen Array machen und das Stück für Stück > füllen. Ich hab in meinem letzten Posting noch eine Ergänzung angebracht, warum ich noch nicht mal das machen würde (das mit der scheinbar variablen Größe meine ich) > Muss ich bei den Fuses noch was beachten, dass mir der EEPROM beim > Chip-Flashen nicht auch gelöscht wird? Es gibt eine Fuse mit der man das Beschreiben des EEPROMS von aussen verhindern kann. Die meisten Brennprogramme haben auch eine Einstellung mit der man dem Brennprogramm sagt: Nur Flash, kein EEPROM
Hi >Es gibt eine Fuse mit der man das Beschreiben des EEPROMS von aussen >verhindern kann. Die meisten Brennprogramme haben auch eine Einstellung >mit der man dem Brennprogramm sagt: Nur Flash, kein EEPROM Die EESAVE-Fuse verhindert nur das Löschen des EEPROMs bein Chip-Erease. MfG Spess
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.