Manche Fehler meldet der Chip sofort mit Fehlercode. Die gemeinen melden gar nichts: Das Programm läuft, tut aber nicht, was es soll. Hier die Klassiker, sortiert nach Gemeinheit.
Die stillen Fehler
Programm läuft hinter die letzte Zeile
Symptom: Der Chip hat einmal funktioniert und tut seitdem nichts mehr. Keine Fehlerlampe.
Ursache: Erreicht der Chip das Programmende, bleibt er dort stehen. Er fängt nicht von selbst wieder oben an. Erst Rausnehmen und Wiedereinsetzen des Chips setzt ihn zurück.
Lösung: Jede Hauptschleife endet mit einem Sprung zurück, etwa j start.
NaN, weil kein Gerät passt
Symptom: Eine Regelung schaltet nie, obwohl der Wert eindeutig über der Grenze liegt.
Ursache: lbn mit Batchmodus 0 (Average) liefert NaN, wenn kein Gerät mit diesem Typ und Namen im Datennetz hängt. Ein Buchstabe falsch, ein Leerzeichen zu viel, Groß- statt Kleinschreibung, falscher Prefab-Hash, und schon ist es so weit. Jeder Vergleich mit NaN ist falsch, deshalb springt kein blt und kein bgt.
Lösung: Nach jedem Lesen prüfen:
lbn tRaum SENSOR HASH("Raum") Temperature 0
bnan tRaum start
Zum Nachzählen gibt es Batchmodus 4 (Count). Er liefert die Anzahl der passenden Geräte:
lbn anzahl SENSOR HASH("Raum") Temperature 4
Kommt 0 heraus, stimmt der Name oder der Typ nicht.
Batchmodus 3 (Maximum) liefert ohne Treffer nicht NaN, sondern minus unendlich. Minimum und Sum liefern 0. Auch das sieht harmlos aus und ist es nicht.
Sum statt Average
Symptom: Alles lief, bis jemand einen zweiten Sensor mit demselben Namen gebaut hat. Seitdem zeigt der Raum 600 K.
Ursache: Batchmodus 1 (Sum) addiert. Mit einem Gerät fällt das nicht auf, mit zwei verdoppelt sich der Wert.
Lösung: Für Messwerte immer 0 (Average).
Exakter Vergleich mit Kommazahlen
Symptom: beq tRaum 293.15 ziel springt nie.
Ursache: Messwerte und Rechenergebnisse landen praktisch nie genau auf einer Zahl. 293.1500001 ist nicht 293.15.
Lösung: Mit Grenzen arbeiten (blt, bgt) oder mit Toleranz vergleichen (bap, sap):
bap tRaum 293.15 0.01 ziel
Relativer Sprung mit Label
Symptom: Das Programm springt irgendwohin.
Ursache: Befehle mit r im Namen (jr, breq, brlt …) springen relativ, also um eine Anzahl Zeilen. Ein Label dahinter wird als Zahl genommen und zur aktuellen Zeile addiert. Kein Fehler, nur Chaos.
Lösung: Mit Labels nur j, jal und die b…-Befehle ohne r benutzen.
Zeilennummern als Sprungziel
Symptom: Nach dem Einfügen einer Kommentarzeile ist alles kaputt.
Ursache: j 12 springt zu Zeile 12. Jede eingefügte Zeile, auch eine leere oder ein Kommentar, verschiebt alles darunter.
Lösung: Labels.
Kein yield
Symptom: Keins, oder ein seltsam zuckendes Verhalten.
Ursache: Ohne yield führt der Chip pro Takt 128 Anweisungen aus und macht im nächsten Takt mitten in der Schleife weiter. Er liest dabei immer wieder dieselben, noch nicht aktualisierten Werte.
Lösung: yield an den Anfang der Hauptschleife.
Umlaute in HASH
Symptom: HASH("Küche") findet das Gerät „Küche“ nicht.
Ursache: Der Chip speichert nur einfache Zeichen. Beim Schreiben auf den Chip wird aus dem Umlaut etwas anderes, und der Hash passt nicht mehr zum Namen am Gerät.
Lösung: Geräte ohne Umlaute benennen: „Kueche“.
LED-Anzeige zeigt 294 °C
Ursache: Die LED-Anzeige im Celsius-Modus hängt nur „°C“ an den Wert, rechnet aber nicht um.
Lösung: Vor dem Schreiben 273.15 abziehen.
sleep wartet viel zu lange
Ursache: sleep rechnet in Sekunden, nicht in Takten. sleep 10 sind 10 Sekunden, also 20 Takte.
Die lauten Fehler
Befehl unbekannt
Befehle sind exakt und klein geschrieben. L r0 d0 Setting ist falsch, l r0 d0 Setting richtig. Häufige Verwechslungen aus anderen Sprachen:
| Falsch | Richtig |
|---|---|
mov | move |
jmp | j |
call, ret | jal und j ra |
inc r0 | add r0 r0 1 |
log10 | gibt es nicht; log ist der natürliche Logarithmus |
nop | gibt es nicht |
Zahl mit Exponent
1e5 ist für den Chip keine Zahl. Ausschreiben: 100000.
LogicType an einer Zahlenstelle
An der Stelle, wo ein LogicType erwartet wird, reicht der Name: l r0 d0 Temperature. Überall sonst braucht er den Vorsatz: move r0 LogicType.Temperature.
Gerät kann den Wert nicht
Nicht jedes Gerät kennt jeden LogicType, und längst nicht jeder Wert lässt sich schreiben. Liest oder schreibt der Chip etwas, das das Gerät nicht kann, hält er an. Welche Werte ein Gerät hat, zeigt die Stationpedia im Spiel.
Register außerhalb von r0 bis r15
r16 ist sp, r17 ist ra. Wer sie als normale Register benutzt, zerschießt sich Stapel und Unterprogramme. Mehr als r17 gibt es nicht.
Kein Datenkabel am Gehäuse
lbn, sbn und Co. laufen über das Datennetz. Hängt das IC-Gehäuse an keinem Datenkabel, hält der Chip mit Fehler an.
Doppelte Namen
Zweimal dasselbe define oder zweimal dasselbe Label ergibt einen Fehler.
put mit vertauschten Werten
Die Reihenfolge ist put gerät adresse wert. Wer Adresse und Wert tauscht, schreibt an eine falsche Stelle.
Programm zu lang
| Grenze | Wert |
|---|---|
| Zeilen | 128 |
| Zeichen pro Zeile | 90 |
| Zeichen gesamt | 4096 |
Alles zählt mit, auch Kommentare und Leerzeilen. Bei vielen Kommentaren platzt meist zuerst das Zeichenlimit.
Die Fehlercodes
Bricht der Chip mit Fehler ab, gehört dazu ein Fehlercode. Die wichtigsten:
| Code | Name | Bedeutung |
|---|---|---|
| 2 | IncorrectVariable | Operand ist an dieser Stelle falsch |
| 3 | IncorrectVariableType | falscher Typ, etwa Register statt Gerät |
| 4 | IncorrectLogicType | unbekannter oder unpassender LogicType |
| 6 | IncorrectArgumentCount | zu viele oder zu wenige Operanden |
| 7 | DeviceNotSet | am Pin hängt kein Gerät |
| 8 | JumpTagDuplicate | Label doppelt |
| 9 | UnrecognisedInstruction | Befehl unbekannt (Tippfehler, Großschreibung) |
| 11 | OutOfRegisterBounds | Register außerhalb des Bereichs |
| 12 | OutOfDeviceBounds | Pin außerhalb von d0–d5 |
| 17 | StackOverFlow | Stapel voll |
| 18 | StackUnderFlow | pop auf leeren Stapel |
| 19 | ExtraDefine | Name schon vergeben |
| 20 | DeviceListNull | kein Datennetz am Gehäuse |
| 25 | DeviceNotFound | Gerät mit dieser ReferenceId nicht gefunden |
| 38 | AliasNotFound | alias-Name unbekannt |
Fehler schneller finden
- Werte sichtbar machen: Zwischenergebnisse auf eine LED-Anzeige schreiben (
sbnmitSetting) oder mits db Setting r0ins Gehäuse. - Klein anfangen: Erst nur lesen und anzeigen, dann schalten.
- Mit Count zählen, ob die Geräte überhaupt gefunden werden.
- Im Tablet testen: Das IC10 Editor-Tablet zeigt Fehler und Warnungen schon beim Tippen, kennt die stillen Fallen von oben und hat einen Simulator mit dem echten Interpreter des Spiels.