Hallo, zusammen,
seit Tagen grübel ich über eine Logik, für die ich in C keine 10 Minuten gebraucht hätte, sie zum implementieren, incl. Rechner hochfahren, compilieren und linken.
Zur Anzeige des Sicherungszustandes des Hauses möchte ich im InfoDisplay einen 14-Byte-Text anzeigen lassen. Dort soll stehen, ob die BWM aktiv sind, nur die Reed-Kontakte des Erdgeschosses überwacht werden, das Schlafzimmerfenster überwacht wird usw. Letztlich sind insgesamt 9 Bits auszuwerten, von denen ein Teil auch in einem 8-Bit-Wert untergebracht sind.
Um daraus Text zu generieren, muss ich verschiedenste UNDs und Negationen durchführen. Und ständig schickt mir die Logik die unerschiedlichsten Strings auf den Bus. Also habe ich die Logikinitialisierungsphase überbrückt, mit Textselektoren gearbeitet, hier einen Binärauslöser, dort eine Sperre eingefügt, bis ich endlich nach nur 2 Tagen zu dem Punkt kam, dass bei Zustandsänderung nur noch zwei Texte auf den Bus geschickt wurde, einmal ein falscher, dann der richtige.
Manche mögen damit zufrieden sein, ich wollte aber verstehen, woran es liegt. Nun bin ich darauf gekommen, dass die Ursache darin liegt, dass die Berechnung der Logikbausteine eben seriell ist und nicht (pseudo)parallel.
Um das zu verdeutlichen, habe ich eine Testlogik beigefügt. Die Debug-Variable ist zu Beginn 0. Der obere Zweig prüft, ob die Bits 0 und 1 (aka Bit 1 und Bit 2) 0 sind, durch Negation 1, und UNDet diese. Das Ergebnis bedient die Sperre, die letztlich dann aufmacht, wenn die Bits 0 und 1 nicht gesetzt sind. Hinter der Sperre wird 1 auf den Wert addiert. Nach dem ersten Lauf hat die Variable also den Wert 1 und schließt über die nun 0 liefernde UND-Verknüpfung die Sperre, so dass am Ende der Wert der Variable 1 bleiben sollte.
Denkste. Lt. Eibmon kommt die Veriable locker über 20, bevor endlich mal die Sperre zumacht.
Nun mögen einige von euch sagen: Ist klar, dass es so ist. Nur bringt dieses Phänomen leider mit sich, dass ich keine Möglichkeit gefunden habe, die diversen UND-Verknüpfungen so zu synchronisieren, dass ein Gatter nicht mehrfach feuert, weil sich die verschiedenen Eingänge nacheinander ändern, weil deren Zulieferer nacheinander berechnet werden. Und damit werden unterschiedliche und häufig auch falsche Texte auf den Bus geschickt, weil eigentlich unwahre Bitkombinationen zwischenzeitlich doch mal kurz wahr waren.
Wie kann ich das synchronisieren?
Vielleicht hat jemand das Problem irgendwie gelöst. Vielleicht gibt es auch gar keine Lösung...
/Tokamak
seit Tagen grübel ich über eine Logik, für die ich in C keine 10 Minuten gebraucht hätte, sie zum implementieren, incl. Rechner hochfahren, compilieren und linken.
Zur Anzeige des Sicherungszustandes des Hauses möchte ich im InfoDisplay einen 14-Byte-Text anzeigen lassen. Dort soll stehen, ob die BWM aktiv sind, nur die Reed-Kontakte des Erdgeschosses überwacht werden, das Schlafzimmerfenster überwacht wird usw. Letztlich sind insgesamt 9 Bits auszuwerten, von denen ein Teil auch in einem 8-Bit-Wert untergebracht sind.
Um daraus Text zu generieren, muss ich verschiedenste UNDs und Negationen durchführen. Und ständig schickt mir die Logik die unerschiedlichsten Strings auf den Bus. Also habe ich die Logikinitialisierungsphase überbrückt, mit Textselektoren gearbeitet, hier einen Binärauslöser, dort eine Sperre eingefügt, bis ich endlich nach nur 2 Tagen zu dem Punkt kam, dass bei Zustandsänderung nur noch zwei Texte auf den Bus geschickt wurde, einmal ein falscher, dann der richtige.
Manche mögen damit zufrieden sein, ich wollte aber verstehen, woran es liegt. Nun bin ich darauf gekommen, dass die Ursache darin liegt, dass die Berechnung der Logikbausteine eben seriell ist und nicht (pseudo)parallel.
Um das zu verdeutlichen, habe ich eine Testlogik beigefügt. Die Debug-Variable ist zu Beginn 0. Der obere Zweig prüft, ob die Bits 0 und 1 (aka Bit 1 und Bit 2) 0 sind, durch Negation 1, und UNDet diese. Das Ergebnis bedient die Sperre, die letztlich dann aufmacht, wenn die Bits 0 und 1 nicht gesetzt sind. Hinter der Sperre wird 1 auf den Wert addiert. Nach dem ersten Lauf hat die Variable also den Wert 1 und schließt über die nun 0 liefernde UND-Verknüpfung die Sperre, so dass am Ende der Wert der Variable 1 bleiben sollte.
Denkste. Lt. Eibmon kommt die Veriable locker über 20, bevor endlich mal die Sperre zumacht.
Nun mögen einige von euch sagen: Ist klar, dass es so ist. Nur bringt dieses Phänomen leider mit sich, dass ich keine Möglichkeit gefunden habe, die diversen UND-Verknüpfungen so zu synchronisieren, dass ein Gatter nicht mehrfach feuert, weil sich die verschiedenen Eingänge nacheinander ändern, weil deren Zulieferer nacheinander berechnet werden. Und damit werden unterschiedliche und häufig auch falsche Texte auf den Bus geschickt, weil eigentlich unwahre Bitkombinationen zwischenzeitlich doch mal kurz wahr waren.
Wie kann ich das synchronisieren?
Vielleicht hat jemand das Problem irgendwie gelöst. Vielleicht gibt es auch gar keine Lösung...
/Tokamak
Kommentar