Problem Assembler Kommando JB

Gast #1141269
Lesenswert?

Folgendes Problem:

Controller 8051

Das Register R7 enthält die BitAdresse eines Portpins (z.B. 0x81h)
Mit JB (JumpBit) soll der Zustand ausgewertet werden.

JB 0x81h, ziel    ;funktioniert

MOV R7, 0x81h     ;funktioniert
JB  R7, ziel      ;Fehlermeldung

Die unterste Zeile erzeugt Fehlermeldung, da R7 keine BitAdresse ist.
Die fixe Angabe der Adresse ist aber nicht geeignet, da die Adresse als 
Parameter der Funktion übergeben werden soll.

Wie sorge ich dafür, dass der Inhalt von R7 als BitAdresse ausgewertet 
werden kann? Andere Idee?

Gruß Dieter
#1141284
Lesenswert?

Eine indirekte Bitadressierung kann der 8051 nicht.
Und SFRs können nicht mal als Bytes indirekt adressiert werden.

Man kann sich aber entsprechende Funktionen für Bits im SRAM schreiben:
1
;********************** set bit indirect pointed by acc *****************
2
;Attention: bit address must be below 80h !
3
;Input: ACC = bit number 00 ... 7F
4
;Output: nothing
5
;Used: R0, ACC
6
;Cycle: 16
7
setibit:
8
        call getibit            ;get mask and address
9
        orl a, @r0
10
        mov @r0, a
11
        ret
12

13
clribit:
14
        call getibit
15
        cpl a
16
        anl a, @r0
17
        mov @r0, a
18
        ret
19

20
cplibit:
21
        call getibit
22
        xrl a, @r0
23
        mov @r0, a
24
        ret
25

26
tstibit:
27
        call getibit
28
        anl a, @r0
29
        add a, #0FFh
30
        ret
31

32
getibit:                        ;get byte address and bit mask
33
        mov r0, a
34
        anl a, #78h             ;byte number
35
        rl a                    ; * 2
36
        swap a                  ;     / 16  = / 8
37
        add a, #20h             ;start data bit addressable
38
        xch a, r0
39
        anl a, #7               ;bit number
40
        inc a
41
        movc a, @a+pc           ;bit mask
42
        ret
43
        db 1, 2, 4, 8, 10h, 20h, 40h, 80h
44
;------------------------------------------------------------------------


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren