Word Bit auslesen

//_________________________________________________
// *** zum testen
L MD 404
TAD // Reihenfolge der Byte drehen (evtl. musst du die Reihenfolgen nicht drehen, ja nachdem wie sie bereits drinstehen)
RRD 16 // Worte Tauschen
T #DWordDatei // DWORD-Variable im Lokaldatenbeieich laden
//_________________________________________________

//_________________________________________________
// *** Abfrage
LAR1 P##DWordDatei // Adressoffset laden
L BitNummer // Die Bitnummer wählen (bei DWORD 0..31) (bei WORD 0..15)
+AR1 // Die Bits zum Adressregister addieren
U L [AR1,P#0.0] // auf die Bitnummer zugreifen (hier lokaldaten)
= #OK
//_________________________________________________

Falls du noch mehr mit dem Adressregister machst das sichern (vorher) und wiederherstellen (nach dem zugriff) nicht vergessen.


Ich kanns im moment leider nicht mehr testen, aber das sieht schon elegant aus. :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
...
Das niederwertigste Bit habe ich als BitNr 1 abgefragt.
...
das habe ich schon so gemeint. :)
Oben hast Du was anderes gesagt:
...
Und zur Sicherheit - Bit 5 ist dann das 6. Bit, ja?
jup.
...
Aber wenn Du jetzt weist, wie Du abfragst, ist's OK.
 
