Hallo, ich möchte eine Dot-Matrix-Anzeige, wie man sie von Haltestellen kennt, nachbauen. Als µc für die Matrix verwende ich einen MEGA8515@8MHz. Programmiert wird in C. Soweit funktioniert alles sehr gut. Allerdings ist der Speicher voll. Deshalb soll der Controller die anzuzeigenden Daten über UART empfangen. Die Abfahrdaten sollen nun in einem zweiten Controller hinterlegt und über UART zu gegebener Zeit gesendet werden. Zur Entwicklung dient zunächst auch ein ATMEGA8515. Ich habe folgende Tabelle angelegt: char Tabelle [40][8]={ //Tabellenformat: //{[Stunde_z],[Stunde_e],[Minute_z],[Minute_e],[Line],[Ziel],[Werktag/So nntag/Feiertag]} {0,3,5,8,6,2,0}, {0,4,2,0,6,2,0}, {0,4,3,4,6,1,0}, {0,4,4,4,6,1,0}, {0,4,4,7,6,1,0}, {0,5,0,2,6,1,0}, {0,5,1,7,6,1,0}, {0,5,3,2,6,1,0}, // Tabelle gekürzt {2,3,5,8,6,2,0}, }; Allerdings müsste die Tabelle ca. die Größe [400][8] haben. Ab einer Größe von ca. [80] [8], gibt es jedoch das Problem, dass die Controller auf einmal nur noch die Zahl 3 per UART sendet und damit nicht mehr wieder aufhört und auch sonst blockiert ist. Bei einer Tabelle von [400][8] erhalte ich von Atmel Studio 6 folgende Infos über den Programmspeicher: Program Memory Usage : 3968 bytes 48,4 % Full Data Memory Usage : 3395 bytes 5,2 % Full Sollte also passen. Falls jemand einen Tipp für mich hat, wäre ich sehr dankbar.
>Data Memory Usage : 3395 bytes 5,2 % Full
Soso, da hast du aber ein Exemplar mit besonders viel RAM erwischt :-)
64k hat der nicht, kann aber mit externem RAM 64k verwalten. Hast du
wirklich externen RAM angeschlossen oder es nur dem Compiler geflüstert?
Matrix schrieb: > Als µc für die Matrix verwende ich einen MEGA8515@8MHz. Warum tust du dir das an? Der Controller hat 512 Byte RAM. Extern kannst du auf 64K erweitern. Dann hast du aber nicht mehr genügend Anschlüsse für deine Matrix. Nimm einen Controller, der für die Aufgabe geeignet ist. Z.B. Atmega1284. Da passt auch die Tabelle ins RAM. mfg.
Matrix schrieb: > Als µc für die Matrix verwende ich einen MEGA8515@8MHz. Programmiert > wird in C. Soweit funktioniert alles sehr gut. Allerdings ist der > Speicher voll. Weil es der falsche Speicher ist. Diese Tabelle ist quasikonstant und gehört deshalb nicht in den RAM, sondern in den Flash. Wenn sie dann doch alle halbe Jahre mit einem neuen Fahrplan aktualisiert werden muß, dann kann der Controller sie auch selber im Flash ändern. Der kann zwar nur so ca. 10000 Schreibvorgänge ab, aber ich schätze, daß in 5000 Jahren dein Display sowieso nicht mehr benötigt wird...
Du könntest deine Tabelle auch ein bisschen komprimieren wenn du die Zeit nicht in Einer und Zehner Unterteiles. Außerdem ist deine Tabelle nur 7 Elemente breit und nicht 8.
@ Christian K. (the_kirsch) >Du könntest deine Tabelle auch ein bisschen komprimieren wenn du die >Zeit nicht in Einer und Zehner Unterteiles. Richtig, BCD ist das Zauberwort. https://de.wikipedia.org/wiki/BCD-Code Ausserdem braucht man für so eine eher einfache Sache keine 2 Controller, selbst einer langweilt sich damit ausreichend ;-)
Matrix schrieb: > char Tabelle [40][8]={ > > //Tabellenformat: > //{[Stunde_z],[Stunde_e],[Minute_z],[Minute_e],[Line],[Ziel],[Werktag/So nntag/Feiertag]} > {0,3,5,8,6,2,0}, Also um eine Zeit zu spreichern verwendest du 4*8 = 32 Bits. Um eine Uhrzeit zu speichern braucht man 5 Bits für "Stunden" und 6 Bits für "Minuten". Das sind 11 Bits, schon mal 66% gespart. Da sich die Zeiten sortieren lassen, genügt es, deren Differenzen zu speichern. Geht man davon aus, dass mindestens 1 Was-Auch-Immer pro Stunde fährt, benötigt man nur noch 6 Bits für die Uhrzeit. Damit sind diese Daten bereits auf 1/4 geschrumpft. Gleiches kann man für die Linien tun: Um diese zu speichern benötigt man 1 Bit: Entweder ist die Linie die gleiche wie im vorhergehenen Eintrag oder eben eine Nummer höher. Falls es keine Linie 6 gibt und als nächstes die 8, dann macht man für diese eben einen Leereintrag, z.B. über das letzte Feld oder über ein ungültiges Ziel etc. Die letzte Spalte ist nicht so einfach... Wie willst du feststellen, ob ein Feiertag ist? Willst du z.B. einen Algorithmus zur Berechnung des Osterdatums einbauen? ...egal, gehen wir davon aus, dass 2 Bits genügen (Sammstag, Sonntag, Feiertag, Weltuntergang). Dann speichern wir dieses Feld nicht ab, sondern machen 4 Tabellen: je eine für Samstag, Sonntag, Feiertag und Weltuntergang. Pro Tabelleneintrag genügen uns somit 6 + 1 + 8 = 15 Bits. Aus Bequemlichkeit verwenden wir 16 Bits zum Speichern; das letzte Bit kann auch für einen Leereintag herhalten, womit sich auch Zeitdifferenzen > 60 Minuten darstellen lassen. Insgesamt lassen sich die Daten also auf 1/4 eindampfen mit überschaubarem Aufwand zur Implementierung. Bei den Glyphen kann man bestimmt auch sparen; und wenn du alleine schon 8k verbraten hast für die Anzeige, dann ist auch bei den Algorithmen noch "etwas" Verbesserungspotential...
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.