- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Frage zum Assemblercode vom Tiny13

  1. #1
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9

    Frage zum Assemblercode vom Tiny13

    Anzeige

    Praxistest und DIY Projekte
    Hallo Forum,

    ich hab mir heute das Datenblatt des ATTiny13 angeschaut und hab da eine Frage zum Assembler Code im Datenblatt:

    http://www.atmel.com/Images/doc2535.pdf

    und auf Seite 44 sind ja die Interruptvektoren angegeben. Ein Stück weiter unten steht dann sowas:

    Address Labels Code Comments
    0x0000 rjmp RESET ; Reset Handler
    0x0001 rjmp EXT_INT0 ; IRQ0 Handler
    0x0002 rjmp PCINT0 ; PCINT0 Handler
    0x0003 rjmp TIM0_OVF ; Timer0 Overflow Handler
    0x0004 rjmp EE_RDY ; EEPROM Ready Handler
    0x0005 rjmp ANA_COMP ; Analog Comparator Handler
    0x0006 rjmp TIM0_COMPA ; Timer0 CompareA Handler
    0x0007 rjmp TIM0_COMPB ; Timer0 CompareB Handler
    0x0008 rjmp WATCHDOG ; Watchdog Interrupt Handler
    0x0009 rjmp ADC ; ADC Conversion Handler
    ;
    0x000A RESET: ldi r16, low(RAMEND); Main program start
    0x000B out SPL,r16 ; Set Stack Pointer to

    Die Zeilen 0x0000 - 0x0009 verstehe ich (sind ja im Endeffekt nur Sprungbefehle zu den eigentlichen Unterprogrammen die den dementsprechenden Interrupt behandeln) aber bei den Zeilen 0x000A und 0x000B bin ich mir noch nicht so sicher ob meine Vermutung zur Funktion stimmt.
    Bei Zeile 0x000A bzw. der Adresse wo die Sprungmarke "RESET" liegt wird mittels ldi eine Zahl in das Register R16 reingeschrieben. Die Zahl ist low(RAMEND). Aber was ist das für eine Zahl?
    Und dann in der Zeile 0x000B wird diese Zahl aus R16 in das SPL Register geschrieben und damit wird der Stackpointer auf eine Zahl "vorgeladen".
    Meine Vermutung ist jetzt das die Zahl "Low(RAMEND)" quasi die letzte Zelle des Flashspeichers ist, da die erste Adresse des Stacks laut Datenblatt ja die letzte Adresse des Speichers ist und die zweite Adresse des Stacks die vorletzte Adresse des Speichers usw.
    Stimmt das so oder hab ich einen Fehler in meiner Überlegung?
    Danke für die Info!
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Ab 0x0A geht einfach das Programm los. RESET: ist die Sprungmarke und
    Code:
    0x0000 rjmp RESET ; Reset Handler
    Sagt ja was gemacht wird. Ein Sprung nach RESET = 0x0A. 0x0B ist die darauf folgende Zeile Programmcode, wo der Stack geladen wird.

    Antwort : Ja hast Recht gehabt.
    Grüße,
    Daniel

  3. #3
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von ePyx Beitrag anzeigen
    Ab 0x0A geht einfach das Programm los. RESET: ist die Sprungmarke und
    Code:
    0x0000 rjmp RESET ; Reset Handler
    Sagt ja was gemacht wird. Ein Sprung nach RESET = 0x0A. 0x0B ist die darauf folgende Zeile Programmcode, wo der Stack geladen wird.

    Antwort : Ja hast Recht gehabt.
    Gut dank dir
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    09.03.2012
    Beiträge
    51
    Zitat Zitat von Kampi Beitrag anzeigen
    Meine Vermutung ist jetzt das die Zahl "Low(RAMEND)" quasi die letzte Zelle des Flashspeichers ist, da die erste Adresse des Stacks laut Datenblatt ja die letzte Adresse des Speichers ist und die zweite Adresse des Stacks die vorletzte Adresse des Speichers usw.
    Stimmt das so oder hab ich einen Fehler in meiner Überlegung?
    Fast...

    RAMEND ist nicht das Ende des Flash-Speichers, sondern das Ende des RAMs. Sonst hieße es ja FLASHEND. Flash-Speicher und RAM sind unterschiedliche Speicher, nicht durcheinanderwerfen.
    Als Stack wird das RAM verwendet, und zwar beginnend mit dem letzten Byte. Am Anfang des RAMs sind die Register gemappt, danach I/O-Zellen, erst dann kommt das "echte" RAM. Jedenfalls, wenn ich das Datenblatt richtig verstanden habe...

    Beim Tiny13 ist low(RAMEND) übrigens gleichbedeutend mit RAMEND, weil die Zahl RAMEND kleiner als 256 ist. Trotzdem ist es üblich, low() zu benutzen, weil diese Form bei größerem RAM notwendig ist (nebst high(RAMEND), z.B. beim ATtiny85) - man gewöhnt sich gleich dran.

  5. #5
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von trekko Beitrag anzeigen
    Fast...

    RAMEND ist nicht das Ende des Flash-Speichers, sondern das Ende des RAMs. Sonst hieße es ja FLASHEND. Flash-Speicher und RAM sind unterschiedliche Speicher, nicht durcheinanderwerfen.
    Als Stack wird das RAM verwendet, und zwar beginnend mit dem letzten Byte. Am Anfang des RAMs sind die Register gemappt, danach I/O-Zellen, erst dann kommt das "echte" RAM. Jedenfalls, wenn ich das Datenblatt richtig verstanden habe...

    Beim Tiny13 ist low(RAMEND) übrigens gleichbedeutend mit RAMEND, weil die Zahl RAMEND kleiner als 256 ist. Trotzdem ist es üblich, low() zu benutzen, weil diese Form bei größerem RAM notwendig ist (nebst high(RAMEND), z.B. beim ATtiny85) - man gewöhnt sich gleich dran.

    Supi dank dir für die ausführliche Erklärung
    Da hab ich wieder den Flash und den RAM durcheinander geworfen
    Danke für die Korrektur.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  6. #6
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ok dann nächste Frage
    Wenn man sich auf Seite 11 das Register zum Stackpointer anguckt sieht man ganz unten auf der Seite (4.5.1) das SPL oder Stack Pointer Low Register.
    Dort steht, dass das Register als Initial Value 1001 1111 (was 9F bzw. 159 entspricht) hat.
    Wenn man sich dann in dem datenblatt auf Seite 16 die Memory Map anschaut, sieht man, dass das letzte Feld des RAMs bei 9F ist.
    Warum macht man sich dann die Mühe und lädt den Stackpointer mit einem Wert den er eh schon beim "einschalten" hat
    Oder verstehe ich den Begriff "Initial Value" falsch?
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Eine für mich plausible Erklärung wäre Sicherheit. In größeren Anwendungen stelle ich meist auch beim Eintritt in das Hauptprogramm sicher, dass der Watchdog und die Interrupts deaktiviert sind. Also einfach nur sicherstellen, dass die Voraussetzungen für das Programm erfüllt sind.

    Hast du mal in ein Datenblatt eines älteren Controllers geschaut? Kann ja auch gut sein, dass es sich aus Erfahrung eingebürgert hat. Soweit ich mich erinnere werden die meisten Register mit 0x00 initialisiert, was das Laden des Stackpointers auch erklären würden.

    Siehe ATmega8 Datenblatt Initialwert für den Stack ist 0x00 und die Adresse ist 0x0060.
    Geändert von ePyx (15.03.2012 um 08:24 Uhr)
    Grüße,
    Daniel

  8. #8
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von ePyx Beitrag anzeigen
    Eine für mich plausible Erklärung wäre Sicherheit. In größeren Anwendungen stelle ich meist auch beim Eintritt in das Hauptprogramm sicher, dass der Watchdog und die Interrupts deaktiviert sind. Also einfach nur sicherstellen, dass die Voraussetzungen für das Programm erfüllt sind.

    Hast du mal in ein Datenblatt eines älteren Controllers geschaut? Kann ja auch gut sein, dass es sich aus Erfahrung eingebürgert hat. Soweit ich mich erinnere werden die meisten Register mit 0x00 initialisiert, was das Laden des Stackpointers auch erklären würden.
    Hab ich auch schon vermutet, dass es wahrscheinlich einfach nur dafür da ist klar deffinierte Zustände zu bekommen.
    Datenblätter von älteren Controllern hab ich mir noch nicht angeschaut. Die ganzen Fragen sind mir erst in den Sinn gekommen als ich das Datenblatt vom Tiny gelesen habe (ist nicht ganz so lang wie das von den Megas )
    Und ja die anderen Register werden alle mit 0x00 initialisiert.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Beim Einschalten oder HW-Reset ist das SP-Laden wohl nicht notwendig. Aber wenn im Programm ein Sprung auf RESET durchgeführt wird, steht der SP ja gerade irgendwo, also daher.
    Und ausserdem, auch ein Compiler ist nur ein Mensch, der hat ein allgemeines "initial sequenz"-Muster, das er nicht je nach Prozessor ändert.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von PicNick Beitrag anzeigen
    Beim Einschalten oder HW-Reset ist das SP-Laden wohl nicht notwendig.
    Bezogen auf den ATiny13 ist das richtig.
    Als pauschale Aussage falsch, nicht alle AVR's initialisieren den SP per Default auf Ramend.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. 100 Impulse per Tastenknopf ausgeben / Assemblercode
    Von Matthiaso11 im Forum Assembler-Programmierung
    Antworten: 5
    Letzter Beitrag: 12.09.2007, 17:09
  2. Tiny13
    Von rolfw20 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 23.03.2007, 10:10
  3. Assemblercode für L298
    Von SMR im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 21.01.2006, 15:59
  4. dcf - 77 assemblercode
    Von NickD im Forum Elektronik
    Antworten: 15
    Letzter Beitrag: 05.08.2005, 20:23
  5. Assemblercode
    Von jomammele im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 5
    Letzter Beitrag: 07.02.2005, 17:00

Berechtigungen

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

12V Akku bauen