Hallo, um beim AVR das Carrybit auf einen Portpin zu legen, habe ich bis jetzt immer das Carrybit getestet und dann entsprechend den Auspangspin gesetzt oder gelöscht. Das implizierte ein paar Sprungbefehle. Siehe hier: Beispiel_A: LSL r16 BRCS Bit1 Bit0: CBI Portpin RJMP weiter Bit1: SBI Portpin weiter: hier gehts weiter... Ich frage mich jetzt schon länger, ob es eine Möglichkeit gibt, das Carrybit ohne obige Abfragekombination auf einen Pin zu legen. Gibt es eine bessere Lösung? Gruß, Thomas
Nur so eine Idee: 1. Statusregister lesen 2. Alles bis auf Carry ausmaskieren 3. Auf Port schreiben
Hi Muss es das Carry-Flag sein?
1 | in r17,Port |
2 | bst r16,7 |
3 | bld r17,Bit1 |
4 | out Port,r17 |
5 | lsl r16 |
MfG Spess
Also SW-SPI. Du kannst ein RJMP einsparen:
1 | Beispiel_A: |
2 | LSL r16 |
3 | CBI Portpin |
4 | BRCC weiter |
5 | SBI Portpin |
6 | weiter: hier gehts weiter... |
Peter
gibt es denn kein SHIFT bei AVR, das hat doch eigentlich jeder Prozessor mit dem ich bisher zu tun hatte (ich bin kein AVR-Mensch)?
Hi >gibt es denn kein SHIFT bei AVR, das hat doch eigentlich jeder Prozessor >mit dem ich bisher zu tun hatte (ich bin kein AVR-Mensch)? Klar gibtes das. Aber, was hat das mit der Frage zu tun? MfG Spess
Habe gerade nochmal nachgesehen: Es gab beim 8051 von Intel einen Befehl "MOV Px.y,C", der das Carry direkt auf ein Portbit schreiben konnte. So konnte man sich wunderbar die Verzweigungen sparen. Von daher hatte ich das noch im Kopf drin. Leider hat der AVR nichts vergleichbares. (Oder gibt es illegale Op-Codes? :-) ) Die Idee mit dem ganzen Port lesen und schreiben werde ich mir mal näher anschauen. Da ich sowieso den ganzen Port zur freien Verwendung habe, sollte ich diese Variante verwenden können. Vielen Dank! Gruß, Thomas
Spart die Label:
1 | SBIS SReg, 0 |
2 | CBI PortX, BitX |
3 | SBIC SReg, 0 |
4 | SBI PortX, BitX |
der 8051 hat keine Risc Architektur. Wie der Name ja schon nahelegt, haben Risc CPUs einen reduzierten Befehlssatz. Dafür schafft der AVR einen (Standard) Befehl pro Clock, der 8051 hat da ich weiss nichtmehr 6-8 CPU Clocks gebraucht. Die Risc Architektur hat, was die Performance angeht klar Vorteile, aber gerade bei Assembler programmierung eben auch Nachteile wie den hier erwähnten. Thats life. Du hast also drei Möglichkeiten: 1) Nachteil in Kauf nehmen und sich über die vielen Vorteile freuen 2) Auf eine höhere Programmiersprache (C) umsteigen, dann merkt man die Nachteile nicht mehr und hat immernoch den Vorteil einer besseren Performance 3) den 8051 einsetzen so long Remo
Mist, verwendbarer IO-Bereich von SBIC/SBIS nur bis $1F..
@MWS: Der Codeschnipsel ohne Labels gefällt mir :-)
QMWS: Mist, verwendbarer IO-Bereich von SBIC/SBIS nur bis $1F.. d.h. der Trick geht garnicht? Schade.
Remo@ Te schrieb: > d.h. der Trick geht garnicht? > Schade. Wenn Du ein Register frei hast, oder pusht/popst, kannst Du das Register-Äquivalent SBRC/SBRS nehmen:
1 | PUSH R0 |
2 | IN R0, SReg |
3 | SBRS R0, 0 |
4 | CBI PortX, BitX |
5 | SBRC R0, 0 |
6 | SBI PortX, BitX |
7 | POP R0 |
Hi
>Spart die Label:
Funktioniert aber auch nicht (immer). SBIC/SBIS können nur bis $31
adressieren. Meist liegt SREG auf $3F.
MfG Spess
spess53 schrieb: > Funktioniert aber auch nicht (immer). SBIC/SBIS können nur bis $31 > adressieren. Meist liegt SREG auf $3F. MWS schrieb: > Mist, verwendbarer IO-Bereich von SBIC/SBIS nur bis $1F..
MWS schrieb: > Mist, verwendbarer IO-Bereich von SBIC/SBIS nur bis $1F.. Schiebste eben nachher:
1 | Beispiel_A: |
2 | CBI Portpin |
3 | SBRC R16, 0 |
4 | SBI Portpin |
5 | LSL r16 |
6 | hier gehts weiter... |
Peter
Peter Dannegger schrieb: > Schiebste eben nachher:Beispiel_A: > CBI Portpin > SBRC R16, 0 > SBI Portpin > LSL r16 > hier gehts weiter... Wenn ein möglicher kurzer Spike von 3-4 Takten auf dem Port nicht stört... Ist die vorherige Position des Carry aufgrund einer Schiebeoperation bekannt, so ist das so einfacher, mein Code folgte dagegen mehr dem Wunsch des TE das Carry zu testen.
Hallo, ich frage mich gerade wofür das T-Bit im Status Register eigentlich da ist. man müßte doch eigentlich über Bit Load das Carry Bit laden und mit Bit Store den Port pin setzen können? Allerdings frage ich mich warum bei meinen Bit-Schubsereien für meine Relaissteuerung der C-Compiler trotzdem die Bits rechts und links schiebt um sie auf den richtigen Portpin zu legen. Gruß Anja
Anja schrieb: > man müßte doch eigentlich über Bit Load das Carry Bit laden und mit Bit > Store den Port pin setzen können? Nein. BLD/BST funktionieren anders, sie können nur auf µC-Register sowie das T-Flag wirken, das SReg dagegen liegt im IO-Bereich.
>> gibt es denn kein SHIFT bei AVR, das hat doch eigentlich jeder Prozessor >> mit dem ich bisher zu tun hatte (ich bin kein AVR-Mensch)? > Klar gibtes das. Aber, was hat das mit der Frage zu tun? rotiere das Carry-Bit auf das gewünschte Portbit
Hi
>rotiere das Carry-Bit auf das gewünschte Portbit
Na dann zeig mal, wie das dann bei dir aussieht.
MfG Spess
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.