ADR

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

Hinweis kann nach Kenntnisnahme deaktiviert werden!

  • Mit ADR und ADR2 legt der Compiler die Adresse einer Programmmarke im Programmcode ab.
    Mit ADR und seinem Verwandten ADR2, hat man die Möglichkeit die Adresse eines Labels in den Programmcode zu integrieren. Das kann theoretisch an beliebiger Stelle im Programmcode geschehen. Theoretisch deshalb, weil eine inmitten des Programmflusses platzierte Adresse vom Mikrocontroller wie Operationscode behandelt werden würde und dabei alles passieren könnte. Der beste Ort für Adresskonstanten, wie auch für alle anderen Konstanten, ist in der Regel nach dem Programmende.
    So sollten auch sinnvollerweise die Stellen an denen Adressen platziert werden, ebenfalls durch Programmmarken, einem Label markiert werden, um diese auch wieder gezielt abrufen zu können.


    Adr2

    ADR2 ist im Grunde das Gleiche wie ADR, nur das die Adresse um ein Bit nach links geschoben ist. Solch eine Linkschiebung führt zu demselben Resultat wie eine Multiplikation mit 2, daher ADR2.


    Beispiel

    BASCOM-Quellcode

    1. Adressen:
    2. Adr2 Datensatz_0
    3. Adr2 Datensatz_1
    4. Adr2 Datensatz_2
    5. Datensatz_0:
    6. Data 11 , 12 , 13
    7. Datensatz_1:
    8. Data 21 , 22 , 23
    9. Datensatz_2:
    10. Data 31 , 32 , 33
    Alles anzeigen

    Ein vollständiges Beispiel findet sich unter dem Stichwort Dataptr.


    Zum Hintergrund

    Jeder Lesevorgang aus dem Programmspeicher wird durch eine LPM-Instruktion realisiert. LPM (LoadProgrammMemory - Lade aus dem Programmspeicher, ROM) ist Bestandteil des AVR-Befehlsvorrats, siehe Datenblatt. Je nach Typ existieren zusätzlich noch erweiterte Formen dieses Befehls.
    Mit diesem Befehl ist es nun möglich ein Byte aus dem Programmspeicher zu lesen. Die Adressierung erfolgt über das Zeigerregister Z, gebildet aus den Registern R31|R30.
    Aus Sicht der LPM-Instruktion, besteht der Inhalt des Zeiger Z aus einer 15Bit breiten Adresse (Bit 15…1) und einem Selektier-Bit (Bit0)

    Der Programmspeicher ist im Gegensatz zum SRAM Wortorganisiert, d.h. unter jeder Programmspeicheradresse liegen 2 Byte (16Bit) vor. Um nun entweder das High-Byte oder Low-Byte unter einer gegebenen Flash-Rom Adresse auszulesen, muss die Adresse zuerst in das Z-Register geladen werden. Das Bit0 des Z-Registers ist nun ausschlaggebend dafür ob das High-Byte (1) oder das Low-Byte (0) gelesen wird. Die Adresse selbst muss im Z-Register die oberen 15Bit belegen.
    Multipliziert man nun eine Adresse mit 2, wird automatisch das Selektier-Bit frei, bzw. zu 0 und die Adresse steht vollständig im oberen Teil des Zeigerregisters. Somit zeigt der Zeiger Z auf das Low-Byte einer gegebenen Adresse. Ein fortlaufendes Inkrementieren des Zeigers würde dann auch den Verweis, Byte für Byte auf den weiteren Programmspeicherverlauf führen.
    Es ist nun aber auch ersichtlich, dass mit 15 Bits nur eine Adressierung bis 7FFFh möglich ist. Das entspricht einer maximal adressierbaren Programmspeichergröße von 32768 Worten, bzw. von 65536 Bytes, also 64kByte. AVR mit größerem Programmspeicher, z.B. der ATmega128 mit 128K, verfügen deshalb noch über ein Z-Rampenregister mit dem der Adressraum erweitert werden kann.

    4.729 mal gelesen