Bit nachschieben oder Bitfolge füllen

OP #828028
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
#828035
Welche Sprache? Welche Architektur?

in C
1
x = (x << 1) | new_bit;

in AVR-Assembler
1
(Bit irgendwie ins Carry-Bit befördern)
2
rol my_register ; Carry-Bit in den Register reinschieben

so in etwa?

Je nachdem woher dein Bit kommt kann man das natürlich noch verbessern.
Persönliche Seite #828063
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
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
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
Gast #828833
@Herbert von Karvenzmann
Nein, hatte er nicht explizit gesagt.

BTW: Heißt Du nicht eigentlich Kaventsmann ?

Hochachtungsvoll
Herbert von Caravan

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.