Assembler-Frage

Gast #85994
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
Gast
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:
Gast
@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
Gast
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
Gast
@ 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
Gast
@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.
Gast
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
Gast
>@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
Gast
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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.