Forum: Mikrocontroller und Digitale Elektronik AVR Assembler Anfängerfrage Bitdefinition


von Christian Sander (Gast)


Lesenswert?

Liebe Newsgroup,

ich habe jetzt mein erstes Programm für einen AVR geschrieben. Jetzt
möchte ich es erweitern und stolpere da ich eigentlich vom 8051 komme
über die Bitdeclaration.

Im 8051 konnte ich im Bitdefinierbaren Bereich den einzelnen
Speicherzellen Labels zuordnen. Beim AVR habe ich jetzt ein paar
Registern auch nach folgenden Schema
Labels für Bits zugeordnet:

 .def V_BYTE1_USB=R21

 .equ B_RX_ON_USB=0
 .equ B_RX_OFF_USB=1
 .equ B_RX_LOC_USB=2
 .equ B_RX_REM_USB=3
 .equ B_RX_RST_USB=4
 .equ B_RX_B1_USB=5
 .equ B_RX_B2_USB=6
 .equ B_RX_B3_USB=7

Funktioniert auch wunderbar. Gibt es auch die Möglichkeit nach oben
genannten Schema den 64 I/O Registern solche Labels zuzuordnen. Oder
wie macht Ihr das?

Grüße aus München,

Christian

von ...HanneS... (Gast)


Lesenswert?

Hi...

Das macht doch schon die vom Assembler mitgelieferte Include-Datei.
Diese weist den I/O-Registern und deren Bits die Namen zu, die im
Datenblatt verwendet werden.
Natürlich kann man auch zusätzliche Namen vergeben...

...HanneS...

von Christian Sander (Gast)


Lesenswert?

ich meine eigentlich die Möglichkeit mir eigene Bits zu definieren.
Es geht nicht um die Controllerdefinition sondern um Sprungmarker
die ich mir selbst definiere wie z.B. Ready. Wo und wie lege ich dieses
Bit ab?

Gruß,

Christian

von ...HanneS... (Gast)


Lesenswert?

Einige Beispiele (kein sinnvolles Programm)

.def flags=r16    ;Register 16 heißt "flags"
.equ fertig=0     ;Bit 0 heißt "fertig"
.equ neu=1        ;Bit 1 heißt "neu"
.equ ready=2      ;...
...

sbr flags,(1<<neu)  ;setzt Bit1 in R16

warte:            ;Sprungmarke (Label)
sbrc flags,ready  ;überspringt nächsten befehl wenn Bit 2 in r16
                  ;gelöscht ist
rjmp bereit       ;springt nach Label "bereit" (wenn Bit2 in r16
                  ;gesetzt war)
rjmp warte        ;springt nach Label "warte" zurück...

...

bereit:           ;Label...

von Christian Sander (Gast)


Lesenswert?

Erstmal vielen Dank, für die Ausführungen.

Wie ich das mit der Bitdefinierung bei R0 - R30 mache ist mir klar.
Wie mache ich es aber dann, wenn ich im SRAM ein Byte mit z.B. dem
Label STATUS reserviere. Wie kann ich die 8 Bits im Byte mit Labeln
versehen die ich nachher im Programm wieder verwenden kann, und
nicht sagen muss z.B.

  lds  temp,IEEE_STAT1  ;prüfen ob IEEE_REMC gesetzt
  sbrs  temp,1  ;

Gruß,

Christian

von Jens123 (Gast)


Lesenswert?

Wie verwendet man SRAM?
Um einen Wert in eine Speicherstelle im SRAM abzulegen, muss man seine
Adresse festlegen. Das verwendbare SRAM reicht von Adresse 0x0060 bis
zum jeweiligen Ende des SRAM-Speichers (beim AT90S8515 ist das ohne
externes SRAM z.B. 0x025F). Mit dem Befehl

    STS 0x0060, R1

wird der Inhalt des Registers R1 in die Speicherzelle im SRAM kopiert.
Mit

    LDS R1, 0x0060

wird vom SRAM in das Register kopiert. Das ist der direkte Weg mit
einer festen Adresse, die vom Programmierer festgelegt wird.

von Ingo Henze (Gast)


Lesenswert?

Na irgendie so z.B.
.equ IEEE_REMC = 1<<0 ; Bit 0
.equ IEEE_STAC = 1<<1 ; Bit 1
.equ IEEE_XYZC = 1<<2 ; Bit 2
...

lds  temp,IEEE_STAT1  ;prüfen ob IEEE_REMC gesetzt
sbrs temp,IEEE_REMC


Gruß
Ingo

von Christian Sander (Gast)


Lesenswert?

Ja schon klar, aber kann ich den 8 Bits an Adresse 0x0060 auch
Labels zuordnen?

Bei den 8051 gibt es einen bitadresssierbaren Speicherbereich.
Den vermisse ich. Der AVR soll doch ein Vortschritt sein:)

von Ingo Henze (Gast)


Lesenswert?

Neee, so auch nicht, sorry :-)
sbrs erwartet ja die Bitnummer, also dann so:
.equ IEEE_REMC = 1 ; Bit 0
.equ IEEE_STAC = 2 ; Bit 1
.equ IEEE_XYZC = 3 ; Bit 2
...

Gruß
Ingo

von Jens123 (Gast)


Lesenswert?

probiers aus, an sonnsten musst du mit einem pointer arbeiten, sollte
aber so funktionieren, da du ja von einer adresse liesst

ich hab mit dem SRAM bisher nur mit einem Pointer register gelesen..

nur macht das ganze fuer ein Byte keinen sinn, dafuer sollte der stack
meistens reichen

Gruss Jens

von ...HanneS... (Gast)


Lesenswert?

Wenn du direkt auf die einzelnen Bits zugreifen willst, dann wirst du
dich wohl auf die Register beschränken müssen. Man kann nicht alles
haben...
SRAM kannst du ansonsten vorteilhaft mit .dseg und Labels reservieren
und benennen. Aber es bleibt SRAM, den kann man halt nur (ins Register)
laden oder (aus Register) speichern, also immer schön byteweise.

von Ingo Henze (Gast)


Lesenswert?

"... und nicht sagen muss z.B. ..."

Ich hab mal wieder nicht aufmerksam gelesen, tschuldigung.
Es soll ja genau nich so ein Konstrukt rauskommen wie:

  lds  temp,IEEE_STAT1  ;prüfen ob IEEE_REMC gesetzt
  sbrs  temp,1  ;

Da wird man nicht umhinkommen, aber um es zumindest etwas "schöner"
zu machen, könnte man sich diese wiederkehrenden Einzelbitabfragen in
ein Makro "verpacken".

Gruß
Ingo

von Christian Sander (Gast)


Lesenswert?

OK, ich glaube ich habs verstanden. Ade Du schöne 8051 Zeit, auf
zu neuen Ufern:)

Vielen Dank und bis zum nächsten Mal.

Grüße aus München,

Christian

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
Noch kein Account? Hier anmelden.