ELEKTRO FORUM

Elektroforum
It is currently January 6, 2009, 6:23 am

All times are UTC





Post new topic Reply to topic  [ 8 posts ] 
Author Message
PostPosted: 2004-07-29 11:06:00
Online
Registered User

Joined: 2004-07-29 11:06:00
Liebe Newsgroup,

ich habe in einem Register folgendes definiert:

.def temp=r25 ;Register zur allgemeinen Verwendung

.equ rs recv=0
.equ Ser Busy=1
.equ TX Ready=2
.equ RX Ready=3
.equ int Rx Ready=4

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


Top
 Profile
 
PostPosted: 2004-07-29 11:37:43
Online
Registered User

Joined: 2004-07-29 11:37:43
Am Thu, 29 Jul 2004 11:06:00 +0200 hat Christian Sander
<chris@sander-muenchen.de> geschrieben:

> Liebe Newsgroup,
>
> ich habe in einem Register folgendes definiert:
>
> .def temp=r25 ;Register zur allgemeinen Verwendung
>
> .equ rs recv=0
> .equ Ser Busy=1
> .equ TX Ready=2
> .equ RX Ready=3
> .equ int Rx Ready=4
>
> 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?

Hast du das entsprechende include file eingebunden?
Beim Atmega8 z.B. .include "m8def.inc"

> Grüße aus München,
>
> Christian

Gruß Chris

--
Wann hält Ulm an diesem Zug?
(A. Einstein)


Top
 Profile
 
PostPosted: 2004-07-29 11:37:11
Online
Registered User

Joined: 2004-07-29 11:37:11
Christian Sander wrote:

> .equ rs recv=0
> .equ Ser Busy=1
> .equ TX Ready=2
> .equ RX Ready=3
> .equ int Rx Ready=4

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


Top
 Profile
 
PostPosted: 2004-07-29 12:45:02
Online
Registered User

Joined: 2004-07-29 12:45:02
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
>


Top
 Profile
 
PostPosted: 2004-07-29 13:19:31
Online
Registered User

Joined: 2004-07-29 13:19:31
> RECEIVE CONTROL: sbrs a flag,int Rx Ready

Hi,

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.


> .equ int Rx Ready=8

Mit einem

.equ int Rx Ready=4

würde es funktioniern, denke ich.

PS: Wir hatten die neuen EQU-Werte so definiert:

    .equ rs recv=1
    .equ Ser Busy=2
    .equ TX Ready=4
    .equ RX Ready=8
    .equ int Rx Ready=16

also kein

int Rx Ready=8


Viele Grüße,
Michael


Top
 Profile
 
PostPosted: 2004-07-29 13:29:08
Online
Registered User

Joined: 2004-07-29 13:29:08
man kann keine .equ mit 2 werten angeben, da er logischerweise einen Fehler
beim Compilieren herausgibt.
Auch .equ Werte mit =16 funktionieren nicht.

Gibt es da keine allgemeine Lösung? Ist das wirklich so speziell???

Grüße,

Christian


> Hi,
>
> 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.
>
>
> > .equ int Rx Ready=8
>
> Mit einem
>
> .equ int Rx Ready=4
>
> würde es funktioniern, denke ich.
>
> PS: Wir hatten die neuen EQU-Werte so definiert:
>
> .equ rs recv=1
> .equ Ser Busy=2
> .equ TX Ready=4
> .equ RX Ready=8
> .equ int Rx Ready=16
>
> also kein
>
> int Rx Ready=8
>
>
> Viele Grüße,
> Michael
>


Top
 Profile
 
PostPosted: 2004-07-29 13:35:49
Online
Registered User

Joined: 2004-07-29 13:35:49
> man kann keine .equ mit 2 werten angeben, da er logischerweise einen
> Fehler beim Compilieren herausgibt.

Natürlich geht das nicht. Ich meinte ja auch nicht denselben Namen!


> Auch .equ Werte mit =16 funktionieren nicht.

Das wäre mir neu.


> Gibt es da keine allgemeine Lösung? Ist das wirklich so speziell???

Ich kenne keine andere, außerdem ist sie nicht sehr umständlich, bis
auf die
Tatsache, das man eigene EQUs braucht...


Gruß
Michael


Top
 Profile
 
PostPosted: 2004-07-29 13:42:54
Online
Registered User

Joined: 2004-07-29 13:42:54
Michael wrote:

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

Das ist eine Moeglichkeit - ich mach das aber immer so:


.def Status = R22 ; Flag-Register

; Flag-Definitionen für Status
.equ STAT RATE = 0
.equ STAT RX = 1
.equ STAT TIMER = 2
.equ STAT BATTVOLL = 3
.equ STAT TASTE = 4
.equ STAT COMP = 5
.equ STAT CHARGE = 6

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<<STAT RATE | 1<<STAT TASTE | 1<< STAT
BATTVOLL)

Ich geb es ja zu: besonders schoen ist es nicht, aber es funktioniert.


Top
 Profile
 
Post new topic Reply to topic  [ 8 posts ] 

Who is online

Users browsing this forum: Johannes K,"Andreas Erber" <q@q-kontinuum.de>,Georg Sauthoff <g sauthoff@web.de>, 2 guests, Historia jakiej nie znał świat Serce Konfusion 12 najpiękniejszych kolęd Złota kolekcja. Naj Story


New posts New posts    No new posts No new posts    Announce Announcement
New posts [ Popular ] New posts [ Popular ]    No new posts [ Popular ] No new posts [ Popular ]    Sticky Sticky
New posts [ Locked ] New posts [ Locked ]    No new posts [ Locked ] No new posts [ Locked ]    Moved topic Moved topic
You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group