-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Register 0 bis 15

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473

    Register 0 bis 15

    Anzeige

    Also kurz und knapp:

    überall wird immer mit Register 16 - 31 gearbeitet, wofür sind die r0 - 15 zu brauchen?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Ich kann Deine Aussage nicht nachvollziehen, ich arbeite oft mit R0-R15 als Beispiel kannst Du Dir das Programm anschauen, das ich hier gepostet habe.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Bit-sparen, ganz einfach

    Man mußte alle Maschinenbefehle in 16-Bit (ein Befehls-Wort) unterbringen.
    Es gibt also Befehlsgruppen f. Register 0-15 und f. 16 - 31
    in denen sind jeweils 4-Bit für die Register-nummer, also immer 0-15
    Bei den Befehlen für 16-31 wird dann automatisch 16 draufaddiert.
    http://www.roboternetz.de/wissen/ind...a16_und_Mega32 ->Adressmapping
    Wenn es noch weiter interne, technische Gründe dafür geben sollte (die Speicherbereiche sind ja tatsächlich nicht so einheitlich beschaffen, wie es vielleicht scheint), dann kann ich sie dir leider nicht sagen (nix weißt er).

    Vielleicht kommt aber noch wer, der das weiß
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    Wenn man nicht täglich programmiert und die ganzen Befehle auswendig weiß, dann kann man sich schlecht merken, welche der 120 Befehle nicht mit r0-r15 funktionieren, da gibt es nämlich einige Ausnahmen. Und weil ich das Risiko nicht eingehen und auch nicht immer nachlesen will, nehme ich halt gleich r16-32, dann geht nichts schief...fast nichts, Ausnahmen gibt es auch da. Außerdem reichen die meistens aus.
    Allerdings benutze ich die unteren Register trotzdem manchmal, zb zum Speichern von Flags, also wo ich sicher bin, dass ich keine komplizierten Operationen ausführen will.
    Ist bei mir also eine Art Vorsichtsmaßnahme.
    Gruß

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Gock hat das schon fast richtig beantwortet.

    Fast alle imidiate Befehle also LDI, CPI, ORI, ANDI, usw. gehen nicht mit den Registern 0...15.
    Will man also eine Konstante mit einem Register verarbeiten, funktioniert das nur mit den Registern 16 bis 31.

    Beispiel:
    LDI r16,0x34
    OUT TCCR1,r16

    würde nicht mit Register r1 gehen.

    Da man aber immer solche Werte wohin übertragen muß nimmt man für Ladeoperationen halt gleich immer die Register 16...31 her.

    Die letzten 6 Register lassen sich auch als Doppel Register x,y,z ansprechen.
    Man kann somit indizierte Adressierungen mit Auto Increment mit nur einem Kommando ausführen.
    ld r16,x+
    st y+,r16

    Wäre eine Verschiebung des Inhaltes von RAM Inhalt (x) nach (y) mit automatischer inkrementierung der x und y Register.

    Einen Sonderfall gibts noch bei der Operation LPM, die geht bei manchen Controllern nur mit dem Register r0.

    Eine genaue Beschreibung der einzelnen Befehle und der zulässigen Operatoren und Register findest Du im AVR Studio in der Hilfe unter "Assembler Help".

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    ok, das ist schin was.
    Könnte mir jemand das kleinste Program das er zunm Thema Pointer hat mal posten?
    In C hab ich die Dinger schonmal benutzt, also vom Prinzip her weiß ich schon was das ist. Ich hätte nur gerne ein konkretes Beispiel.

    Danke

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Im Prinzip hab ich Dir die Antwort schon in meinem vorherigen Post gegeben

    ldi XL,low(ramadr1) ; X Register vorladen
    ldi XH,high(ramadr1)
    ldi Yl,low(ramadr2) ; Y Register vorladen
    ldi YH,high(ramadr2)
    ldi r17,0xff ; Schleifenzähler auf 255 einstellen
    loop:
    ld r16,x+
    st y+,r16
    dec r17
    brne loop
    ....
    Kopiert 255 Bytes von ramadr1 nach ramadr2

    Wie Du die Daten in das RAM vorab reinkriegst ist wieder eine andere Geschichte.
    Mit dem Begriff Pointer würd ich ein wenig vorsichtiger umgehen.
    Auch für den Stack gibt es einen Pointer auf den man aber nicht so einfach zugreifen kann.
    Indexregister trifft es da schon eher.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    Also, wenn ich das richtig sehe,

    ist
    ld r1,x+
    das selbe wie
    ld x+,r1
    ?

    weil ld x+,r1 => post inc
    und
    ld +x,r1 => pre inc

    right?

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    Natürlich nicht!
    Du kannst nicht einfach Adressregister und Zielregister tauschen. Im Instruction Set steht die Syntax, solltest Du lesen:
    LD Rd, X
    Rd ist das Zielregister, X das Adressregister für die indirekte Addressierung.
    LD X, Rd ergibt einen Compilierungsfehler, denke ich.
    Pre oder Post increment bedeutet nur, ob er erst die Register laden soll und dann incen oder ersten incen und dann Register laden.
    Gruß

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    m´kay, dann hängt das einfach daran, dass ich beim laden erst ziel- dann adressregister angebe und bei store das ganze umgekehrt. Und dir regeln für pre und post dann jeweils gelten.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •