Forum: Mikrocontroller und Digitale Elektronik Viele Register definieren


von TopSP (Gast)


Lesenswert?

Hallo!

Ich programmiere in Assembler einen ATMEGA168. Da ich in meinem Programm 
viele Werte in Register speichern muss, welche mehr als 30 sind, ist die 
Frage wie ich das am besten mache. Im Ram hab ich ja nur r0 bis r31 und 
da kann ich auch nicht alle nutzen.

Gibt es irgendeine andere möglichkeit Register mit einem Namen zu 
definieren im Flash oder EEProm , die ich dann nutzen kann.
Also Adresse mit einem Namen versehen.
Wie macht ihr das wenn man sehr viele Register benötigt?

MfG

von xfr (Gast)


Lesenswert?

TopSP schrieb:
> Im Ram hab ich ja nur r0 bis r31 und
> da kann ich auch nicht alle nutzen.

R0 bis R31 sind Deine Prozessorregister, nicht der RAM. Im RAM hast Du 
nochmal 1024 Byte ... und genau für sowas sind die da.

von Peter D. (peda)


Lesenswert?

Man legt keine Variablen in Register, sondern in den SRAM.
Ist zwar mehr Code, aber dafür behält man die Übersicht. D.h. man kann 
den Code auch später noch erweitern.

Register nimmt man nur für temporäre Variablen (Schleifenzähler, 
Arbeitsregister).


Peter

von troll (Gast)


Lesenswert?

Was du brauchst ist SRAM.

Ungefähr so:

.dseg
name: .byte 1

.cseg
lds r16,name
tu was mit r16
sts name,r16

Für mehrere Bytes Schleifen mit X,Y oder Z-Register machen.

von oldmax (Gast)


Lesenswert?

Hi
Zur Klarstellung: Register können die Befehle ausführen, die einfachen 
Speicherzellen nicht. Eine Speicherzelle deklarierst du wie eine 
Variable:
1
DSeg:      ; Begin Datensegment
2
erste_Var:    .Byte 1      ; Speicheradresse 0
3
zweite_Var:   .Byte 1      ; Speicheradresse 1
4
Var_Array:    .Byte 10     ; Speicheradresse 2 - 11
5
etc.                       ; Speicheradresse 12
Da du dort nur Werte ablegen bzw. lesen kannst, musst du die Inhalte zur 
Bearbeitung in ein Register laden:
1
CSeg:      ; Begin Codesegment
2
....       ; initialisieren
3
Loop:      ; Programmschleife
4
    LDS  R16, erste_Var ; Speicheradresse 0 holen
5
    COM  R16            ; Bits drehen
6
    STS  erste_Var, R16 ; und zurückschreiben
7
uvm.
Ich hoffe, das bringt dir Licht in deine gedanken....
Gruß oldmax

von Peter II (Gast)


Lesenswert?

was ist daran falsch nur mit register zu arbeiten? Für kleine Programm 
die auch noch schnell sein müssen ist das doch der ideal.

Man könnte, wenn man nur temporär ein paar mehr register braucht mit 
push und pop arbeiten. Das ständig laden und speihern im sram kostet nur 
zeit.

von TopSP (Gast)


Lesenswert?

Danke für die Antworten.

.dseg
name: .byte 1


name ist klar. da schreib ich meinen namen vom Register rein. Aber was 
muss ich statt .byte 1 schreiben?
was sag ich dem ATMEGA damit ?

LG

von Cyblord -. (cyblord)


Lesenswert?

Peter II schrieb:
> Man könnte, wenn man nur temporär ein paar mehr register braucht mit
> push und pop arbeiten. Das ständig laden und speihern im sram kostet nur
> zeit.
Und was macht push und pop? Es schreibt und liest vom SRAM. Oder wo hast 
du deinen Stack versteckt?

gruß cyblord

von Peter II (Gast)


Lesenswert?

cyblord ---- schrieb:
> Und was macht push und pop? Es schreibt und liest vom SRAM. Oder wo hast
> du deinen Stack versteckt?

das ist doch wohl klar, aber es ist schnell als mit lts zu arbeiten.

damit kann man sich bei bedarf (arbeits)register doppelt belegen.

von troll (Gast)


Lesenswert?

TopSP schrieb:
> Danke für die Antworten.
>
> .dseg
> name: .byte 1
>
>
> name ist klar. da schreib ich meinen namen vom Register rein.
Nein. Das sind KEINE REGISTER, das sind Stellen im SRAM. Register sind 
nur r0-r31.

>  Aber was
> muss ich statt .byte 1 schreiben?
Genau das: .byte 1 Zu mindestens beim Assembler vom AVR-Studio.
> was sag ich dem ATMEGA damit ?
Du sagst DEM ASSEMBLER damit: Reserviere mir 1 Byte und nenne die Stelle 
name.

von Meister E. (edson)


Lesenswert?

troll schrieb:
>> name ist klar. da schreib ich meinen namen vom Register rein.
> Nein. Das sind KEINE REGISTER, das sind Stellen im SRAM. Register sind
> nur r0-r31.

