Forum: Mikrocontroller und Digitale Elektronik Stack überlastet?


von Mirko S. (mojo)


Angehängte Dateien:

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.

von Olaf (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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
  }

von Mirko S. (mojo)


Lesenswert?

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.

von Mirko S. (mojo)


Angehängte Dateien:

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

von MaWin (Gast)


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 ?

von Mirko S. (mojo)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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)

von Mirko S. (mojo)


Lesenswert?

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