Forum: Mikrocontroller und Digitale Elektronik Punkt Matrix Anzeige [Problem mit sehr großer Tabelle]


von Matrix (Gast)


Lesenswert?

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.

von H.Joachim S. (crazyhorse)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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

von Christian K. (the_kirsch)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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 ;-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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