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


von Alexander Otten (Gast)


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

von crazy horse (Gast)


Lesenswert?

Fehler in Zeile 17ff

von Alexander Otten (Gast)


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

von Frank Linde (Gast)


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

von Alexander Otten (Gast)


Lesenswert?

Fehler in Zeile 17FF ???
Was soll mir das sagen ?

von Alexander Otten (Gast)


Lesenswert?

ich benutze den MEGA8535

von Denis Gérard (Gast)


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

von Peter D. (peda)


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

von Alexander Otten (Gast)


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

von Frank Linde (Gast)


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

von Alexander Otten (Gast)


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

von Olaf Kindel (Gast)


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

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.