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