Generell darf man einen Speicherplatz Register nennen, ob es dir gefällt 
oder nicht. r0-r31 sind spezielle Register, nämlich CPU-Register.

von TopSP (Gast)


Lesenswert?

Sehr gut. Danke für die schnelle Hilfe ;-)

Funktioniert. Ideal.

LG

von Cyblord -. (cyblord)


Lesenswert?

Zustimmung Thomas!

Register bezeichnen CPU-Register. Und keine normalen Variablen im Ram. 
Ich wüsste auch nicht wer dafür Register sagen würde. Wikipedia 
definiert das im übrigen genau so.

gruß cyblord

von troll (Gast)


Lesenswert?

Leute, beruhigt euch sonst endet das mit einem Schloss...

von Cyblord -. (cyblord)


Lesenswert?

Meister Eder schrieb im Beitrag #2938199:

> Für jemanden, den PICs nicht interessieren nimmst du es ganz schön
> genau, obwohl diese Haarspalterei weder deine Aussagen bestätigt noch
> meine widerlegt. Dir muss ja echt langweilig sein.

Dann zeig doch mal wo, von mir aus auch in der PIC-Welt, von Registern 
im Sinne von Ram-Variablen gesprochen wird. Ich hab das noch nie gehört, 
lerne aber gerne dazu.
Darum habe ich auch sofort Wikipedia Konsultiert und auch dort heißt es:

> Als Register bezeichnet man in der Digital- oder Computertechnik
> Speicherbereiche, die innerhalb eines Prozessors direkt mit der
> eigentlichen
> Recheneinheit verbunden sind und die unmittelbaren Operanden und
> Ergebnisse aller Berechnungen aufnehmen. Register sind in der Regel
> höchstens so groß wie die Wortgröße des Prozessors (8, 16, 32 oder 64 Bit).

Auch andere Definitionen haben diesen Tenor. Ausschlaggebend für die 
Definition ist auch oft die Tatsache dass Register genauso schnell sind 
wie die CPU, da aus demselben Material und auf dem selben Die. Und das 
schließt Arbeitsspeicher welcher über einen Bus angeschlossen ist, 
definitv aus.

Und da schließt sich der Kreis zur Eingangsfrage. Man kann also nicht 
mehr Register bekommen, da die Anzahl der Register durch die Hardware 
festgelegt ist.

gruß cyblord

von MCUA (Gast)


Lesenswert?

>Microchip benennt seit jeher das RAM der PICs als GPR - general purpose
>register.
Ja. PIC kann mit dem RAM ja auch direkt rechnen. Zumindest die RAM-Zelle 
als Source und (manchmal) auch als Destin. nutzen (allerd. nicht die 
zwei gleichzeitig in einem Befehl (jedenfalls bei den kleineren)). Die 
Grösse der PIC- GPR-Files hängt von der Breite der 'f'-Bits im OP-Code 
ab.

AVR hat (wie ja hier jeder weiss) auch ein GPR-File, aber nur 32 Reg. 
Dieses GPR-File ist universeller als im PIC, weil ja jedes der 32 Reg 
für Source und Destin benutzt werden kann. Es ist aber auch kleiner als 
das im PIC, weil PIC bis zu 13 f-Bits (also für max 8kB) (mache Befehle, 
MOV, bis 16 f-Bits) im Opcode reserviert.
(Also diese beiden 'Modelle' haben Vor- und auch Nachteile)

typ Akkumasch. (bsp HC11,STM8) können für Berechn auch Werte direkt ausm 
Mem holen, aber nicht (bei Berechn) dort rein schreiben. Da ist es 
Geschmackssache, ob man dieses Mem dann Reg-Mem nennen soll oder darf. 
Wenn mit Mem aber nichts ausser LD/ST angestellt werden kann, darf man 
es wohl eher nicht Register-Mem nennen, denn das wäre wohl eine 
Irreführung.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

troll schrieb:
> Leute, beruhigt euch sonst endet das mit einem Schloss...
Nein, ich lösche nur den privaten Kleinkrieg um "Register" und "RAM" auf 
der Ebene von "unter der Gürtellinie" und "unsachlich" raus...

cyblord ---- schrieb:
> Register bezeichnen CPU-Register. Und keine normalen Variablen im Ram.
Auch im 8051/52/535ff sind die Registerbänke ins RAM gemappt:
http://www.8052.com/tutmemor.php

Aber hier geht es ja nicht um PICs und nicht um 8051ff, sondern um AVR.
Und da sind das keine Teile vom RAM. Die korrekte Antwort wurde also 
schon in den ersten beiden Antwortposts gegeben.

TopSP schrieb:
> Wie macht ihr das wenn man sehr viele Register benötigt?
So wie alle anderen auch.
Hast du dir evtl. einfach mal andere Programme angeschaut?
Immerhin hast du Glück: du bist nicht der Erste, der sowas machen 
will...

von Meister E. (edson)


Lesenswert?

cyblord ---- schrieb:
> Meister Eder schrieb im Beitrag #2938199:
>
>> Für jemanden, den PICs nicht interessieren nimmst du es ganz schön
>> genau, obwohl diese Haarspalterei weder deine Aussagen bestätigt noch
>> meine widerlegt. Dir muss ja echt langweilig sein.
>
> Dann zeig doch mal wo, von mir aus auch in der PIC-Welt, von Registern
> im Sinne von Ram-Variablen gesprochen wird. Ich hab das noch nie gehört,
> lerne aber gerne dazu.
> Darum habe ich auch sofort Wikipedia Konsultiert und auch dort heißt es:

Um das noch zu beantworten: Ich habe nicht gemeint, dass man Variablen 
im RAM als Register bezeichnen muss, sondern dass für manche Leute 
nach ersten Erfahrungen mit z.B. PIC16 das RAM und general purpose 
register das gleiche sind und diese Bezeichnung auch bei anderen 
Mikrocontrollern anwenden. Dass daraus Mißverständnisse entstehen ist 
klar. Daher wollte ich einfach der Aussage "Register sind nicht RAM" 
hinzufügen, dass die Bezeichnung "CPU-Register" dagegen eindeutig ist.

Nebenbei: Das von dir verwendete Zitat war eine Reaktion auf Thomas, 
dessen Beiträge nun nicht mehr vorhanden sind.

@Lothar
> Aber hier geht es ja nicht um PICs und nicht um 8051ff, sondern um AVR.

Das war mir auch klar. Mein Beitrag ging dahin, dass vielleicht nicht 
jeder AVR-Neuling sofort die korrekte Terminologie verwendet. Konnte ja 
nicht ahnen, dass sich Thomas derart auf den Schlips getreten fühlt, 
weil ich auf den Beitrag eines Nutzers namens "troll" antworte.

> Und da sind das keine Teile vom RAM. Die korrekte Antwort wurde also
> schon in den ersten beiden Antwortposts gegeben.

Diese Antwort habe ich auch nie angezweifelt. Genauso wenig habe ich 
einen "Kleinkrieg" entfachen wollen, tut mir leid dass das nun so 
dargestellt wird.

Euch allen ein schönes Wochenende!

von Karl H. (kbuchegg)


Lesenswert?

Meister Eder schrieb:

> Um das noch zu beantworten: Ich habe nicht gemeint, dass man Variablen
> im RAM als Register bezeichnen muss, sondern dass für manche Leute
> nach ersten Erfahrungen mit z.B. PIC16 das RAM und general purpose
> register das gleiche sind und diese Bezeichnung auch bei anderen
> Mikrocontrollern anwenden. Dass daraus Mißverständnisse entstehen ist
> klar. Daher wollte ich einfach der Aussage "Register sind nicht RAM"
> hinzufügen, dass die Bezeichnung "CPU-Register" dagegen eindeutig ist.

Man bringt aber speziell Neulinge auch oft nur durcheinander, wenn man 
Wortklauberei betreibt, die im konkreten Fall der Sache nicht wirklich 
dienlich ist.

Bis er soweit ist, dass diese Feinheit für ihn auf einem anderen µC 
relevant wird, rinnt noch viel Wasser die Donau hinunter.

Und bis dahin bringt ihn die einfache Sprach-Regelung

Register    sind Speicherzellen in der CPU, mit der die CPU direkt
            rechnen/arbeiten kann

RAM         ist Arbeitsspeicher, in den und aus dem die CPU Werte
            in/von Registern laden kann um sich so ein paar Register
            für andere Berechnungen frei zu machen. RAM ist das
            'Kellerabteil' in welchem man das Gerümpel zwischenlagert,
            welches man in der Küche jetzt nicht gerade braucht, das
            dort aber in den Schränken Platz verbraucht.

viel mehr weiter, als alle Wortklauberei und Spezialfälle in diversen 
anderen CPUs zusammengenommen.

von Meister E. (edson)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und bis dahin bringt ihn die einfache Sprach-Regelung
>
> Register    sind Speicherzellen in der CPU, mit der die CPU direkt
>             rechnen/arbeiten kann
>
> RAM         ist Arbeitsspeicher, in den und aus dem die CPU Werte
>             in/von Registern laden kann um sich so ein paar Register
>             für andere Berechnungen frei zu machen. RAM ist das
>             'Kellerabteil' in welchem man das Gerümpel zwischenlagert,
>             welches man in der Küche jetzt nicht gerade braucht, das
>             dort aber in den Schränken Platz verbraucht.
>
> viel mehr weiter, als alle Wortklauberei und Spezialfälle in diversen
> anderen CPUs zusammengenommen.

Ja, du hast recht und es tut mir leid dass ich diese "Wortklauberei" 
begangen habe. Aber berücksichtige bitte, dass PIC16 für viele Studenten 
zum Stoff gehört (sogar immer noch der alte 16f84a) und ich keinen 
seltenen Spezialfall aus dem Ärmel gezogen habe den man mit der Lupe 
suchen muss sondern etwas, das hier im Forum auch immer wieder 
auftaucht.

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.