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?
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
Volker Schulz schrieb: > Vielleicht einfach mal logisch schieben und jeweils das LSB nehmen?!? > Solche Grundlagen werden im AVR-Tutorial behandelt... An welcher stelle denn?
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
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?
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
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
> 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?
1 | .equ spi_port = portb |
2 | .equ spi_dout = pb1 |
3 | .equ spi_ck = pb2 |
4 | |
5 | ;input: r16 = byte |
6 | spi_out: |
7 | sec ; r16 = 0 after 8 * shift |
8 | _spi1: |
9 | cbi spi_port, spi_dout |
10 | sbrc r16, 0 ; LSB first |
11 | sbi spi_port, spi_dout |
12 | cbi spi_port, spi_ck |
13 | sbi spi_port, spi_ck |
14 | lsr r16 |
15 | brne _spi1 |
16 | ret |
Das nennt sich auch SPI. Peter
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
Hi
>Wie ist das denn mit dem schieben gemeint?
Dafür gibt es die Befehle z.B. 'lsl' - Linksschieben und
'lsr'-Rechtsschieben.
1 | lds r16,Speicher |
2 | in r17,PortX |
3 | ldi r18,8 |
4 | aaa: cbi r17,n ; Bit löschen |
5 | sbrc r16,0 |
6 | sbi r17,n ; Wenn Bit=1 |
7 | out PortX,r17 ; Ausgeben |
8 | lsl r16 ; nächstes Bit |
9 | dec r18 ; alle Bits? |
10 | brne aaa |
MfG Spess
Hi Korrektur: lsl r16 ; nächstes Bit muss lsr r16 ; nächstes Bit heissen.
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.
1 | lds r16,Speicher |
2 | in r17,PortX |
3 | ldi r18,8 |
4 | aaa: cbr r17,1<<n ; Bit löschen |
5 | sbrc r16,0 |
6 | sbr r17,1<<n ; Wenn Bit=1 |
7 | out PortX,r17 ; Ausgeben |
8 | lsr r16 ; nächstes Bit |
9 | dec r18 ; alle Bits? |
10 | brne aaa |
11 | .... |
Variante mit 'cbi/sbi':
1 | lds r16,Speicher |
2 | ldi r18,8 |
3 | aaa: lsr r16 ; Bit0 von r16 ins Carry-Flag |
4 | brcs bbb ; wenn 1 |
5 | cbi PortX,n ; wenn 0 |
6 | rjmp ccc |
7 | bbb: sbi PortX,n |
8 | ccc: dec r18 ; alle Bits? |
9 | brne aaa |
10 | .... |
MfG Spess
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.