www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bits aus Register laden


Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte aus Datensegmenten (.dw 0b1101010), Stück für Stück die Bits 
auslesen, damit ich sie über >einen Pin< ausgeben kann.

Wie kann ich das machen in Assembler?
Das Tutorial hilft da nicht...
Und wenn es in der Datensammlung zu finden ist, wo finde ich diese?

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sören Timm schrieb:
> Hallo,
> ich möchte aus Datensegmenten (.dw 0b1101010), Stück für Stück die Bits
> auslesen, damit ich sie über >einen Pin< ausgeben kann.
>
> Wie kann ich das machen in Assembler?
> Das Tutorial hilft da nicht...
> Und wenn es in der Datensammlung zu finden ist, wo finde ich diese?


Vielleicht einfach mal logisch schieben und jeweils das LSB nehmen?!? 
Solche Grundlagen werden im AVR-Tutorial behandelt...


Volker

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>.dw 0b1101010 ??????

MfG Spess

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker Schulz schrieb:
> Vielleicht einfach mal logisch schieben und jeweils das LSB nehmen?!?
> Solche Grundlagen werden im AVR-Tutorial behandelt...

An welcher stelle denn?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Vielleicht einfach mal logisch schieben und jeweils das LSB nehmen?!?
>Solche Grundlagen werden im AVR-Tutorial behandelt...

Oder das T-Flag benutzen.

MfG Spess

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Oder das T-Flag benutzen.

Daran dachte ich auch schon...
Aber wie könnte ich den jeden einzelnen Bit aus dem Datenbereich nach 
und nach in die T-Flag schieben?

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sören Timm schrieb:
> Volker Schulz schrieb:
>> Vielleicht einfach mal logisch schieben und jeweils das LSB nehmen?!?
>> Solche Grundlagen werden im AVR-Tutorial behandelt...
>
> An welcher stelle denn?

Bei Logik und Arithmetik... Wo es hingehoert...


Volker

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Aber wie könnte ich den jeden einzelnen Bit aus dem Datenbereich nach
>und nach in die T-Flag schieben?

Über Register.

LDS r16, Speicher
in r17,Portx
bst r16,n
bld r17,m
out r17,Portx

Wenn die Bits schon in der richtigen Reihenfolge vorliegen ist Schieben 
allerdings günstiger.

MfG Spess

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn die Bits schon in der richtigen Reihenfolge vorliegen ist Schieben
> allerdings günstiger.
Wie ist das denn mit dem schieben gemeint?

Kannste dazu mal einen Beispielcode zeigen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.equ    spi_port = portb
.equ    spi_dout = pb1
.equ    spi_ck = pb2

;input: r16 = byte
spi_out:
        sec                             ; r16 = 0 after 8 * shift
_spi1:
        cbi     spi_port, spi_dout
        sbrc    r16, 0                  ; LSB first
        sbi     spi_port, spi_dout
        cbi     spi_port, spi_ck
        sbi     spi_port, spi_ck
        lsr     r16
        brne    _spi1
        ret

Das nennt sich auch SPI.


Peter

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
im Beispiel wird das MSB (oberstes bit) überprüft:

(wert in r17 an PORTD4 rausschieben)

  ld  r17, 0b1101010   ;dein beispielwert
  ldi r16, 8           ;Zähler für durchläufe
naechstes_bit:
  sbrs r17, 7          ;falls MSB=1, überspringe
   cbi PORTD, 4            ;PD4 loeschen
  sbrc r17, 7          ;falls MSB=0, überspringe
   sbi PORTD, 4            ;PD4 setzen

  lsl r17              ;schieben für weiteren Durchlauf

  dec r16
  brne naechstes_bit

;weiter im programm

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Wie ist das denn mit dem schieben gemeint?

Dafür gibt es die Befehle z.B. 'lsl' - Linksschieben und 
'lsr'-Rechtsschieben.
      lds r16,Speicher
      in r17,PortX
      ldi r18,8
aaa:  cbi r17,n         ; Bit löschen
      sbrc r16,0        
      sbi r17,n         ; Wenn Bit=1         
      out PortX,r17     ; Ausgeben
      lsl r16           ; nächstes Bit
      dec r18           ; alle Bits?  
      brne aaa

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Korrektur:

      lsl r16           ; nächstes Bit
muss
      lsr r16           ; nächstes Bit

heissen.

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum wird erst ein Port eingelesen?

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RTFM!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ups. 'cbi' und sbi' sollten eigentlich 'cbr' und 'sbr' mit '1<<n' sein.

'cbi' und sbi' sind nur für IO-Adressen 0..31 anwendbar. 'in/out' im 
Bereich 0..63. Darüber statt 'in/out' 'lds/sts' benutzen.

>Warum wird erst ein Port eingelesen?

Um die anderen Portpins nicht zu beeinflussen.
      lds r16,Speicher
      in r17,PortX
      ldi r18,8
aaa:  cbr r17,1<<n      ; Bit löschen
      sbrc r16,0        
      sbr r17,1<<n      ; Wenn Bit=1         
      out PortX,r17     ; Ausgeben
      lsr r16           ; nächstes Bit
      dec r18           ; alle Bits?  
      brne aaa
      ....

Variante mit 'cbi/sbi':
      lds r16,Speicher
      ldi r18,8
aaa:  lsr r16           ; Bit0 von r16 ins Carry-Flag
      brcs bbb          ; wenn 1
      cbi PortX,n       ; wenn 0
      rjmp ccc
bbb:  sbi PortX,n
ccc:  dec r18           ; alle Bits?  
      brne aaa
      ....

MfG Spess

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Vielleicht einfach mal logisch schieben und jeweils das LSB nehmen?!?
Wie kann ich denn das LSB und MSB auslesen?
Das geht mir nicht aus dem Tutorial hervor.

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.