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
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...
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
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
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.
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:)
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
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
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.
"... 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