Ziel war es den einzelnen Speicherzellen des Registers Labels zuzuordnen die ich dann später im Programm direkt ansprechen kann. Ungefähr so wie bei 8051 der bitadressierbare Bereich.
Leider klappt es nicht so wie ich es mir vorgestellt habe. Wo ist mein Denkfehler?
Grüße aus München,
Christian
Didn't find your answer? Ask the community — no account required.
M
Michael
Ich gehe mal davon aus, dass jedes EQU ein Bit im Register darstellen soll.
Leider kenne ich den 8051 nicht.
Was klappt denn nicht? Es gibt Befehle, um ein einzelnes I/O-Bit zu setzen/löschen. Etwa in der Art:
Jetzt kann man mit SBR und CBR Bits setzen und löschen:
SBR temp, rs_recv CBR temp, rs_recv
Bei diesen Befehlen hat der zweite Parameter die Funktion einer Maske, d.h. alle Bits die in der Konstante gesetzt sind, werden im Register gelöscht/gesetzt. Also löscht
CBR temp, 255
das ganze Register, entspricht also
CLR temp
und
SBR temp, 255
wäre gleichbedeutend mit
LDI temp, 255
Viele Grüße, Michael
C
Christof Voelkle
Am Thu, 29 Jul 2004 11:06:00 +0200 hat Christian Sander geschrieben:
Hast du das entsprechende include file eingebunden? Beim Atmega8 z.B. .include "m8def.inc"
Gruß Chris
Wann hält Ulm an diesem Zug?
(A. Einstein)
C
Christian Sander
OK, ich habe jetzt neu definiert.
.def a_flag=r25 ;Register zur allgemeinen Verwendung ;Flag von A Flag .equ Ser_Busy=1 .equ TX_Ready=2 .equ RX_Ready=4 .equ int_Rx_Ready=8
Über den Studio Debugger schaue ich mir das Register 25 an. Da steht vor meinem Befehl 0x04 darin.
Trotzdem springt er mir in folgender Routine nach RECEIVE_CONTROL_END.
ja das dachte ich mir. Das ist das Problem an meiner Idee: Die EQUs enthalten potenzierte Werte und keine Bit-Nummern, aber SBRS & Co. verlangen Bit-Nummern. Das solltest Du zwei EQUs pro Bit machen, einen mit der Nummer und einen Potenzierten.
Mit diesen Definitionen funktioniert der sbrs-Befehl ohne weiteres. Beim Setzen oder Loeschen von Bits im Register muss man im Hinterkopf haben, dass der Befehl sbr das gleiche macht (und logischerweise den gleichen Opcode liefert) wie der Befehl ori. Hierbei kann man natuerlich gleichzeitig mehrere Bits setzen. Das sieht dann so aus:
sbr Status, (1
M
Michael
Es gibt auch noch die Möglichkeit über das Transfer-Flag zu gehen, das würde so aussehen:
;Deine EQUs kannst Du beibehalten.
Bit_setzen:
SET ;Setzt das Transfer-Flag auf '1' BLD temp, TX_Ready ;Setzt das Bit TX_Ready im Register temp auf den Wert vom Transfer-Flag
CLT ;Setzt das Transfer-Flag auf '0' BLD temp, TX_Ready ;Setzt das Bit TX_Ready im Register temp auf den Wert vom Transfer-Flag
zum Bitlesen aus einem Register kannst Du irgendeine Skip-If-Bit-Is-Set/Cleared-Funktion benutzen.
Viele Grüße, Michael
C
Christian Sander
Vielen Dank Euch allen für die Hilfe. Jetzt funktionierts.
Damit hat es jetzt funktioniert, und noch besser, ich habe es verstanden. Jetzt wo es funktioniert werde ich auch die anderen Lösungsvorschläge ausprobieren.
Grüße,
Chris
würde
Transfer-Flag
Transfer-Flag
T
Thomas Mozgan
Christian Sander schrieb:
Ja, ist bei diesen Werten korrekt.
Bit 8 (int_Rx_Ready) ist in Register r15=0x04 (a_flag) nicht gesetzt, daher ist sbrs -> no skip. Es wird rjmp ausgefuehrt. Hmm, eigentlich sollte es eine Compiler-Warnung bei Bit 8 geben.
Du solltest die Bitnummnern verwenden.
Sonst empfehle ich (aehnlich wie Mathias Weierganz) die Befehle CBR (intern wie ANDI) und SBR (intern wie ORI) und Bitmasken (1
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.