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
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
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
>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?
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.
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
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.
>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.
Ich denke mal, daß 10ms viel zu schnell ist, sogar ein TV-Signal hat ja nur 40ms Bildrate. 100ms sollten daher dicke ausreichen. Peter
> 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.
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ß
was mir noch einfällt. der längste wechsel dauert halt ca 2 Sekunden
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.