stationeers.de Mod-Werkstatt · Dominik1199
EN Anmelden
  1. Start
  2. IC10-Akademie
  3. Tag 125

Tag 125 von 365 · Fortgeschritten · Monat 5: Speicher und Struktur

Projekt: Messwert-Verlauf

Projekt der Woche: Ein Ringpuffer im Stack merkt sich die letzten zehn Temperaturen. Daraus entstehen ein ruhiger Mittelwert und eine Trendanzeige.

Projekt 40 Min. Woche 18

Das lernst du heute

  • Ringpuffer im Stack
  • Mittel der letzten Werte
  • Trend anzeigen

Ein Temperaturwert allein sagt wenig. Steigt es gerade? Ist der Ausschlag eben ein Ausreißer? Dafür merkt sich der Chip die letzten Werte in einem Ringpuffer: zehn feste Plätze im Stack, die reihum überschrieben werden.

Der Ring

Ein Zeiger pos sagt, wohin der nächste Wert kommt. Nach jedem Schreiben rückt er eins weiter und springt hinter dem letzten Platz zurück auf 0:

poke pos temp
add pos pos 1
mod pos pos GROESSE      # 9 -> 0

Der neueste Wert liegt also bei pos − 1, der älteste bei pos, sobald der Ring einmal voll ist. Bis dahin liegt der älteste bei 0. Ein Zähler anzahl merkt sich, wie viele Plätze schon gefüllt sind, höchstens GROESSE.

Teilziele

  1. Mittel der ersten Werte: Die LED „Mittel“ zeigt den Mittelwert der bisher gespeicherten Temperaturen in °C, auch wenn der Ring noch nicht voll ist.
  2. Nur die letzten zehn: Ist der Ring voll, überschreibt jeder neue Wert den ältesten. Das Mittel bezieht sich immer auf die letzten zehn Werte.
  3. Trend: Die LED „Trend“ zeigt neuester minus ältester Wert in K. Die Leuchte „Steigt“ leuchtet, wenn der Trend über 0,5 K liegt.
  4. Sensorausfall: Fehlt der Gassensor „Halle“, wird nichts gespeichert, das Blinklicht „Sensorfehler“ leuchtet, und die Anzeigen behalten ihren letzten Wert.

Mittel über die gefüllten Plätze

move summe 0
move i 0
summieren:
get wert db i
add summe summe wert
add i i 1
blt i anzahl summieren
div mittel summe anzahl

Weil der Ring von 0 an gefüllt wird, liegen die ersten anzahl Werte immer auf den Adressen 0 bis anzahl − 1. Ist er voll, ist anzahl gleich GROESSE, und die Schleife geht über alle Plätze.

Tipp

Im Test wird jeden Takt gespeichert. Im Spiel reicht meist ein Wert pro Minute. Dafür setzt du einen Zähler davor, der nur alle 120 Takte einen Wert in den Ring lässt.

Achtung

Speicher nie NaN in den Ring. Ein einziges NaN macht die Summe und damit das Mittel für zehn Durchläufe unbrauchbar. Prüf den Messwert, bevor du ihn mit poke ablegst.

Schaubild

Der Stack mit Stapelzeiger Platz 0 10 Platz 1 20 Platz 2 30 Platz 3 Platz 4 sp = 3 nächster freier Platz push 40 pop r0 r0 = 30 zuletzt rein, zuerst raus
Der Schreibzeiger läuft im Kreis über die Adressen 0 bis 9. Der neueste Wert überschreibt immer den ältesten.

Projektaufgabe

Aufgabe

Baue den Ringpuffer für den Gassensor „Halle“ mit zehn Plätzen auf den Adressen 0 bis 9. Ausgaben: LED „Mittel“ (°C), LED „Trend“ (K), Wandleuchte „Steigt“, Blinklicht „Sensorfehler“. Die Teilziele stehen über dem Editor.

Teilziele

  1. Teilziel 1: Mittel der ersten Werte
  2. Teilziel 2: nur die letzten zehn zählen
  3. Teilziel 3: Trend
  4. Teilziel 4: Sensorausfall

Hinweise

Hinweis 1

Bei NaN: Warnlampe an und mit bnez fehlt start zurück, bevor etwas gespeichert wird.

Hinweis 2

Ring: poke pos temp, pos weiterzählen und mit mod umbrechen, anzahl mit min auf GROESSE deckeln.

Hinweis 3

Neuester Wert bei pos − 1 (mit mod), ältester bei pos, wenn der Ring voll ist, sonst bei 0.

Quiz

2 Fragen. Ab 60 % ist das Quiz bestanden – die Auswertung macht der Server.

Tag abschließen

  • Alle Teilziele des Projekts bestanden
  • Quiz mit mindestens 60 % bestanden

Ohne Konto wird der Fortschritt nur in diesem Browser gespeichert.

Fehler in dieser Lektion melden

Zum Melden bitte anmelden. Anmelden

Esc
↑ ↓ wählenEnter öffnen/ öffnet die Suche überall