mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Statusregister sichern


Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

habe das Problem, dass mein AVR-Studio den Bezeichner SREG nicht 
erkennt.
Allerdings ist der Bezeichner in der m8def.inc definiert.
Schreibe ich .equ sreg = $3f in mein Programm, beschwert sich der 
Assembler, dass der Bezeichner unzulässig geändert wurde.

Kann mir jemand sagen, was verkehrt läuft?
Gruß, Jürgen

Autor: 3351 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal den code.

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
bei dem SREG Register setzt man die Bits einzeln mit BSET, bzw BCLR.

Gruss

Autor: seco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...

.include "m8def.inc"
.def temp = r16

in temp, SREG
push SREG
;ISR
pop temp
out SREG, temp

funktioniert hier wunderbar.

grüße, seco

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber ich möchte das Register nur sichern

move temp,SREG
push temp

  Unterprogramm

pop temp
move SREG,temp

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Schreibe ich .equ sreg = $3f in mein Programm,

Was soll jetz dieser totale Quatsch?
SRAEG ist ist dem passenden inc. File ordnungsgemäß definiert,
WAS ZUM GEIER hast Du da umzudefinieren?????

Lass einfach die Finger von der VÖLLIG unnötigen und VÖLLIG sinnfreien 
Neu-Deklaration per EQU. und alles ist gut.

Jochen Müller

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NAchtrag: bzw du kannst auch die Bits einzeln setzen mit z.B. SEC, CLC 
,......
Schau einfach mal ins Datenblatt!!!

Wenn du das Register sichern willst dann push es auf den Stack und nach 
der Behandlung deiner Routine pop es wieder.

GRUSS

Autor: seco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,

nicht "move" sondern "in" und nach Ende des Unterprogramms "out"

grüße, seco

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es muss natürlich mov heißen, scheint wohl nicht der richtige Befehl zu 
sein... ?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
test:
 push temp
 in temp, SREG
 push temp

  nop

 pop temp
 out SREG, temp
 pop temp
ret

Probiers mal so!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

SREG liegt im IO-Bereich. Also wie seco schon schrieb: Zugriff mit 
in/out. 'move' kennt AVR-Studio überhaupt nicht.

MfG Spess

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
joa, das mit dem mov habe ich aus dem avr-Tutorial, dort ist auf ein PDF 
verlinkt -> 'Der STACK Teil', scheint wohl für einen anderen Controller 
zu sein

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Wenn du das Register sichern willst dann push es auf den Stack und nach
>>der Behandlung deiner Routine pop es wieder.

AUCH DAS ist völliger Unsinn!
Du kannst ein IO-Register NICHT auf den Stack pushen!

Du kannst das IO-Register per IN-Fefehl in ein Datenregister kopieren, 
und dieses Datenregister dann auf den Stack legen.

Das ist GANZ ETWAS anderes!
Und genau weil der OP diesen Unterschie nicht verstanden hat, bekam der 
das Problem. Da helfen unscharfe und zudem noch fehlerhafte Antworten 
absolut nicht weiter!

Jochen Müller

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Hilfe... :-)

Autor: wjunky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Für zukünftige Fälle:
Das komplette Instructionset:
http://www.atmel.com/dyn/resources/prod_documents/...
Dann siehst du, welcher Befehl wofür geeignet ist.

Außerdem solltest du wissen, dass die AVRs verschiedene Adressräume 
benutzen.
Normalerweise (bitte nicht schlagen, falls nicht ganz richtig) fängt der 
Adressraum bei den GPRs, dann kommen die I/O-Regs und dann der SRAM. Der 
Stack kommt die von oben im SRAM entgegen, wenn du anfangs den 
Stackpointer richtig gesetzt hast.
EEPROM und Flash haben eigene Adressräume, die unabhängig sind.

Viel Spaß beim programmieren.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

@ wjunky: AVRs haben eigentlich nur 3 Adressräume: SRAM, EEPROM und 
FLASH. Register, IO, SRAM teilen sich eigentlich den gleichen 
Adressraum. Mit

ldi ZL,0
ldi ZH,0
ld r16,Z

bekommst du r16=r0. Genauso kannst du die IO-Register auslesen. Der 
Stack wird an die obere SRAM-Grenze gelegt um einen maximalen Abstand zu 
anderen RAM-Variablen zu erreichnen. Bei bekannten Stack-Bedarf könnte 
er auch an 'fast' jeder anderen Stelle in Ram liegen.

MfG Spess

Autor: wjunky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh!
genau das habe ich zu sagen versucht...
wo ich jetzt nochmal drüberlese, muss ich aber zugeben, dass es 
reichlich missverständlich formuliert ist.

Danke für die Klarstellung, wollen ja nicht, dass Jürgen aus GPR, IO und 
SRAM drei Adressräume macht :-o

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.