Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03451.jsonl.gz/745

Hallo Pius,
ich werde wahrscheinlich erst am kommenden Wochenende deine Vorschläge mal genauer anzuschauen und drüber nachzudenken. Aber Deine Frage kann ich jetzt schon beantworten.
SAVE_PORTB und SAVE_PORTD am Anfang des Programms sind (Sicherungs)kopien von PORTB und PORTD. Sie sind global, damit ich sie nicht an (eine) Funktion(en) gesondert übergeben muss.
Die Bitmanipulationen erfolgen in der 16 Bit Variable "value" in der Loop-Schleife. Ich habe das bewusst so gewählt, weil ich so keine zwei Variablen/Register mit Bedingungen bearbeiten muss (if wert > 64 oder ähnliches) , sondern alles in einer Variable in den zwei FOR-Schleifen erledigen kann. Wenn ich statt sieben vielleicht mal neun LEDs anschließen möchte, brauche ich nur die Grenzen der Laufvariable ändern, sonst nichts.
In der Funktion set_ports() werden die 16 Bit in zwei 8 Bit Werte aufgeteilt, damit ich die beiden 8 Bit Register beschreiben kann. Das geschieht dadurch, dass der SAVE_PORTX (also die Kopie und nicht das "Original) mit der passenden 8Bit Variante "geodert" wird und dieses Ergebnis PORTX zugewiesen wird. So habe ich alles in einem Rutsch gemacht ohne Bits, die nichts mit meinen LEDs zu tun haben zu verändern. Ich muss also nicht 7 Bits einzeln setzen.
Natürlich ginge das in die Hose, wenn ich z.b. alle 16 Bit der "value" Variable verändern würde. Dann brächte die "Sicherung" nichts. Darum ist das nicht so ganz ausgegoren. Das war nur ein erster Ansatz, wie ich mit möglichst wenig Aufwand, in einem Rutsch nur die Bits in den Registern manipuliere, welche gerade relevant sind,ohne andere "unbeteiligte" zu verändern. Z.B. wenn D0 und D1 auch noch für einen anderen Zweck genutzt würden.
Das "Auseinandernehmen" der 16 Bit Variable funktioniert auch mit einer etwas verständlicheren und deshalb wahrscheinlich auch besseren (weil Programmiererfreundlicheren) Variante. Satt der Dereferenzierung und dem Cast geht es auch wie folgt:
Die Erste und diese Variante funktionieren natürlich nur auf Systemen, die im Little Endian Format arbeiten. Ich nehme an, das trifft auf alle gängigen Amtels zu.
Wie gesagt, es waren meine ersten Versuche mit Registern und evtl. ist das, was ich mir da ausgedacht habe, aus verschiedenen Gründen gar nicht zweckmäßig. Aber funktioniert hat es.
Du hast in Deinem letzten Kommentar geschrieben, das funktioniert in der Amtel Umgebung nicht, weil PORTB keinen "const " Wert darstellt. Das verstehe ich gerade auch nicht so ganz. Const Werte können doch nach ihrer Initialisierung nicht mehr verändert werden. Aber Register Variablen müssen doch verändert werden können?!
Gruß Kai