mikrocontroller.net

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


Autor: Christian Sander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Christian Sander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Christian Sander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ingo Henze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian Sander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:)

Autor: Ingo Henze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ingo Henze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian Sander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.