Bit hin und her shiften

Gast #119550
Lesenswert?

Nabend,

also mein Plan:

Ich habe im Register r16 diesen Wert: 0b11111110
Dieser Wert wird an PortB übertragen. LED1 = an;

Wenn ich jetzt nun auf einen Taster drücke möchte ich dieses Bit eine
stelle nach Links bewegen. Also dann auf:

0b11111101

Wenn ich dann auf einen anderen Drücke möchte ich dieses Bit wieder
eine stelle zurück setzen.

Hat einer einen Plan wie ich das anstellen könnt?

Gruss Dennis
Gast #119551
Lesenswert?

Schau Dir mal die Befehle rol und ror an. Du wirst das Carry-Flag vorher
setzen müssen, damit eine "1" links bzw. rechts hineingeshiftet wird.
Ferner sollten die Tasten entprellt sein - entweder per Soft- oder
Hardware. Du mußt sowohl das Drücken als auch das Loslassen der Taste
detektieren können.
Gast #119555
Lesenswert?

Wie löst man eigentlich das Problem, das bei ROL/ROR immer das
Carry-Flag mitgeshiftet wird, wenn man wie Dennis eigentlich nur die
Bits shiften möchte? Eine Möglichkeit wäre natürlich vor jedem
Einzelshift das Carry entsprechend zu setzen, aber wenn man um mehrere
Bits shiften will wäre das ja vergleichsweise zeitaufwendig...
Gast #119557
Lesenswert?

Hmmm, zum einen schaltest Du die internen Pull-Up-Widerstände für den
Eingabeport nicht ein (z.b. via "ldi tmp, 0xFF"/"out PORTD, tmp"
nachdem Du PortD als Ausgang definiert hast), ich weiss aber natürlich
nicht ob das bewusst getan wurde weil Du externe Pull-Ups hast.
Habe ich das denn richtig verstanden dass das Programm quasi abstürzt,
sobald Du Taster1 drückst? Eine LED zumindest müsste dem Programmcode
nach schon von Anfang an leuchten, zumindest wenn Du nicht schon vor
dem Einschalten eine Taste drückst.
Falls das Programm wirklich abstürzt, da könnte ich mir jetzt momentan
keinen richtigen Reim drauf machen. Höchstens dass Du nur SPL und nicht
SPH setzt, aber ich denke das ist vermutlich bewusst so (=Du benutzt
wahrscheinlich keinen ATmega).
Ein anderes "Problem" ist, dass der Shift in dieser Art
wahrscheinlich nicht exakt so funktioniert, wie Du Dir das evtl.
vorstellst: Bei ROL bzw. ROR wird wie bereits erwähnt immer das
Carry-Flag mitrotiert, wenn Du also 0b01111111 einmal ROLst, dann ist
das Ergebnis nicht zwingenderweise 0b11111110.

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