Step 5 Konnte das jemals funktionieren?

borromeus

Level-1
Beiträge
2.271
Reaktionspunkte
329
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Freunde,

ich habe die Ehre auf einer 115U eine bestehende serielle Verbindung zu einem Endgerät so umzubauen, dass ein neues Endgerät damit funktioniert.
Das nur am Rande.

Ich habe hier zur Auswertung eines Statusbits (Busy) folgenden Code:

Code:
P1  :    L    DW 10    ;Pumpe 1
    L    KF +11
    ><F
    SPB    =P2  
    L    DR 1    ;Von E1 Status 
    SLW    13    ;bits 3-7 löschen
    L    KF +0
    ><F        ;Pumpe Busy
    =    M  197.0    ;Pumpe 1 ist Busy
    L    DR 1    ;Von E1 Status
    SRW    3    ;bit 0 löschen
    SLW    14    ;bits 2-7 löschen
    L    KF +0
    ><F        ;Pumpe Error
    =    M  199.0    ;Pumpe 1 hat Error

Meines Erachtens kann das doch nicht funktionieren, wenn er mit L DR1 ein Statusbyte liest (5te Zeile) und dann 13Bits nach links verschiebt, da kann ja nur "false" (Edit: in ANZ1 und ANZ0) drinnenstehen.


Edit2: und abgesehen davon ist die Abfrage mittels ><F nicht die probate Methode um das geschobene Bit auszuwerten.....

Sieht das wer anders?
 
Zuletzt bearbeitet:
DR ist ein Byte, aber mit Lade DR1 kommt das doch in den 16 Bit breiten Akku rein. Dann kann er 13 Bit nach links schieben, würde ich sagen.
 
Meines Erachtens kann das doch nicht funktionieren, wenn er mit L DR1 ein Statusbyte liest (5te Zeile) und dann 13Bits nach links verschiebt, da kann ja nur "false" (Edit: in ANZ1 und ANZ0) drinnenstehen.


Edit2: und abgesehen davon ist die Abfrage mittels ><F nicht die probate Methode um das geschobene Bit auszuwerten.....
Das ist ein Trugschluß. Es wird nicht das Byte um 13 Bits verschoben sondern der AKKU1-L. Und es wird nicht das letzte geschobene Bit ausgewertet sondern die niedrigsten 3 Bits des DR 1.

Dieser Code testet, ob irgendeines der 3 niedrigsten Bits des DR1 gesetzt ist:
Code:
    L    DR 1      ;Byte DR 1 in AKKU1 laden                 oooooooo_76543210
    SLW    13      ;obere 13 Bit aus AKKU1-L herausschieben  210ooooo_oooooooo
    L    KF +0
    ><F            ;verbliebene 3 niedrigste Bits von DR 1 testen
    =    M  197.0  ;mindestens eines der Bits ist 1

Ich weiß jetzt nicht, warum der Programmierer für die Bit-Isolierung Schiebeoperationen benutzt hat - man sieht ja immer wieder, daß viele Programmierer mit Wordverknüpfungsoperationen und speziell mit dem Verfahren der Bit-Maskierung ein bißchen auf Kriegsfuß stehen. Das Testen der Bits kann man auch per Maskierung machen:
Code:
    L    DR 1      ;Byte DR 1 in AKKU1 laden                 oooooooo_76543210
    L    KH 0007   ;(KF +7) Bitmaske                         oooooooo_ooooo111
    UW             ;alle Bits außer die niedr. 3 ausblenden  oooooooo_ooooo210
    L    KF +0
    ><F            ;hat das einen Wert <> 0 ergeben?
    =    M  197.0

Harald
 
@PN/DP

Das haben wir früher auch mit Schieben gemacht, keine Ahnung, wer das mal angeschleppt hat. Inzwischen maskiere ich auch eher aus. ;-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
L DW, L DR und L DL sowie L MB und L MW laden immer in den AKKU rechtsbündig.
das HighByte bzw. das HighWort wird mit 0 geladen. (der AKKU ist ja 32 Bit)

Bei der Schiebeoperation wird bei SRW warscheinlich das Bit 31, wenn es 1 ist, durch weitere 1er geschoben. Vorzeichenbit.
Weiss dies allerdings nicht mehr sicher. Vielleicht wirkt sich das auch nur bei L DD, MD aus.
 
Bei den 115U CPUs ist der Akku lediglich 16 Bit breit.
Es gibt eine S5-115 CPU945, deren AKKUs sind 32 Bit breit.
Die Größe der AKKUs spielt hier aber keine Rolle, weil bei jeder Ladeoperation der Operand ggf. mit 0-Bits auf die Größe des AKKU1 erweitert wird ...
Bei der Schiebeoperation wird bei SRW warscheinlich das Bit 31, wenn es 1 ist, durch weitere 1er geschoben. Vorzeichenbit.
... und weil SLW/SRW nur die untersten 16 Bit (AKKU1(-L)) schiebt - eventuell vorhandene höhere Bits 16 bis 31 (AKKU1-H) werden durch SLW/SRW absolut nicht beeinflußt.

Harald
 
Zurück
Oben