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