avr asm bit-Ansteuerung

OP #1274189
Lesenswert?

Hi,

ich muss in meinem Programm in einem Register eine binäre Zahl 
eintragen, wo ich immer nur 1 oder 0 für das entsprechende Bit bekomme.

Es handelt sich um PS2.

Wie mache ich das am besten, ich hatte das so gedacht:

Bit an der Stelle k setzen/löschen:
sbr  state, k

nur ist das Problem, das es in Assembler dahinter eine Zahl kommen muss 
und keine weitere Variable, in diesem Falle das k sein darf.

Wie kann ich das dann lösen, das immer die Zahlen von 1 bis 7 dort 
hinkommen, entsprechnd dem k.
Das sollte dann möglichst ohne die Schleife funktioniere, das ich schau 
wie groß k ist und das ganze dann 8 mal, da ich es ja für alle 8 
einzelnen Bits brauche.

Habt ihr da eine Idee?

mfg
#1274193
Lesenswert?

Martin K. schrieb:

> Habt ihr da eine Idee?

Am einfachsten machst du das so, dass du immer Bit 0 setzt und nach 
links verschiebst.

   Ergebnis = 0
   für alle Bits 0 bis 7 {
     schiebe Ergebnis eine Stelle nach links
     setze Bit 0 abhängig von dem was du empfangen hast
   }


Bsp.
Wen du empfängst:  10110011

du startest mit einem Ergebnis von 0

   00000000

Eintritt in die Schleife. Schleifendurchgang 0

Ergebnis um 1 nach links schieben     00000000
die erste empfangene Ziffer ist 1     00000001

Schleifendurchgang 1

Ergebnis um 1 nach links schieben     00000010
die nächste empfangene Ziffer ist 0   00000010

Schleifendurchgang 2

Ergebnis um 1 nach links schieben     00000100
die nächste empfangene Ziffer ist 1   00000101

Schleifendurchgang 3

Ergebnis um 1 nach links schieben     00001010
die nächste empfangene Ziffer ist 1   00001011

Schleifendurchgang 4

Ergebnis um 1 nach links schieben     00010110
die nächste empfangene Ziffer ist 0   00010110

Schleifendurchgang 5

Ergebnis um 1 nach links schieben     00101100
die nächste empfangene Ziffer ist 0   00101100

Schleifendurchgang 6

Ergebnis um 1 nach links schieben     01011000
die nächste empfangene Ziffer ist 1   01011001

Schleifendurchgang 7

Ergebnis um 1 nach links schieben     10110010
die nächste empfangene Ziffer ist 1   10110011

E, voila. Nach 8 mal schieben und jeweils setzen des untersten Bits 
(oder auch nicht, je nach Erfordernis), steht im Ergebnisregister das 
richtige Ergebnis.
OP #1275521
Lesenswert?

Hi,

vielen Dank, super Idee, so funktioniert es!

Nur habe ich jetzt ein Problem mit den Befehlen:

  sbrs  temp, 0
  cbr    state, 1
  sbrc  temp, 0
  sbr    state, 1

das komische ist, das bei den "skip" Anweisungen das niedrigste Bit mit 
0 anzusprechen ist und bei den "Set/Clear"-Befehlen das niedrigste Bit 
mit 1 gesetz odr gelöscht wird.

Woran liegt das?

mfg
Persönliche Seite #1275579
Lesenswert?

Martin K. schrieb:
> Hi,
>
> vielen Dank, super Idee, so funktioniert es!
>
> Nur habe ich jetzt ein Problem mit den Befehlen:
>
>   sbrs  temp, 0
>   cbr    state, 1
>   sbrc  temp, 0
>   sbr    state, 1
>
> das komische ist, das bei den "skip" Anweisungen das niedrigste Bit mit
> 0 anzusprechen ist und bei den "Set/Clear"-Befehlen das niedrigste Bit
> mit 1 gesetz odr gelöscht wird.
>
> Woran liegt das?

SBRS/SBRC bekommen die Bitnummer.

SBR/CBR ist nur syntactic sugar für ORI / ANDI~

Die obige Sequenz geht aber auch als
1
BST  temp, 0
2
BLD  state, 0

wobei temp und state alias für Register sein müssen. Hat zudem den 
Vorteil, daß es auch für R0-R15 geht und nicht nur für R16-R31.

Johann
OP #1276825
Lesenswert?

Johann L. schrieb:
> Martin K. schrieb:

> Die obige Sequenz geht aber auch als
>
1
> BST  temp, 0
2
> BLD  state, 0
3
>
> Johann

Hi,

danke für die gute Idee, so funktioniert das natürlich gleich besser

>SBR/CBR ist nur syntactic sugar für ORI / ANDI~

wie meinst du das/ besser gesagt was heist das auf deutsch.
Gast #1276832
Lesenswert?

Hi

>wie meinst du das/ besser gesagt was heist das auf deutsch.

Gleicher Op-Code.

>Es handelt sich um PS2.

Soll das heissen, deine Bits kommen seriell rein? Wenn ja, dann einfach 
ins Carry-Flag schieben. Und von dort ins Ergebnis.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren