Bit nachschieben oder Bitfolge füllen

OP #828028
Lesenswert?

Hi leute

Also bei mir wird ein Interrupt ausgelöst bei dem jedesmal der Status 
eines Ports abgefragt wird!

Nun soll eigentlich nichts anderes geschehen als eine Bitfolge seriell 
einzulesen!

also bin nun soweit dass das interrupt eben hochkommt und den port 
abfragt auf 0 oder 1 nun soll ein register beschrieben werden.

Also 1 Auftreten des Interrupts Status = 1
Register 0b00000001

2. Auftreten des Interrupts Status = 1
Register 0b00000011

3. Auftreten des Interrupts Status = 0
Register 0b00000110

usw.

mit welchen Befehl kann ich Bits schieben und dann eben noch ein 
spezielles Bit nachschieben
Persönliche Seite #828063
Lesenswert?

Am einfachsten:  (alles natürlich beispielhaft)
1
in r17, PORTA ;Port einlesen
2
andi r17, 0b0001000 ; gewünschtes Bit Maskieren
3
subi r17, 0xFF ; Testen ob 0 und ggf Carry setzen (0xFF-0 = kein Carry -1= Carry)
4
ror r16 ; rechts --> Carry wird vorne reingeschoben
Vieleicht gehts eleganter kam mir aber gerade so in den Kopf ;)

braucht 1+1+1+1 = 4 Takte
#828125
Lesenswert?

Hallo,

außer, daß die Formulierung:
>also bin nun soweit dass das interrupt eben hochkommt und den port
abfragt auf 0 oder 1 nun soll ein register beschrieben werden.

etwas unklar ist (ein Port hat beim AVR 8 Bit...)

falls Du ein bestimmtes Bit meinst (immer das gleiche):

sec  ; carry setzen
sbis Port, Bit ; wenn Bit gesetzt -> ok
clc           ; sonst C löschen
rol r16      ; und reinschieben nach links.

Gruß aus Berlin
Michael
Gast #828829
Lesenswert?

Hi

Es gibt übrigens auch direkte Bittransferbefehle:

BST rXY,n  Damit wird das Bit n eines Registers r0..r31 in das T-Flag 
kopiert
BLD rXY,n  Kopiert T-Flag nach Bit n des Registers rXY (r0..r31).

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren