Moin, ich habe eine 4x4 LED-Matrix gebastelt, welche auch einwandfrei funktioniert. Die Matrix wird mit einem msp430f2013 gesteuert und über das Entwicklungstool eZ430-F2013 programmiert. Zum Programmieren benutze ich "IAR Embedded Workbench" von ti. Die Matrix wird über einen Port gesteuert. Die Anodentransistoren hängen an den unteren vier Bits und die Kathoden an den oberen vier Bits. Soviel erstmal zum Aufbau, nun zu meinem Problem: Die Matrix funktioniert soweit einwandfrei, die Funktion Matrix_Pic funktioniert auch, habe ich getestet. Probleme bekomme ich beim Programmieren von etwas komplizierteren Mustern (hier eine Schnecke). Ich hatte das Programm auf mehrere Dateien aufgeteielt (zur besseren Übersicht) und bekam da die Fehlermeldung: "Error[e16]: Segment DATA16_I (size: 0x100 align: 0x1) is too long for segment definition. At least 0x80 more bytes needed. The problem occurred while processing the segment placement command "-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=0200-0 27F", where at the moment of placement the available memory ranges were "CODE:200-27f" Reserved ranges relevant to this placement: 200-27f DATA16_I " Während ich diesen Beitrag geschrieben hab, habe ich die einzelnen Dateien zusammen gefasst zu einer Datei, der übersicht halber. Dabei viel mir folgendes auf: Das Programm ließ sich kompilieren. Allerdings lief die Matrix nicht. Wenn ich nun von den Arrays, die ich für die Spirale angelegt habe fast alle Lösche (bis auf sechs), so läuft das Programm ohne Probleme... Ich vermute, dass ich einfach zuviel Speicherplatz verbrauche, allerdings weis ich nicht, wie ich das besser speichern sollte. Wäre super, wenn ihr hierzu mal eure Meinungen abgeben könntet, ob ich einfach nur nen dummen Fehler gemacht habe, oder mein ganzes Konzept falsch ist. Im Anhang die Datei, in der ich alles zusammenkopiert habe.
> allerdings weis ich nicht, wie ich das besser speichern sollte.
Du hast 17 Arrays mit jeweils 16Byte groesse und in jedem dieser Bytes
speicherst du ein Bit. Das wuerde ich als Verschwendung bezeichnen.
Ausserdem solltest du Variablen die sich zur Laufzeit nicht aendern als
Constanten abspeichern damit sie das Programm beim start nicht aus dem
Flash in dein Ram kopiert.
Olaf
Deklariere Dein "Schneckenmuster" als const, dann landet es im Flash-ROM. Auf mehr musst Du gar nicht achten, im Gegensatz zum AVR sind für Lesezugriffe auf das Flash-ROM keine Klimmzüge à la "progmem" erforderlich. Außerdem kannst Du, anstatt 17 einzelne Arrays mit je eigenem Variablenamen anzulegen, diese auch in einem zweidimensionalen Array deklarieren. Das verkürzt Dein Programm, weil Du so anstelle von 17 separaten Aufrufen von "Matrix_Pic" nur einen in einer Schleife hast. Also
1 | const char Bild[17][16] = |
2 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
3 | {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
4 | {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
5 | {1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
6 | // ... etc ...
|
7 | |
8 | while(1) |
9 | {
|
10 | for (i = 0; i < 17; i++) |
11 | Matrix_Pic(Bild[i], dauer); |
12 | }
|
Hey, danke :) Hab jetzt die Funktion noch umgeschrieben, so dass nur noch ein ein Array mit vier Plätzen nötig ist, pro zeile einer. Fasse das dann gleich zusammen.
Moin nochmal: Hab das Program jetzt auf const geändert. Allerdings sagt der Compiler jetzt "Error[Pe167]: argument of type "char const *" is incompatible with parameter of type "char *" C:\Users\Mirko\Desktop\Neuer Ordner (2)\main.c 17 " Könnt ihr mir das kurz erklären? Ich versuche ja nicht eine Konstante zu verändern. Warum kann ich das nicht einfach 1:1 ändern? Meine Datei für die Schnecke ist im Anhang
> Ich vermute, dass ich einfach zuviel Speicherplatz verbrauche, Vielleicht verbrauchst du auch einfach zu viel Strom. Eine 4 x 4 LED Matrix mit normalen 20mA LEDs zieht 80mA aus den Spaltenausgängen und Pulse von 320mA aus den Zeileausgängen des Microcontrollers, die dieser gar nicht liefern kann und gar nicht über die Versorgungsspannungsanschlüsse reinbekommt. Der uC taktet also verschiedene Kurzschlüsse aus seiner Sicht und vielleicht auch aus Sicht des Netzteils. Ist es wirklich sooooooooo schwer bei Multiplexanzeigen mal über den Strom nachzudenken ?
Die Matrix wird über eine externe Spannungsquelle versorgt, die über Transistoren angeschlossen ist. der Mikrocontroller steuert lediglich die Transistoren. Hab mir also gedanken gemacht, was den Strom angeht :) Die Matrix funktioniert. Das ding ist einfach nur, das ich mit meiner art und weise zu speichern, den Rahmen des Controllers sprenge. Hab jetzt die Verschwendung etwas reduziert, wie man in der Datei Bilder.h sieht. Bräuchte nur nochmal eine erläuterung warum ich nicht einfach mein vorher char ... durch const char ersetzen kann.
Mirko S. schrieb: > Könnt ihr mir das kurz erklären? > Ich versuche ja nicht eine Konstante zu verändern. Warum kann ich das > nicht einfach 1:1 ändern? Ändere die Funktionsdefinition Deiner Ausgabefunktion von void Matrix_Pic(char *Koord,int time) zu void Matrix_Pic(const char *Koord,int time)
Ah :) super, vielen Dank. Bin immer wieder beeindruckt, wie schnell man selbst um 23 Uhr hier Hilfe bekommt. Danke
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.