www.mikrocontroller.net

Forum: Compiler & IDEs Logikfrage platzsparend einen Ablauf speichern? (AVR)


Autor: Mirco Blitz (mblitz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
vielen Dank das ihr diesen Thread lest und mir vielleicht helfen könnt.

Ich bin ziehmlich neu im Microcontroller bereich und bisher hat sich mir 
(dank viel speicher) die folgende Frage nie gestellt :-)

Ich möchte einen Ablauf möglichst Speichersparend programmieren.

Wie der Ablauf funktionieren soll:
- Intterrupt alle 100hz (kein problem)
- Der nächste "Schritt" von 21 LED's sollen ausgelesen werden und in ein 
Hilfsarray geschrieben werden. Jeder wert ist 1 byte (int)

Aufgrund der größe im Speicher scheidet ein 2Dimensionales-Array aus :-) 
War natürlich mein erster Ansatz.

Ich dachte mir ich könnte jetzt einen langen "String" schnappen, die 
"Zeichen" einzeln in einer Schleife von 21 durchgehen, in int 
convertieren und ddas als ablauf benuzen. (Irgendwie glaub ich, es gibt 
nen besseren weg.)

Ich hoffe Ihr habt mich verstanden und könnt mich in die richtige 
richtung schubsen.

Gruß
Mirco

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mirco Blitz wrote:
> - Der nächste "Schritt" von 21 LED's sollen ausgelesen werden und in ein
> Hilfsarray geschrieben werden. Jeder wert ist 1 byte (int)

Falsch, int ist mindestens 2 Byte groß.
Wenn Du den Zustand von 21 LEDs speichern willst, reichen 3 Byte
(= 24 Bit) völlig aus, also char[3] oder ein long (4 Byte).


Peter

