ey,

Ik heb een simpel programmatje gemaakt voor een ontwikkelingsbordje waar een mega128 op zit.
In dat programma heb ik het ram gedeelte aangewezen als stack.


LDI TEMP,LOW(RAMEND)
OUT SPL,TEMP
LDI TEMP,HIGH(RAMEND)
OUT SPH,TEMP

Nu wil ik hetzelfde programma in een ATtiny15 zetten, deze heeft alleen geen ram geheugen maar een 3level hardware stack. Moet ik deze nog aanwijzen in de stackpointer, of op een andere wijze nog activeren. Of kan ik direct met RCALL een routine opvragen en met RET de programmateller+1 weer opvragen?

alvast bedankt voor de antwoorden

The ATtiny15L uses a 3-level-deep Hardware Stack for subroutines and interrupts. The
Hardware Stack is nine bits wide and stores the Program Counter (PC) return address
while subroutines and interrupts are executed.
RCALL instructions and interrupts push the PC return address onto Stack level 0, and
the data in the other Stack levels 1 - 2 are pushed one level deeper in the Stack. When
a RET or RETI instruction is executed the returning PC is fetched from Stack level 0,
and the data in the other Stack levels 1 - 2 are popped one level in the Stack.
If more than three subsequent subroutine calls or interrupts are executed, the first values
written to the Stack are overwritten. Pushing four return addresses A1, A2, A3, and
A4 followed by four subroutine or interrupt returns, will pop A4, A3, A2, and once more
A2 from the Hardware Stack.

zo uit de datasheet..
er staat nergens iets over het initialiseren van de stack dit is niet nodig.. er zijn ook geen SPL en SPH registers aanwezig..

zoals in het stukje hierboven beschreven kun je dus maar drie subroutines achter elkaar hebben de vierde overschrijft de laatste waarde.
MAW je springt van A1 naar A2 van A2 naar A3 en van A3 naar A4 dan zal de RET of RETI van A4 springen naar A3 die van A3 naar A2 en A2 springt naar A2 omdat het return adres van A1 is overschreven.

Het is dus een 3 level hardware stack er is dus ruimte voor drie.. desbetreffend data of Jump's hier moet je rekening mee houden

ey, bedankt voor je antwoord, ik heb ondertussen de fout in mij programma gevonden.

Ik had een 24 bit timer gemaakt deze had 3 interne subroutines en daarnaast moest ik nog naar de 24 bit timer springen, dus had ik eigenlijk een 4-level stack nodig.

Thanks!

graag gedaan, was iets geweest waar ik waarschijnlijk zelf ook naar had moeten zoeken..