mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler-Frage


Autor: Gerhard Humer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Assemblerfreaks,

kann man folgenden Code-Teil "eleganter" lösen.
Es geht darum Pind.2 mit Pind.3 zu vergleichen...
Bin in Sachen Assembler noch am Anfang.

ldi r19,0
sbic PIND,2
ldi r19,1

ldi r18,0
sbic PIND,3
ldi r18,1

CPSE r19,r18
.......

Gruss Gerhard

Autor: Sebastian Wille (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

in r19, PIND
in r18, PIND
andi r19,0b00000100
andi r18,0b00001000
lsr r18

cp r19,r18

Naja, nicht viel kürzer...

Sebastian

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so geht`s auch 1 register weniger:
in      R18,PIND
andi    R18,0b00001100
breq  LABEL1          ;beide 0
cpi  R18,0b00001100
breq  LABEL1          ;beide 1
        .....

LABEL1:

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier mal

  sbrc PIND, 2
  sbrs PIND, 3
  sbrc PIND, 2
  .. 0b01100

Gruß Hagen

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
shit natürlich falsch

  sbrc  PIND, 2
  sbrs  PIND, 3
  rjmp  XYZ
    0b01100
XZY:

gruß Hagen

Autor: Gerhard Humer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sebastian and mmerten,

Danke für die raschen Antworten.
Werd ich heute abend gleich mal testen.
Ein bischen Speed müsste es ja bringen...

@Hagen
Hi, die Befehle sbrc und sbrs sind nur bei den Registern 0-31
anzuwenden . trotzdem Danke.

Gruss Gerhard

Autor: Sebastian Wille (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Gerhard,

mit sbic und sbis geht's schon!

Sebastian

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, die meinte ich auch, war'n langer Tag heute (shit Trial&Error
Programmierer :)

Also sbic/sbis ist richtig, so müsste so gehen:

  sbic  PIND, 2
  sbis  PIND, 3
  rjmp  XYZ
   ..0b01100
XZY:

Hat halt nur den Vorteil das man Register spart.

Gruß Hagen

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hagen,

Dein Code geht aber nicht, wenn beide 0 sind. Gleichheit ist aber beide
0 oder beide 1 (EXNOR).


Peter

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich dachte er wollte das beide 1 sind ?

Gruß Hagen

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@hagen
code von gerd nicht richtig verstanden ?

Autor: Gerhard Humer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Hagen,

stimmt schon so wie Peter meint.
Ich will einen Vergleich ob die beiden Pin's gleich oder ungleich
sind.
Das ganze ohne Benutzung von Registern zu proggen wäre super.
Würde mir zusätzlich noch 2x "push und pop" ersparen.

Gruss Gerhard

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@gerhard
hat aber den nachteil, daß du keine konsistenten portzustand hast
(mehre Lesezugriffe auf PIN) . Es sei denn man baut noch cli und sei
ein.

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der sequentiellen Abfrage könnte es Zeitprobleme geben, denn
zwischen dem ersten sbic bis zur letzten Abfrage könnte sich der Port
Status ja wieder geändert haben. Ich würde doch lieber mit einem Port
Zugriff alle Pins auslesen wollen.

sicherer ist es so

  push  temp
  in    temp, PIND
  andi  temp, 0b01100
  breq  _1
  cpi   temp, 0b01100
  brne  _2
_1:
  .. 0b01100 oder 0b00000
_2:
  pop   temp

also wie schon oben vorgeschlagen.

Gruß Hagen

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>@gerhard
>hat aber den nachteil, daß du keine konsistenten portzustand hast
>(mehre Lesezugriffe auf PIN) . Es sei denn man baut noch cli und sei
>ein.

Hat CLI und SEI direkte Auswirkungen auf die Veränderung der Staties an
den PORT's ? Ich habe dazu nichts im Datenblatt gefunden.

Gruß Hagen

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CLI und SEI verhindert lediglich das zusätzlich noch interrupts zwischen
den portabfragen bedient werden ;-)

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Somit bleibt auch mit CLI das Problem bei der methode mit sbic/sbis
weiterhin bestehen.

Gruß Hagen

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
richtig, habe ich ja bei meiner lösung von 11:06 auch daher nicht
verwendet ;-)

Autor: Gerhard Humer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo mmerten und Hagen,

nochmals Danke für Eure tolle Hilfe.

Der Code-Teil aus meinem ersten Posting ist aus einer
Interruptroutine (INT0).
Das Ganze brauche ich zum Zähler von Drehgeberimpulsen.
Also das Problem mit dem doppelten Lesen des Ports werde ich
beseitigen.
Muss halt trotzdem 1 Register verwenden.
Aber auf jeden Fall ist die Sache sicherer als vorher.

Gruss Gerhard

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.