www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik avr asm bit-Ansteuerung


Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
BST  temp, 0
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

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> Martin K. schrieb:

> Die obige Sequenz geht aber auch als
>
> BST  temp, 0
> BLD  state, 0
> 
> 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.