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...