www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bit hin und her shiften


Autor: Dennis Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dennis Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hab auch noch was gefunden:

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

trotzdem Danke ;)

Autor: thkais (Gast)
Datum:

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

lsl r16 macht aus R16 11111100.

Autor: Dennis Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm aber deine Version ist doch besser :D

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

Autor: Joachim Schäfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Dennis Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joachim Schäfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dennis Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.