Forum: Mikrocontroller und Digitale Elektronik Assembler Bits im byte tauschen


von Holger Gebauer (Gast)


Lesenswert?

Hallo,

wie kann ich es am einfachsten die Bits eines bytes zu tauschen?
Ich möchte das aus
01011010
10100101
wird.
Das ist für das Invertieren eines Displays.
Dort muss ich bite tauschen für das übertragen an das GLCD.
Danke.
von Holger Gebauer (Gast)


Lesenswert?

Holger Gebauer schrieb:
> Hallo,
>
> wie kann ich es am einfachsten die Bits eines bytes zu tauschen?
> Ich möchte das aus
> 01011010
> 10100101
> wird.
> Das ist für das Invertieren eines Displays.
> Dort muss ich bite tauschen für das übertragen an das GLCD.
> Danke.

Das ist für einen Atmel
von NxOrT (Gast)


Lesenswert?

Du möchstest die Bit nicht tauschen, sondern invertieren:

Value = Value XOR 0xFF

oder

Value = NOT Value
von spess53 (Gast)


Lesenswert?

Hi

>Das ist für das Invertieren eines Displays.

com rxy

MfG Spess
von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Holger Gebauer schrieb:
> Hallo,
>
> wie kann ich es am einfachsten die Bits eines bytes zu tauschen?
> Ich möchte das aus
> 01011010
> 10100101
> wird.
> Das ist für das Invertieren eines Displays.
>...
>
Wahrscheinlich weißt DU es bereits.

COM – One’s Complement
Description:
This instruction performs a One’s Complement of register Rd.

Oder ganz einfach, alle Bits werden invertiert, genau was DU brauchst.
Geht sogar mit allen Arbeitsregistern ( General Purpose Register 0-31 )

ldi r1, 0b01011010
com r1

Bernd_Stein
von Holger Gebauer (Gast)


Lesenswert?

Super werde ich testen.
Danke erstmal.
Ich melde mich dann.
von Holger Gebauer (Gast)


Lesenswert?

TOP.
Super geht.
danke erstmal, ich brauche bestimmt noch was.
von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Vielleicht hilft dir auch der Link weiter:

http://atmel.com/dyn/resources/prod_documents/doc0856.pdf

ist ne Liste aller Assemblerbefehle, mir nützt das öfters was

Dennis
von Holger Gebauer (Gast)


Lesenswert?

Super danke.
Ja da habe ich schön öfters gelesen, nur machmal sitz man auf dem 
Schlauch.
Jetzt hae ich noch was.
Bin gerade dabei den GLCD Treiber von Bascom in asm umzuwandeln.
Momentan fast 4mal schneler. :-)

Das war z. eine Schleife.

 If G_erase = 1 Then
   Gl_rstflag = 1
 Else
   Gl_rstflag = 0
 End If

das in ams

 LDS R25, {G_erase}
 ANDI  R25, 1           'alles ausser 1 wegmaskieren
 STS {Gl_rstflag} , R25

-----------------------
Jetzt brauche ich das.
Wie mache ich das am kürzesten:

If G_erase = 1 Then
  Gl_rstflag = 0
Else
  Gl_rstflag = 1
End If

wäre das dann so?

 LDS R25, {G_erase}
 ANDI  R25, 0           'alles ausser 0 wegmaskieren
 STS {Gl_rstflag} , R25

Danke.
von spess53 (Gast)


Lesenswert?

Hi

>Bin gerade dabei den GLCD Treiber von Bascom in asm umzuwandeln.

Halte ich für schlecht möglich. BASCOM hat nichts mit Assembler zu tun.

Um welches Grafikdisplay geht es?

MfG Spess
von Holger Gebauer (Gast)


Lesenswert?

Hi,

geht ja alles schon.
Nur bin ich gerade dran das Display zu Invertieren.
Das ist für das
SED1335 und SED13700 in 320*240

Ja man kann in Bascom einfach mitten im Programm mit Assembler 
weiterprogrammieren.

z.B.:
 'DISP ON
 Gl_cmd = Lcd_disp_on
 Gosub Send_cmd
 Gl_byte = Lcd_on
 Gosub Send_dat

   '--- Mod 8  'Calculate which bit to set  ----
   $asm
   lds R24, {Gl_x}
   Mod8:
    subi r24, 80
    brcs rest8
    subi r24, 80
    brpl sub8
   Rest8:
    subi r24, -80
   Sub8:
    subi r24, 8
    brpl sub8
    subi r24, -8
   Mod8_exit:
   LDI R25, 7
   !sub r25, r24

   sts {Gl_bit} , R25
   $end Asm
   '--------------------------------


    If Gl_rstflag = 0 Then
      Set Gl_read.gl_bit
    Else
      Reset Gl_read.gl_bit
    End If
    Gl_pix = Gl_read
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Holger Gebauer schrieb:
> Da war z. eine Schleife.
>  If G_erase = 1 Then
>    Gl_rstflag = 1
>  Else
>    Gl_rstflag = 0
>  End If
www.if-schleife.de

Holger Gebauer schrieb:
> If G_erase = 1 Then
>    Gl_rstflag = 1
>  Else
>    Gl_rstflag = 0
>  End If
>
> das in ams
>
>  LDS R25, {G_erase}
>  ANDI  R25, 1           'alles ausser 1 wegmaskieren
>  STS {Gl_rstflag} , R25
Was für ein Variablentyp ist G_erase?
Was ist Gl_rstflag?
Woher kommen die Werte und was wird mit dem Ergebnis gemacht?
Ohne diese Information würde ich diese 5 Bascom-Zeilen so abkürzen:
1
  Gl_rstflag = G_erase
Und damit:
1
  LDS R25, {G_erase}
2
  STS {Gl_rstflag},R25
Oder, was ohne weitere Information auch geht:
1
  mov Gl_rstflag,G_erase
Oder gar:
1
  .def  Gl_rstflag = r16
2
  .def  G_erase    = r16

Kurz: oft ist es einfacher, die Funktion zu verstehen und 
nachzuprogrammieren, als selber Compiler spielen zu wollen,
und Zeile für Zeile nachzuprogrammieren...
von Holger (Gast)


Lesenswert?

Super Danke.
Ich depp hätte selber drauf kommen können.
von MarioT (Gast)


Lesenswert?

Dennis H. schrieb:
> Vielleicht hilft dir auch der Link weiter:
>
> http://atmel.com/dyn/resources/prod_documents/doc0856.pdf
>
> ist ne Liste aller Assemblerbefehle, mir nützt das öfters was
>
> Dennis

http://www.avr-roboter.de/controller/befehle/uebersicht/uebersicht.html
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.