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
Hallo, bei dem SREG Register setzt man die Bits einzeln mit BSET, bzw BCLR. Gruss
Hallo... .include "m8def.inc" .def temp = r16 in temp, SREG push SREG ;ISR pop temp out SREG, temp funktioniert hier wunderbar. grüße, seco
Sorry, aber ich möchte das Register nur sichern move temp,SREG push temp Unterprogramm pop temp move SREG,temp
>>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
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
Hallo Jürgen, nicht "move" sondern "in" und nach Ende des Unterprogramms "out" grüße, seco
es muss natürlich mov heißen, scheint wohl nicht der richtige Befehl zu sein... ?
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!
Hi SREG liegt im IO-Bereich. Also wie seco schon schrieb: Zugriff mit in/out. 'move' kennt AVR-Studio überhaupt nicht. MfG Spess
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
>>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
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.
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
Ä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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.