mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Register R0-R31 wirklich General Purpose ?!?


Autor: Alexander Otten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

Vielleicht kann mich ja mal jemand erleuchten.
Ich habe ein Programm geschrieben wo ich diverse Schwellwerte,
Rechenwerte, Vergleichswerte speichern möchte ( ca. 15 Werte). Da ich
vorher mit Microchip PICs gearbeitet habe bin ich jetzt ein bischen
verwirrt.
Mein Programm benutzt 2 Timer ISRs (falls das wichtig sein sollte). Je
nachdem in welche Register ich bestimmte Werte abspeichere gibts es
fehlfunktionen (die Werte werden überschrieben oder erst garnicht
gespeichert). Belege ich die Register-Variablenzuweisung neu dann
funktioniert wieder ein anderer Teil nicht. Ich habe auch schon gemerkt
das man nur mit bestimmten Registern Vergleichsoperatioen durchführen
kann u.s.w.
Mir scheint so als hätten manche Register bestimmte Funktionen und
können NICHT frei verwendet werden.
Jetzt habe ich einige Werte im RAM abgelegt und siehe da, mein Programm
funktioniert schon besser.
Allerdings kann ich ja anscheinend im RAM keine symbolischen Adressen
mehr verwenden... (das ist sehr lästig uns unübersichtlich)

Welche Register kann ich denn jetzt wirklich frei verwenden ???

Gruß
Alex

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler in Zeile 17ff

Autor: Alexander Otten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Als beispiel wie dämlich das ist:
So sieht meine 3-fach verschachtelte Warteschleife aus:
WAIT1:

    ldi    temp,8
    sts    $0004,temp
LOOP3:
    ldi    temp,255
    sts    $0005,temp
LOOP2:
    ldi    temp,255
    sts    $0006,temp
LOOP1:
    lds    temp,$0006
    dec    temp
    sts    $0006,temp
    brne  LOOP1

    lds    temp,$0005
    dec    temp
    sts    $0005,temp
    brne  LOOP2

    lds    temp,$0004
    dec    temp
    sts    $0004,temp
    brne  LOOP3
    ret

Autor: Frank Linde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von welchem MC sprechen wir denn? Falls AVR, dann sind nur die Register
16-31 mit allen Befehlen nutzbar, bei den Registern 0-15 gibt es
Einschränkungen. Die Register 26 bis 31 können paarweise als
16-Bit-Zeiger (X, Y, Z) verwendet werden. Bei einigen Typen kommen dann
noch Sonderverwendungen für Hardware-Multiplikation usw. hinzu. Genaues
steht im Datenblatt.

Gruß, Frank

Autor: Alexander Otten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler in Zeile 17FF ???
Was soll mir das sagen ?

Autor: Alexander Otten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich benutze den MEGA8535

Autor: Denis Gérard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau mal ins datenblatt des jeweiligen mc nach,
Reg 0-15 sind einfache register, 16 bis 32 sind bessere register weil
sie wie I/O register behandelt werden können und ab 24 sind es
besondere register z.B. für rechenopereationen und son zeugs,

so in etwa sollte es sein, hab auch nicht viel ahnung davon

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar kannst Du Variablen Namen zuweisen:

.dseg
        .org            0x60 ;Beginn des RAM
Rx_Buff:        .byte   64
var1:           .byte    1
var2:           .byte    1

.cseg

Nur R0 und R1 werden als Ergebnis des LPM oder MUL Befehls verändert.
Alle anderen erst dann, wenn Du sie benutzt.

Wenn also ein Register überschrieben wird, dann hast Du es eben auch in
einer anderen Funktion mit benutzt.

Auf R0..R15 lassen sich die Befehle mit "I" am Ende nicht benutzen
(LDI, SUBI usw.).


Du solltest Dir aber ruhig erst mal das Instructionset der AVRs
ansehen.


Peter

Autor: Alexander Otten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, danke euch...
das hat mir denke ich mal geholfen.

Ich muß trotzdem sagen das die Datenblätter von Microchips MCUs doch um
einiges übersichtlicher und verständlicher sind als die von ATMEL.

Gruß
Alex

Autor: Frank Linde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, ja, AVR und PIC sind doch sehr unterschiedlich und wenn Du mit PICs
vertraut bist, dann sieht das Datenblatt des AVR vielleicht erst einmal
 verwirrend aus. Aber bisher sind mir die AVR-Datenblätter noch keine
Antwort schuldig geblieben. Was findest Du denn
unübersichtlich/unverständlich?

Gruß, Frank

Autor: Alexander Otten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, vielleicht war ich ein bissel voreilig mit dieser Aussage.
Allerdings was man bei der Benutzung der Register zu beachten hat (wie
Peter es oben beschreibt), finde ich nicht im Datenblatt. Zumindest
nicht so das man es direkt versteht. Mir fehlen so die "Achtung"
Hinweise.
Bei den Timern werden erst mal alle Funktionen aufs kleinste Detail
auseinander genommen und am Ende steht dann welche Register für was
zuständig sind.
Ich hätte gerne lieber so Rubriken wie "Timer als Counter" und
"Timer als PWM Generator" oder so...
Dann wußte ich ebenfalls nicht wie ich das interne RAM lesen und
beschreiben konnte. Das man dafür extra Befehle braucht, hätte man ja
auch mal erwähnen können.
Für euch ist das mit Sicherheit selbstverständlich, aber als Ein-
b.z.w. Umsteiger steht man erstmal im dunkeln.

Ich muß ganz ehrlich sagen, ich hatte das Datenblatt zuerst nur als PDF
im Rechner. Wenn man sich das Teil mal ausdruckt, läßt sich schon
wesentlich besser damit arbeiten.

Gruß
Alex

Autor: Olaf Kindel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du den Text von Peter Dannegger genau anguckst, dann sollte Dir
auch auffallen, daß der nutzbare SRAM erst bei 0x0060h beginnt. In die
Adressen 0x00h-0x60h werden die Register R0-R31 und sämtliche
I/O-Steuerregister gemapped, was für manche Zwecke ganz nützlich sein
kann (z.B. mit einer Schleife alle Register R0-R31 auf den Stack
retten). Das dürfte erklären, warum bei Deinem Codebeispiel so lustige
Sachen passieren können.

MfG Olaf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.