Forum: Mikrocontroller und Digitale Elektronik Einfach verkettete Liste auf einem Mega168


von Mathias D. (darkfirefighter)


Lesenswert?

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

von Peter R. (gelb)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Mathias D. (darkfirefighter)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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)

von Mathias D. (darkfirefighter)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.