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
Hi! in r19, PIND in r18, PIND andi r19,0b00000100 andi r18,0b00001000 lsr r18 cp r19,r18 Naja, nicht viel kürzer... Sebastian
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:
shit natürlich falsch sbrc PIND, 2 sbrs PIND, 3 rjmp XYZ 0b01100 XZY: gruß Hagen
@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
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
@Hagen, Dein Code geht aber nicht, wenn beide 0 sind. Gleichheit ist aber beide 0 oder beide 1 (EXNOR). Peter
@ 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
@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.
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
>@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
CLI und SEI verhindert lediglich das zusätzlich noch interrupts zwischen den portabfragen bedient werden ;-)
Somit bleibt auch mit CLI das Problem bei der methode mit sbic/sbis weiterhin bestehen. Gruß Hagen
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.