PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : haben bei ATMEL ALLE Register Adressen?



breznsuezer
05.10.2006, 10:19
Hi alle,

ich hatte bis jetz nur mit dem Prozessor 68k von Motorola (sehr begrenzte) Erfahrung. Bei diesem Teil haben die internen Register wie z.B. Datenregister, Statusregister etc. KEINE Adresse. Diese können so auch nicht in C-Code direkt beschrieben werden.

Im Datenblatt von dem ATMEL MEGA32 hab ich jezt gelesen dass die Register R0 - R31 die Adressen $00 - $1F (Doku S.9), die übrigen Register $20 - $5F (Doku S.299) gehen.

Also haben hier wirklich ALLE Register (auch GeneralPurpose/Statur-Regiseter) Adressen?

Zusatzfrage:
Da der Atmel beim Neustart den Befehl der in $00 steht ausführt, heisst das das der Befehl in R0 steht?? Wenn dieser vom Programm überschrieben wird, und dann ein Reset gemacht wird, geht dann noch was?


Irgendwie ist das ein Wurm drinne in meiner Denkweise.


Danke schon mal,

Gruss Markus

PicNick
05.10.2006, 10:34
Schau mal da.
https://www.roboternetz.de/wissen/index.php/Atmel_Controller_Mega16_und_Mega32#Adressen_Mappin g

Beim AVR ist es tatächlich so, daß die Register 0-31, alle Special Register und der SRAM einen geschlossenen Adressraum bilden

SprinterSB
05.10.2006, 11:08

PicNick
05.10.2006, 11:46
*grmpff*
Auf die Frage, ob der Storch die Kinder bringt, kann man
"NEIN"
sagen, man kann ihm aber auch den "Ursprung der Arten" und alle weiterführenden Werke sicherheitshalber mal gleich vorlesen.

breznsuezer
05.10.2006, 12:19
Danke für eure Antworten.

Leider hab ich das noch nicht so ganz verstanden. Mein Quellcode sah bisher so aus:



.org 0x00
rjump main

.org 0x60
main: .....


heistt das dass in R0 jetz der "rjump main" , da dieser Adresse 0x00 hat, steht, und main:.... dann ab 0x60?

Was geschieht wenn ich sowas wie ldi D0,0x00 in main stehen habe, wird dann der "rjump main" gelöscht, bzw was würde passieren wenn die Anweisung: .org 0x60 fehlen würde, wäre dann mein Main-Programm in den Registern?

Gibts da vielleicht ne Seite die das LEICHTVERSTÄNDLICH erklärt?

@SprinterSB: Du meinse mit Deiner (plötzlich verschwundenen) Antwort das es vom Befehl abhängt wo im Speicher zugegriffen wird?

Gruss

Markus

PicNick
05.10.2006, 12:57
Das hatt' ich befürchtet, jetzt hab' ich ihn verhärmt.

Also: (vergiß einmal die "0x0060")

Die AVR (und alle sogenannten "Harvard"-Fuzzys) unterscheiden strikt zwischen Programm- und Datenspeicher.

Dort, wo du dein Programm hinstellst, ist (logo) der Programmspeicher. der geht nun aber wirklich von 0 - 32767 (Atmega32) also 32k.
Vorne hat er seine Interrupt-Vektoren, der erste ist für "INIT"
https://www.roboternetz.de/wissen/index.php/AVR_Assembler_Einf%C3%BChrung#Struktur_eines_AVR-Maschinenprogrammes

Schau dir auch mal das Muster an, wie das in einem Programm aussieht.
https://www.roboternetz.de/wissen/index.php/AVR_Assembler_Einf%C3%BChrung#Source-Code_Muster

Bis dahin ist alles wie von anderen Prozessoren gewohnt, register sind einfach register. Und jeder z.b. "JMP label" bezieht sich immer auf einen Label im Programm, auch wie gewohnt.

Erst dann, wenn du die 2k RAM-Speicher zum speichern (log) verwenden willst, geht's um die obgenannten 0060. das ist ganz einfach die niederste RAM-adresse, von dort weg hast du deine 2k RAM und eine Reihe Befehle, die sich darauf beziehen können. Auch ganz normal.

Nur in dem Adress-Bereich von 0000-0060 gibt es dieses "Mapping". Du kannst dieses Feature auch erstmal einfach ignorieren

breznsuezer
05.10.2006, 15:05
Viel Dank, =D>

Du hast mir mit deiner ausführlichen Antwort sehr weitergeholfen

Gruss

Markus

JanB
05.10.2006, 15:05
Der AVR hat drei völlig getrennte Adressbereiche:
Codebereich (Flash),
Arbeitsspeicher (RAM) darin sind auch die Register untergebracht,
und EEPROM.

Es gibt also z.B eine Adresse 4 im Codebereich (Programm Memory),
und eine Adresse 4 im RAM.
Die haben nix miteinander zu tun.
Es existieren Befehle die sich explizit auf das RAM beziehen
(z.B. LD = Laden aus RAM),
und eigene Befehle, die sich nur auf den Codespeicher beziehen
(z.B LPM = Laden aus Program-Memory).
In die unteren Adressen des Rams sind die Register "eingeblendet".
Diese Adressen können wahlweise als Register oder als RAM
angesprochen werden.

Als zusätzliche Komplikation kommt noch dazu,
das der Codebereich mit 16-Bit Worten arbeitet,
d.h. unter der Adresse 4 sind 16 Bits = 2 Bytes zu finden.
Und das RAM arbeitet mit 8-Bit Worten, dort steht
unter Adresse 4 nur ein Byte.

Vieleicht wird es dir damit etwas klarer.
Ich musste mich auch erst daran gewöhnen,
ich komme von der Z-80 und 68000 Schiene....

Gruß Jan

PicNick
05.10.2006, 15:10
..musste mich auch erst daran gewöhnen, ich komme von der Z-80 und 68000 Schiene
Dann sei bloß froh, daß du nicht auf PIC gewechselt hast :mrgreen:

breznsuezer
06.10.2006, 10:38
Danke Jan,

langsam aber sicher kommt Licht ins Dunkel.

Ich werd mich wohl noch n bissl damit spielen müssen, aber des wird schon werden.

Gruss

Markus