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!
Lesezeichen