Forum: Mikrocontroller und Digitale Elektronik Wie legt man beim AVR möglichst einfach das Carrybit auf einen Portpin?


von Thomas T. (knibbel)


Lesenswert?

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

von Jan S. (jan_s)


Lesenswert?

Nur so eine Idee:
1. Statusregister lesen
2. Alles bis auf Carry ausmaskieren
3. Auf Port schreiben

von spess53 (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von picprog (Gast)


Lesenswert?

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)?

von spess53 (Gast)


Lesenswert?

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

von Thomas T. (knibbel)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

Spart die Label:
1
SBIS SReg, 0
2
CBI   PortX, BitX
3
SBIC SReg, 0
4
SBI   PortX, BitX

von Remo@ T. (remo)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

Mist, verwendbarer IO-Bereich von SBIC/SBIS nur bis $1F..

von Remo@ T. (remo)


Lesenswert?

@MWS: Der Codeschnipsel ohne Labels gefällt mir :-)

von Remo@ T. (remo)


Lesenswert?

QMWS: Mist, verwendbarer IO-Bereich von SBIC/SBIS nur bis $1F..
d.h. der Trick geht garnicht?
Schade.

von MWS (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>Spart die Label:

Funktioniert aber auch nicht (immer). SBIC/SBIS können nur bis $31 
adressieren. Meist liegt SREG auf $3F.

MfG Spess

von MWS (Gast)


Lesenswert?

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..

von Peter D. (peda)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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.

von Anja (Gast)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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.

von picprog (Gast)


Lesenswert?

>> 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

von spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.