www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Stack überlastet?


Autor: Mirko S. (mojo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
  const char Bild[17][16] = 
     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
     {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
     {1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
   // ... etc ...  

  while(1)
  {
    for (i = 0; i < 17; i++)
      Matrix_Pic(Bild[i], dauer);
  }

Autor: Mirko S. (mojo)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mirko S. (mojo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Mirko S. (mojo)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Mirko S. (mojo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah :)

super, vielen Dank.


Bin immer wieder beeindruckt, wie schnell man selbst um 23 Uhr hier 
Hilfe bekommt. Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.