|
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.
Wer weis RAT?
RECEIVE CONTROL: sbrs a flag,int Rx Ready
rjmp RECEIVE CONTROL END
cbi PORTA, LED1 ;LED
anschalten
RECEIVE CONTROL END:ret
>
> Ich gehe mal davon aus, dass jedes EQU ein Bit im Register darstellen
soll.
>
>
> > 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 kenne ich den 8051 nicht.
>
>
> > Leider klappt es nicht so wie ich es mir vorgestellt habe. Wo ist
mein
> > Denkfehler?
>
> Was klappt denn nicht? Es gibt Befehle, um ein einzelnes I/O-Bit zu
> setzen/löschen. Etwa in der Art:
>
> sbi portb, rs recv ;Bit setzen
> cli portb, rs recv ;Bit löschen
>
>
> Aber ein Bit im Register zu setzen, da gibt es (zumindest beim 2313)
keinen
> direkten Befehl, dann eben über einen Umweg.
>
> Wir setzen die equs auf eine Konstante, die der ehemaligen Konstante als
> Potenz 2^x entspricht:
>
> .equ rs recv=1
> .equ Ser Busy=2
> .equ TX Ready=4
> .equ RX Ready=8
> .equ int Rx Ready=16
>
> 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
>
|