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
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
Danke Peter Sehr schnelle Antwort! Meine Befürchtung hat sich bestätigt, und ich dachte schon ich wäre zu doof ;-)
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.