Autor: Mirco Blitz (mblitz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, danke für die Antwort, aber du hast mich missverstanden.
Jede Led kann einen "Helligkeitswert"(PWM) von 0 - 255 haben. Ich möchte 
nun einen Ablauf programmieren, so das die 21 LED alle 10ms einen 
anderen Helligkeitswert (natürlich jede ihren eigenen) bekommen und das 
möglichst platzsparend. Ich hab nur nicht die leisteste Idee wie ich das 
so schlank wie möglich hinbekomme.

Gruß
Mirco

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich möchte
>nun einen Ablauf programmieren, so das die 21 LED alle 10ms einen
>anderen Helligkeitswert (natürlich jede ihren eigenen) bekommen und das
>möglichst platzsparend.

Das Speichern der Helligkeitswerte ist das Einfachste:
uint8_t  HellWerte[21];
Das legt ein 21Elemte langes Array von Bytes (0..255) an.

Die größere Frage ist ja, wo kommen die Werte her, die da reingefüllt 
werden sollen??

>alle 10ms anderen Helligkeitswert .. bekommen
Sagt nichts über den Alghorithmus aus, wie die Helligkeitswerte 
berechnet werden sollen. Also nach welcher Formel..?


Weiter ist noch interessant, was mit den Werten im Array geschehen soll. 
Also wie gibst du die Werte aus. Und wohin?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Willst du RAM oder Flash sparen?
Welche Architektur?

Ich finde deine Problembeschreibung extrem unübersichtlich. Erklär doch 
einfach mal, was das werden soll.

Schätz doch mal bitte deinen Speicherbedarf ohne Optimierung ab.

Wenn die Helligkeiten nicht berechenbar sind, wirst du nicht umhin 
kommen die Werte irgendwo zu speichern.

Autor: Mirco Blitz (mblitz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich versuchs nochmal zu erklären.

Ich baue einen transparenten Würfel mit 21-LED. Dieser Würfel hat je 
nachdem auf welche Seite er gelegt wird andere Helligkeits-Pattern die 
Abgespielt werden sollen.

- Statisch (Einmaliges setzen der Helligkeitswerte)
- Fade (Berechnung des nächsten Helligkeitswerts geteuert durch Timer2)
und
- Chase (Also vorgefertigte Abfolgen von Werten gesteuert durch Timer3)

Statisch und Fade sind kein Problem, auch die Lage des Würfels ist 
gelöst.
Mein einziges übriggebliebenes Problem ist den Chase Ablauf so 
platzsparend wie nur möglich im Flash abzulegen. Bisher habe ich es mit 
einem 2D-Array

Zeile  Led1  Led2  Led3  Led4 Led5 .......
  0     255   0     128   0    255
  1     0     255   0     60   0
  2     0     0     0     0    0
  3     255   255   255   255  255
(Zeilenwechsel bei jedem Timer3 Interrupt)

ausproboiert und musste feststellen, das nen 2D-Array mehr Speicher als 
nötig verbraucht und ich nicht ausreichend Platz habe meine gewünschten 
Abfolgen zu speichern. Ich suche nun nach anderen möglichkeiten diese 
Werte zu speichern. Da ich eine feste "Breite" von 21 * 4 bit habe, 
dachte ich, ich könnte z.B. die Werte in einem langen "String" oder 
einer Variablen ablegen, die ich sequenziell durchgehe und so meine 
"Zeilen" auslese.

Das ganze läuft auf nem Atmega128.

Ich hoffe das war verständlicher :-)
Gruß
Mirco

Autor: Mirco Blitz (mblitz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach der Speicherbedarf.
Pro Chase 21 Ledwerte(je 4byte) * 1000 Zeilen = 4000byte
2-3 Chases insgesamt

Also sollte ich mit 12k auskommen, wenns super optimiert ist.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Da ich eine feste "Breite" von 21 * 4 bit habe,

Wo kommen die vier Bit her?
Ich denke du hast 0..255 als Helligkeitswerte? Das sind acht bit=ein 
Byte

Nach deinem obigen Beisiel brauchst du pro Zeile 21Bytes.

ergeben 21000Bytes bei 1000Zeilen, und bei 3chases sind das

63000Bytes, was etwa 48% FLASH auslastung sind.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke mal, daß 10ms viel zu schnell ist, sogar ein TV-Signal hat ja 
nur 40ms Bildrate.

100ms sollten daher dicke ausreichen.


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> so das die 21 LED alle 10ms einen
> anderen Helligkeitswert (natürlich jede ihren eigenen) bekommen

tun sie das auch wirklich: alle 10 ms ändern alle 21 LED ihren
Helligkeitswert?

Wenn nein, dann würde ich mir an deiner Stelle mal Gedanken über
einen zeitgesteuerte Speicherung machen.
Dein Array hält nicht mehr die Helligkeitswerte für alle LED im
10ms Intervall, sondern da drinn wird gespeichert welchen
Helligkeitswert welche LED wie lange annehmen soll.
Das könnte zb so aussehen

   LedNr  Helligkeit   Zeit bis zur nächsten Aktion
     0      128                0                     (*)
     1      200                0
     2      64                 200
     0      200                30
     2      200                1000
     1      0                  10
     ....

Der Ablauf wäre also folgender:
Bei Start nehmen LED 0, 1 und 2 die Werte 128, 200 und 64 an.
Dann passiert 200ms lang nichts. Sind die 200ms um, wird LED 0
auf 200 hochgedimmt. Weitere 30ms später LED 2. Ist das erledigt
ist 1000ms lang Ruhe, ehe dann Led 1 auf 0 zurückgenommen wird,
etc, etc.


(*) die 0 bei Zeitdauer sagt zb aus, dass für diesen Zeitpunkt
es noch weitere 'Helligkeitsanweisungen' gibt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest auch wenn die LED sowieso langsam heller und dunkler werden 
nur einen Startwert Speichern.
Für die folgenden schritte speicherst du nur ab ob sie 1 heller oder 0 
dunkler werden. -> DPCM
und das bissel flackern um einen Wert herum fällt bei 10ms eh nicht auf.
dann reichen dir pro Schritt nur 3 Byte

Gruß

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was mir noch einfällt.
der längste wechsel dauert halt ca 2 Sekunden

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.