Forum: Mikrocontroller und Digitale Elektronik Bit hin und her shiften


von Dennis Schmitt (Gast)


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

von thkais (Gast)


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.

von Dennis Schmitt (Gast)


Lesenswert?

Hi,

hab auch noch was gefunden:

lsl (logical shift left)
lsr (logical shift right)

trotzdem Danke ;)

von thkais (Gast)


Lesenswert?

bei lsl und lsr hast Du das Problem, daß immer eine "0"
hineingeshiftet wird.
R16 = 11111110

lsl r16 macht aus R16 11111100.

von Dennis Schmitt (Gast)


Lesenswert?

hmm aber deine Version ist doch besser :D

so kann ich Sie mit Carry's otieren lassen. hast recht ;)

von Joachim Schäfer (Gast)


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...

von Dennis Schmitt (Gast)


Lesenswert?

Huhu Männer also ich glaub ich bekomm es nicht hin :/

könnt ihr mal kurz schauen:

http://www.prosoft-design.de/BitShifting.txt

Der Quellcode ist auch nicht viel. :)
Also wenn ich jetzt auf T1 drücke dann geht nur PortB.0 an und sonst
passiert nichts mehr, kann das sein das ich die Variable MasterShift
falsch behandle, also nicht Global oder so

Danke schonmal

von Joachim Schäfer (Gast)


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.

von Dennis Schmitt (Gast)


Lesenswert?

Hi Joachim,

als ehrlich gesagt weis ich auch nciht was ich da oben gemacht hatte
:)

hab jetzt einfach mal ne andere Variante genommen. Wird zwar nicht das
schönste sein aber solange es geht :)

So hab ich es jetzt:

http://www.prosoft-design.de/BitShifting2.txt

habs jetzt mit sbic gemacht und klappt gut.

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
Noch kein Account? Hier anmelden.