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.