Code:
      LAR1  P##Dword            // Adressoffset laden
      L     #Bitstelle                  // Die Bitnummer wählen (bei DWORD 0..31) (bei WORD 0..15)
      +AR1                              // Die Bits zum Adressregister addieren
      U     L [AR1,P#0.0]               // auf die Bitnummer zugreifen (hier lokaldaten)
      L     0                                // Lade 0
      ==D                                  // Vergleiche 0 mit der ausgewählten bitstelle, ob sie auch 0 ist
       =     #_OK
      S     M     70.5

Ich schreibe das Dword sicherheitshalber davor in einen DB, um zu sehen was wirklich drin steht. 101010101010...immer abwechselt true, false, true, false. Normalerweise müsste sich der Merker im selben Rhythmus setzen, passiert leider nicht. :(
 
Da konntest Du den Code von Joe trotz Kommentar nicht richtig lesen!
Mit der den Zeilen:
Code:
U L [AR1, P#0.0]
= #_OK
greifst Du schon direkt auf das Bit zu, wie z.B. bei:
Code:
U E0.0
= M70.5
Deine L 0 und ==D müssen also weg!
Das L in der UND Zeile steht übrigens nicht für LADEN sondern für den Lokaldatenbereich, im FC also eine Temp-Variable!

PS: das Setzen ganz am Schluß solltest Du auch wegnehmen, da Du kein Rücksetzen hast. Besser wäre also:
Code:
= M70.5
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
U L [AR1, P#0.0]
= #_OK
dass ich hiermit auf das bit zugreife, sehe ich schon auch so.

Code:
L 0
==D
will ich ja nur abgleichen ob das geladene bit "false" ist oder nicht.

der Merker M70.5 dient nur der Kontrolle ob der Vergleich(==D) erfolgreich war.
 
Aber womit vergleichst du denn? Das letzte Laden vorher war die Bitnummer!
Und die (eigentlich gewollte) Zuweisung von #_OK machst Du auch zunichte, da der Vergleich vorher ist!
 
Zuletzt bearbeitet:
mhh ok.
ich dachte mit:
Code:
U L [AR1,P#0.0]
lade ich die bitstelle
und mit
Code:
L 0
lade ich eben eine 0
und vergleiche mit ==D eben, ob beide null sind.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, das ist eine UND-Zeile, deshalb der Vergleich:
... greifst Du schon direkt auf das Bit zu, wie z.B. bei:
Code:
U E0.0
= M70.5
...
Wie bereits gesagt, steht das L nicht für LADE sondern für Lokaldatenbereich:
...
Das L in der UND Zeile steht übrigens nicht für LADEN sondern für den Lokaldatenbereich, im FC also eine Temp-Variable!
...


PS: Und wie kann man D.M.n. ein Bit mit einem DWORD vergleichen?
Code:
...
==D
 
Zuletzt bearbeitet:
Wie bereits gesagt, steht das L nicht für LADE sondern für Lokaldatenbereich:

PS: Und wie kann man D.M.n. ein Bit mit einem DWORD vergleichen?
Code:
...
==D
danke hucki, ich seh schon du gibst dir mühe. :)
ich hab halt r,d und i zur verfügung. ist ja alles nicht so dolle. aber mit irgendwas muss ich ja das bit mit der 0 vergleichen.

ok. mein dword muss also die erste temp variable sein, sie beginnt ja bei 0.0 im lokaldatenbereich ?! ( oder ich passe den offset entsprechend an )

und wie kann ich dann herausfinden ob das bit true oder false ist.
 
Wir reden immer noch aneinander vorbei.
Wie stellst Du normalerweise fest, ob ein Bit gesetzt ist. Wie stellst Du fest, ob Dein Eingang gesetzt ist und schaltest danach Deinen Ausgang ein/aus:
Code:
U E0.0
= A0.0
und jetzt sieh Dir Joe's Code an:
Code:
U L [AR1,P#0.0]
= #_OK
Die UND-Zeile im Klartext:
Code:
UND das Bit, das im Lokaldatenbereich an der Stelle steht, auf das das Adressregister AR1, plus den Versatz P#0.0, zeigt.
 
Zuletzt bearbeitet:
...
mein dword muss also die erste temp variable sein, sie beginnt ja bei 0.0 im lokaldatenbereich ?! ( oder ich passe den offset entsprechend an )...
die temp-Variable muss übrigens nicht an der ersten Stelle stehen! Wo sie wirklich steht bzw. beginnt, stellt diese Zeile fest:
Code:
[COLOR=#333333]LAR1 P##DWordDatei
[/COLOR]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      LAR1  P##Dword1           // Adressoffset laden
      L     #bitnummer                 // Die Bitnummer wählen (bei DWORD 0..31) (bei WORD 0..15)
      +AR1                              // Die Bits zum Adressregister addieren
      U     L [AR1,P#0.0]               // auf die Bitnummer zugreifen (hier lokaldaten)
      LAR2  P##Dword2
      L     #bitnummer
      +AR2  
      U     L [AR2,P#0.0]
      ==D   
      U     #_OK


Hucki:

mir ist eingefallen, ich würde auch gerne zwei dwords auf die selbe bitstelle vergleichen. mein ==D ist wieder am start ^^. das ist wahrscheinlich wieder falsch.
wie vergleicht man ar1 und ar2 ?
 
...
mein ==D ist wieder am start ^^. das ist wahrscheinlich wieder falsch.
wie vergleicht man ar1 und ar2 ?
aus dem Kopf, ungetestet:
Code:
[FONT=courier new]TAR1  #dTempAR1                   // Adressregister1 sichern
[/FONT][FONT=courier new]TAR2  #dTempAR2                   // Adressregister2 sichern[/FONT]
[FONT=courier new]
LAR1  P##DWordDatei1              // 1. Adressoffset laden[/FONT]
[FONT=courier new]LAR2  P##DWordDatei2              // 2. Adressoffset laden[/FONT]
[FONT=courier new]L     #BitNr                      // Die Bitnummer wählen (bei DWORD 0..31) (bei WORD 0..15)[/FONT]
[FONT=courier new]+AR1                              // Die Bits zum Adressregister1 addieren[/FONT]
[FONT=courier new]+AR2                              // Die Bits zum Adressregister2 addieren[/FONT]

[FONT=courier new]U     L [AR1,P#0.0]               // auf das Bit des 1. DWORD zugreifen[/FONT]
[FONT=courier new]=     #_OK1[/FONT]

[FONT=courier new]U     L [AR2,P#0.0]               // auf d[/FONT][FONT=courier new]as Bit des 2. DWORD[/FONT][FONT=courier new] zugreifen[/FONT]
[FONT=courier new]=     #_OK2[/FONT]

[FONT=courier new]U     #_OK1                       // Zustand 1. gesuchtes Bit mit
XN    #_OK2[/FONT][FONT=courier new]                       // Zustand 2. gesuchtes Bit vergleichen[/FONT][FONT=courier new]
=     #_OK3[/FONT][FONT=courier new]                       // wenn NICHT verschieden, dann GLEICH (NOT XOR)[/FONT][FONT=courier new]

LAR1  #dTempAR1                   // Adressregister1 wieder herstellen[/FONT]
[FONT=courier new]LAR2  #dTempAR2                   // Adressregister2 wieder herstellen[/FONT]
Jetzt solltest Du vorher auf jeden Fall das Adressregister2 sichern, deswegen hab' ich es für beide AR mit reingeschrieben.
 
Da ich schon lange nichts mehr mit der 300er und deren Adressregistern gemacht habe ->

Wie sichert man das/die Adressregister und stellt es/sie anschließend wieder her?
Und sollte man sich angewöhnen, dies grundsätzlich zu tun oder nur in bestimmten Fällen?
Bei Multiinstanzen ist es Pflicht, wenn du mit dem Adressregister 2 arbeitest.
Grundsätzlich ist es keine schlechte Angewohnheit.

Code:
      TAR1  #dTempAR1                   //Adressregister retten
      TAR2  #dTempAR2

      ...
      ...
      //Hier steht dann irgendeine Operation wo das Adressregister Vergerwaltigt wird
      ...
      ...

      LAR1  #dTempAR1
      LAR2  #dTempAR2                   //Adressregister zurückschreiben


@admins,
ich hab' bei der Gelegenheit gerade gemerkt, daß ich meine zitierte Frage im falschen Thread gestellt hatte.
Die bezog' sich eigentlich auf Joes Code in diesem Thread.
Ist es möglich und macht es Sinn, die Frage und zugehörigen Antworten hier noch nachträglich rein zu verschieben?
PS: Müßte dann zwischen Post 23 und 24.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
aus dem Kopf, ungetestet:
Code:
[FONT=courier new]TAR1  #dTempAR1                   // Adressregister1 sichern
[/FONT][FONT=courier new]TAR2  #dTempAR2                   // Adressregister2 sichern[/FONT]
[FONT=courier new]
LAR1  P##DWordDatei1              // 1. Adressoffset laden[/FONT]
[FONT=courier new]LAR2  P##DWordDatei2              // 2. Adressoffset laden[/FONT]
[FONT=courier new]L     #BitNr                      // Die Bitnummer wählen (bei DWORD 0..31) (bei WORD 0..15)[/FONT]
[FONT=courier new]+AR1                              // Die Bits zum Adressregister1 addieren[/FONT]
[FONT=courier new]+AR2                              // Die Bits zum Adressregister2 addieren[/FONT]

[FONT=courier new]U     L [AR1,P#0.0]               // auf das Bit des 1. DWORD zugreifen[/FONT]
[FONT=courier new]=     #_OK1[/FONT]

[FONT=courier new]U     L [AR2,P#0.0]               // auf d[/FONT][FONT=courier new]as Bit des 2. DWORD[/FONT][FONT=courier new] zugreifen[/FONT]
[FONT=courier new]=     #_OK2[/FONT]

[FONT=courier new]U     #_OK1                       // Zustand 1. gesuchtes Bit mit
XN    #_OK2[/FONT][FONT=courier new]                       // Zustand 2. gesuchtes Bit vergleichen[/FONT][FONT=courier new]
=     #_OK3[/FONT][FONT=courier new]                       // wenn NICHT verschieden, dann GLEICH (NOT XOR)[/FONT][FONT=courier new]

LAR1  #dTempAR1                   // Adressregister1 wieder herstellen[/FONT]
[FONT=courier new]LAR2  #dTempAR2                   // Adressregister2 wieder herstellen[/FONT]
Jetzt solltest Du vorher auf jeden Fall das Adressregister2 sichern, deswegen hab' ich es für beide AR mit reingeschrieben.

getestet und für gut befunden. :)
 
Hast Du die einzelnen Zeilen von Joes Programm und meiner daraus resultierenden Erweiterung auch verstanden?
Dieser Post ließ nicht gerade darauf schließen:
Code:
      LAR1  P##Dword1           // Adressoffset laden
      L     #bitnummer                 // Die Bitnummer wählen (bei DWORD 0..31) (bei WORD 0..15)
      +AR1                              // Die Bits zum Adressregister addieren
      U     L [AR1,P#0.0]               // auf die Bitnummer zugreifen (hier lokaldaten)
      LAR2  P##Dword2
      L     #bitnummer
      +AR2  
      U     L [AR2,P#0.0]
      ==D   
      U     #_OK


Hucki:

mir ist eingefallen, ich würde auch gerne zwei dwords auf die selbe bitstelle vergleichen. mein ==D ist wieder am start ^^. das ist wahrscheinlich wieder falsch.
wie vergleicht man ar1 und ar2 ?
Wenn Dir einzelne Sachen nicht ganz klar sind, frag' ruhig - dafür ist das Forum da!
 
PS: Den 3.Vergleich:
...
Code:
[FONT=courier new]...
U     L [AR1,P#0.0]               // auf das Bit des 1. DWORD zugreifen[/FONT]
[FONT=courier new]=     #_OK1[/FONT]

[FONT=courier new]U     L [AR2,P#0.0]               // auf d[/FONT][FONT=courier new]as Bit des 2. DWORD[/FONT][FONT=courier new] zugreifen[/FONT]
[FONT=courier new]=     #_OK2[/FONT]

[FONT=courier new]U     #_OK1                       // Zustand 1. gesuchtes Bit mit
XN    #_OK2[/FONT][FONT=courier new]                       // Zustand 2. gesuchtes Bit vergleichen[/FONT][FONT=courier new]
=     #_OK3[/FONT][FONT=courier new]                       // wenn NICHT verschieden, dann GLEICH (NOT XOR)[/FONT][FONT=courier new]
[/FONT][FONT=courier new]...[/FONT]
...
kannst Du auch direkt (ohne die Zwischenzuweisungen) machen:
Code:
[FONT=courier new]...
U     L [AR1,P#0.0]               // [/FONT][FONT=courier new]Zustand 1. gesuchtes Bit mit[/FONT]
[FONT=courier new]XN    L [AR2,P#0.0]               // [/FONT][FONT=courier new]Zustand 2. gesuchtes Bit vergleichen[/FONT]
[FONT=courier new]=     #_OK3[/FONT][FONT=courier new]                       // wenn NICHT verschieden, dann GLEICH (NOT XOR)[/FONT][FONT=courier new]
[/FONT][FONT=courier new]...[/FONT]
 
Zurück
Oben