Logikfrage platzsparend einen Ablauf speichern? (AVR)

OP #908819
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
#908858
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
OP #908962
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
Gast #908973
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:
1
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?
#908983
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.
OP #909005
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
Gast #909153
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.
#909376
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.
Gast #915275
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ß

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