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
Gast
#1605018
Hi
>.dw 0b1101010 ??????
MfG Spess
Volker Schulz schrieb: > Vielleicht einfach mal logisch schieben und jeweils das LSB nehmen?!? > Solche Grundlagen werden im AVR-Tutorial behandelt... An welcher stelle denn?
Gast
#1605021
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
Gast
#1605033
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Das nennt sich auch SPI. Peter
Gast
#1605049
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
Gast
#1605052
Hi
>Wie ist das denn mit dem schieben gemeint?
Dafür gibt es die Befehle z.B. 'lsl' - Linksschieben und
'lsr'-Rechtsschieben.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
MfG Spess
Gast
#1605053
Hi
Korrektur:
lsl r16 ; nächstes Bit
muss
lsr r16 ; nächstes Bit
heissen.
Warum wird erst ein Port eingelesen?
RTFM!
Gast
#1605131
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Variante mit 'cbi/sbi':
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.