Forum: Mikrocontroller und Digitale Elektronik AVR Statusregister sichern


von Jürgen (Gast)


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

von 3351 (Gast)


Lesenswert?

Zeig mal den code.

von fubu1000 (Gast)


Lesenswert?

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

Gruss

von seco (Gast)


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

von Jürgen (Gast)


Lesenswert?

Sorry, aber ich möchte das Register nur sichern

move temp,SREG
push temp

  Unterprogramm

pop temp
move SREG,temp

von Jochen M. (taschenbuch)


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

von fubu1000 (Gast)


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

von seco (Gast)


Lesenswert?

Hallo Jürgen,

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

grüße, seco

von Jürgen (Gast)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

1
test:
2
 push temp
3
 in temp, SREG
4
 push temp
5
6
  nop
7
8
 pop temp
9
 out SREG, temp
10
 pop temp
11
ret

Probiers mal so!

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von Jürgen (Gast)


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

von Jochen M. (taschenbuch)


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

von Jürgen (Gast)


Lesenswert?

Danke für die schnelle Hilfe... :-)

von wjunky (Gast)


Lesenswert?

Hi!

Für zukünftige Fälle:
Das komplette Instructionset:
http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf
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.

von spess53 (Gast)


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

von wjunky (Gast)


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

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.