Stack überlastet?

OP #1833310
Lesenswert?

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.
Angehängte Dateien:
Gast #1833370
Lesenswert?

> 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
Persönliche Seite #1833454
Lesenswert?

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
  }
OP #1833523
Lesenswert?

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
Angehängte Dateien:
Gast #1833533
Lesenswert?

> 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 ?
OP #1833547
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren