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
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.
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
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.
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.
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
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
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.
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.
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.
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
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
>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.
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...
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!
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.
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.