Forum: Mikrocontroller und Digitale Elektronik avr asm bit-Ansteuerung


von Martin K. (spyro07)


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

von Karl H. (kbuchegg)


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.

von Martin K. (spyro07)


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

von Johann L. (gjlayde) Benutzerseite


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

von Martin K. (spyro07)


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.

von spess53 (Gast)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Martin K. schrieb:
> Johann L. schrieb:
>>SBR/CBR ist nur syntactic sugar für ORI / ANDI~
>
> wie meinst du das/ besser gesagt was heist das auf deutsch.

Sagar diesen Zucker gibt's bei Onkel Wicki:
   http://de.wikipedia.org/wiki/Syntactic_Sugar

Johann

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.