Ik heb zojuist een functie gemaakt die het mogelijk maakt om een getal van 0 tot 100 om te zetten naar naar een willekeurig ander getal. Maar als ik het programma test dan krijg ik altijd een stack overflow.
Wreg krijgt een waarde van 0 tot 100
Is er mss een andere oplossing




PROCENT2TIME    ADDWF   PCL,F           

TIME
	RETLW	-D'255'	;0%
        NOP          ;Getallen van 1 tem 9 komen nooit voor
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	RETLW   -D'176'	;10%
        RETLW   -D'174'	;11%
        RETLW   -D'172'	;12%
        RETLW   -D'170'	;13%                
	RETLW   -D'168'	;14%
	RETLW   -D'166'	;15%
	RETLW   -D'164'	;16%
        ...
								RETLW   -D'22'	;89%
	RETLW   -D'20'	;90%
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	RETLW   D'0'	;100%

Hoe ziet de code er uit die de call maakt? En je kunt zowiezo geen NOP's gebruiken in een tabel. (Als er ergens een NOP staat, wordt net zo lang doorgestapt tot de eerste RETLW, en deze waarde wordt geretourneerd. Dat lijkt me niet helemaal de bedoeling...)

Als jij procent2time met een call aanroept is er niets mis met dit stukkie code.

De call en retlw heffen elkaar weer op.
Call zet nl een edress in de stack en retlw haalt hem er weer af.
Je kan maximaal 7 calls achter elkaar hebben zonder return of retlw.
Kom je boven de 7 dan krijg je de stackoverflow.

Op 14 juni 2007 21:35:27 schreef Arco:
Hoe ziet de code er uit die de call maakt? En je kunt zowiezo geen NOP's gebruiken in een tabel. (Als er ergens een NOP staat, wordt net zo lang doorgestapt tot de eerste RETLW, en deze waarde wordt geretourneerd. Dat lijkt me niet helemaal de bedoeling...)

Hoe vul ik de leegtes dan op tussen 0 en 10 procent?

Hoe vul ik de leegtes dan op tussen 0 en 10 procent?

Met een RETLW + waarde die je wilt retourneren. (bv 0x00 of 0xFF)

Op 14 juni 2007 21:36:19 schreef The Headhunter:
Als jij procent2time met een call aanroept is er niets mis met dit stukkie code.

De call en retlw heffen elkaar weer op.
Call zet nl een edress in de stack en retlw haalt hem er weer af.
Je kan maximaal 7 calls achter elkaar hebben zonder return of retlw.
Kom je boven de 7 dan krijg je de stackoverflow.

Maar hoe kan ik dan door in W een percentage te stekken er een tijd uitkrijgen na het oproepen van een 'functie'.

Dit gebeurt toch met een call en RETLW

Hoe vul ik de leegtes dan op tussen 0 en 10 procent?

RETLW -D'0'

Edit:
Moet je negatieve getallen hebben, omdat er een min teken voor staat ?

[Bericht gewijzigd door MMSoft op ]

Het probleem lijkt mij toch te zitten in optellen van de PCL te zitten, want bij het optellen is deze 0x77 en als ik er 0x0B bijtel kom ik op 0x83 terecht. Ergens op een totaal verkeerde plaats.

Op 14 juni 2007 21:55:57 schreef MMSoft:
[...]RETLW -D'0'

Edit:
Moet je negatieve getallen hebben, omdat er een min teken voor staat ?

Ja TMR0 gaat bij deze waarde optellen en moet een event genereren bij overgang naar 0.

[Bericht gewijzigd door Henry S. op ]

Het probleem lijkt mij toch te zitten in optellen van de PCL te zitten, want bij het optellen is deze 0x77 en als ik er 0x0B bijtel kom ik op 0x83 terecht. Ergens op een totaal verkeerde plaats.

Lijkt me niks mis mee?

Op 14 juni 2007 22:05:21 schreef Arco:
[...]
Lijkt me niks mis mee?

Is er mss een probleem als de mijn programma meer dan 255 lijnen bevat want ik zie de PCL verscheidene keren via 0 paseren.
Weet de de PCL dan nog wel naar welke lijn te wijzen?

Voor het aanroepen van de tabel wel PCLATH goedzetten, en als er in de tabel een page-roll-over zit moet dat ook worden aangepast (M.a.w. als de tabel niet helemaal op een 256 byte page staat, maar verdeeld over 2)


		movlw	LOW procent2time       ;Lage 8 bits adres  	
		addwf	offset,f               ;Gewenste waarde optellen 			 
		movlw	HIGH procent2time      ;Hoge bits van adres
		btfsc	status,c               ;Als c set, dan roll-over
                addlw	d'1'                   ;(dus 1 optellen)
		movwf	pclath                 ;Save PCLATH
		movf	offset,w               ;Laad op te zoeken waarde weer	
		call	procent2time
                ..
                ..

	

procent2time    movwf   pcl
                retlw   0
                retlw   1
                ..
                ..
                .. 
                retlw   99
                retlw   100
         

[Bericht gewijzigd door Arco op ]

Momenteel heb ik het zo gebouwd.

De call
http://www.uploadarchief.net/files/download/1_retlw.jpg

Juist voor de call zit in offset 0x43 en PCLATH 0x01
Een deel van de functie
http://www.uploadarchief.net/files/download/2_retlw.jpg

Maar dit blijkt nog niet echt te werken.
Het programma lijkt wel elke keer anders te reageren.

[Bericht gewijzigd door Stanley_1 op ]

Het is wat eenvoudiger om de code gewoon te plaatsen met code-tags (i.p.v. jpg)
Ook wat moeilijk om van deze stukjes te zeggen wat er niet klopt. Klopt offset 0x43 wel? Kan niet zien waar je die laadt. Ook de returnwaarde van de tabel is niet te zien. (Het getoonde stukje loopt maar tot 0x13, dus 0x43 valt daarbuiten...)

Op 17 juni 2007 22:39:34 schreef Arco:
Het is wat eenvoudiger om de code gewoon te plaatsen met code-tags (i.p.v. jpg)
Ook wat moeilijk om van deze stukjes te zeggen wat er niet klopt. Klopt offset 0x43 wel? Kan niet zien waar je die laadt. Ook de returnwaarde van de tabel is niet te zien. (Het getoonde stukje loopt maar tot 0x13, dus 0x43 valt daarbuiten...)

Sorry mar ben niet zo vertrouwd met MPLAB. Ben er eigenlijk nog maar een paar maanden mee bezig.

Maar heb het ondertussen gevonden. Ik moest natuurlijk Bij het startadres nog een getal tss 0 en 100 optellen.

Hartelijk dank.