Forum: Mikrocontroller und Digitale Elektronik Assembler-Frage


von Gerhard Humer (Gast)


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

von Sebastian Wille (Gast)


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

von mmerten (Gast)


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:

von Hagen (Gast)


Lesenswert?

probier mal

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

Gruß Hagen

von Hagen (Gast)


Lesenswert?

shit natürlich falsch

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

gruß Hagen

von Gerhard Humer (Gast)


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

von Sebastian Wille (Gast)


Lesenswert?

Hi Gerhard,

mit sbic und sbis geht's schon!

Sebastian

von Hagen (Gast)


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

von Peter D. (peda)


Lesenswert?

@Hagen,

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


Peter

von Hagen (Gast)


Lesenswert?

Ich dachte er wollte das beide 1 sind ?

Gruß Hagen

von mmerten (Gast)


Lesenswert?

@hagen
code von gerd nicht richtig verstanden ?

von Gerhard Humer (Gast)


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

von mmerten (Gast)


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.

von Hagen (Gast)


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

von Hagen (Gast)


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

von mmerten (Gast)


Lesenswert?

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

von Hagen (Gast)


Lesenswert?

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

Gruß Hagen

von mmerten (Gast)


Lesenswert?

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

von Gerhard Humer (Gast)


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

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.