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
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.
sagen wir ich hab einfach eine Abfrage mit Sprüngen also einmal ein Befehl für mit 1 Schieben und einmal mit 0 Schieben AVR Assembler
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
1 | LSL my_bitbuffer ; 0 reinschieben |
2 | BRxx found_a_zero ; Hier deine Bedingung einfügen |
3 | INC my_bitbuffer ; 1 dazuaddieren |
4 | found_a_zero: |
Ich kann gerade nicht einschätzen, was die genau fehlt um das selbst zu formulieren.
Hi clc - Carry Flag löschen sec - Carra Flag setzen rol Register - Carry Flag nach Bit0 MfG Spess
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
oder so: lsl shiftbyte ;Null einschieben sbic port,portpin ;ist Portpin gesetzt? - nein... inc shiftbyte ;ja, Bit 0 setzen (abgeguckt bei PeDa) ...
@Thomas Ich habe Dir mal ein Programm angehängt. (Bascom) Damit realisiere ich ein 16-Bit-Schieberegister. Vielleicht kannst Du daraus Deine Lösung ableiten. MfG Paul
Wow super danke für die Antworten!! die helfen mir auf jeden fall weiter! Ja Sry meinte Pin nicht Port gg hoffe nur dass ganze funktioniert im ganzen dann auch! Bin ja mal gespannt! Also nochmals besten Dank
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
@Herbert von Karvenzmann Nein, hatte er nicht explizit gesagt. BTW: Heißt Du nicht eigentlich Kaventsmann ? Hochachtungsvoll Herbert von Caravan
> @Herbert von Karvenzmann > Nein, hatte er nicht explizit gesagt. Ich denke doch... Beitrag "Re: Bit nachschieben oder Bitfolge füllen" > BTW: Heißt Du nicht eigentlich Kaventsmann ? Das ist da durchaus möglich, aber Sie wissen ja, wie das mit Eigennamen ist. Gruß aus dem Karvendel, Herbert, der Karvenzmann
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.