hoi,
ben nog steed bezig met de PIC16F84 van deze site, en het lukt mij wel al aardig iets er meer te doen. Maar! Ik zit nog steed met een vraag:
Als je met tabelen wilt werken van gegevens, dan kan je dit gemakkelijk door geheugen adres 02h te gebruiken denk ik. Ik heb dit kunnen afleiden uit projectjes van internet.
Ik weet echter niet hoe of wat ik met dat adres moet doen om goed te kunnen werken. In de datasheet staat daar ook zo goed als niets over.
Kan mij iemand uitleggen hoe ik dat adres moet gebruiken en wanneer en waarvoor het aangesproken moet worden?
Of als er een andere manier is om met een tabel (gegevens in een tabel met RETLW in) te werken mij dit ook uit te leggen.
alvast bedankt
GRTZZZ Sille

Op do 03-10-2002 15:52:12 schreef sille:
hoi,
ben nog steed bezig met de PIC16F84 van deze site, en het lukt mij wel al aardig iets er meer te doen. Maar! Ik zit nog steed met een vraag:
Als je met tabelen wilt werken van gegevens, dan kan je dit gemakkelijk door geheugen adres 02h te gebruiken denk ik. Ik heb dit kunnen afleiden uit projectjes van internet.
Ik weet echter niet hoe of wat ik met dat adres moet doen om goed te kunnen werken. In de datasheet staat daar ook zo goed als niets over.
Kan mij iemand uitleggen hoe ik dat adres moet gebruiken en wanneer en waarvoor het aangesproken moet worden?

Geheugenadres 02h is de programcounter. Dit is dus de teller die aangeeft bij welke regel de PIC bezig is. Het gebruik daarvan is een trucje en staat daarom ook niet echt goed beschreven in de datasheet, maar dat hoeft ook niet.

Ik zal ff kort uitleggen wat er gebreurt bij de programmacodes waar die tabellen zijn gebruikt.
Je zorgt eerst dat je een teller hebt die op 0 staat(gebruik daar dus een variabele voor). Spring met een commando naar de allereerste regel van de tabel. Op die allereerste regel wordt de waarde van de teller opgeteld bij de huidige waarde van de programcounter. Oftewel de programcounter zal gaan springen naar een plek in je tabel. Waarna die dus een RETLW regel te pakken krijgt. Door die RETLW zal er weer worden teruggesprongen naar het normale programma en zal er iets in je W zijn gestopt.

Dan kan je allemaal bewerkingen doen en wat je dan ook maar wilt. Eenmaal dat gedaan verhoog je de variabele waar de teller in zit met 1. Je laat hem weer springen naar het begin van de tabel en er wordt weer een waarde bij de programcounter opgetelt. Nu springt je programma echter 1 regel verder.

Op deze wijze word de hele tabel afgewerkt.

Dan nog een laatste iets. Die tabel moet natuurlijk op een gegeven moment stoppen. Om nou een soort einde in te bouwen hebben de meeste programmeerders gebruik gemaakt van FFh als waarde op de laatste regel. Zou je dus na RETLW zijn teruggesprongen naar je oorspronkelijke programma en er zit een FFh in je W, dan weet je dat de tabel klaar is en er dus niet meer naar toegeprongen word.

Het is een beetje lastig om dit in 1 keer te begrijpen denk ik maar als je gewoon een voorbeeld programma erbijhoudt en er dan even rustig naar kijkt dan lukt het je best :)

Ik ben zelf ook bezig geweest met een pic
die tutorial op deze site heeft mijn intresse gewekt om toch hiermee iets te proberen
ik heb een routine geschreven om een stappenmotor te besturen hierin gebruik je ook tabbellen
ik heb wel een paar voorbeelden voor je
mijn eigen routine staat geen commentaar bij maar met de voorbeelden erbij kun je wel nagaan wat ik doe
heb de routine overigens aleen gesimuleerd nooit echt in een pic gezet.
als je er belang bij hebt hoor ik het wel.

Op vr 04-10-2002 22:48:17 schreef k.p.meinesz:
ik heb wel een paar voorbeelden voor je

Ja, ik zou graag die voorbeelden es zien.
Je mag ze me altijd mailen, of op het forum plaatsen
alvast bedankt

Bastiaan, bedankt voor de uitleg. ik begrijp er toch al iets meer van nu, maar ik zal het wel allemaal gaan begrijpen als ik er eens mee probeer te werken.

plaats ze op het forum

dan hebben meerdere mensen er wat aan...

en anders blijf je ze meelen :D

Op za 05-10-2002 23:28:29 schreef sille:
[...]
Bastiaan, bedankt voor de uitleg. ik begrijp er toch al iets meer van nu, maar ik zal het wel allemaal gaan begrijpen als ik er eens mee probeer te werken.

Je moet er zeker wat mee gaan proberen gewoon. Ik raad je aan om MPLAB te gebruiken voor de simulatie van een voorbeeld, zodat je door steppen precies kunt zien wat er gebeurt.

Dit is een eerste poging om een ucn 5804 stepper ic na te bootsen


trisa		equ	85h
trisb		equ	86h
stepco		equ	40h
portb		equ	06h  
plc		equ	02h
status		equ	03h
porta		equ	05h

		org	00h
		clrf	portb
		clrf	porta				
		bsf	03,5
		movlw	00h   ;maakt poort a uitgang	
		movwf	porta 
		movlw	b'11111111' ;maakt poort b ingang	
		movwf	portb 	
		bcf	03,5

start		btfsc	portb,3      ;hand bediening links
		goto	halfdrivel
		btfsc	portb,4      ;handbediening rechts
		goto	halfdriver
		btfss	portb,0      ;paralell poort bedien
		goto	start		
		btfss	portb,1      ;stap	 
		goto	links		
		goto	rechts
		
links		btfss	portb,2      
		goto	fulldrivel
		goto	halfdrivel

rechts		btfss	portb,2
		goto	fulldriver
		goto	halfdriver
	
fulldrivel	decf	stepco,1  
		call	fdlinks
		decf	stepco,1
		call	fdlinks	
		goto	step

fulldriver	incf	stepco,1
		call	fdrecht
		incf	stepco,1
		call	fdrecht
		goto	step

reset2		movlw	07h
		movwf	stepco
		return

reset1		movlw	00h
		movwf	stepco		
		return

halfdrivel	decf	stepco,1
		call	fdlinks
		goto	step

halfdriver	incf	stepco,1
		call	fdrecht
		goto	step

step		call	steptab
		movwf	porta
		goto	zero

steptab		movf	stepco,0 ;haalt de waarde op
		addwf	plc,1    ;telt deze bij plc(02)op
		retlw	01h      ;+1
		retlw	03h      ;+2
		retlw	02h      ;+3
		retlw	06h      ;+4
		retlw	04h      ;enz
		retlw	0ch
		retlw	08h
		retlw	09h

fdrecht		movlw	08h
		subwf	stepco,0
		btfsc	status,2
		call	reset1
		return

fdlinks		movlw	0ffh
		subwf	stepco,0
		btfsc	status,2
		call	reset2
		return
zero		btfsc	portb,0    ;kijkt of portb=0
		goto	zero
		goto	start
		end

edit: zo is het beter te lezen :)

[Bericht gewijzigd door Bastiaan op ]

*zucht* Ik ben eens aan het proberen geweest, maar het lukt me niet.
Ik wou een tabel van 5 getallen steeds na elkaar op portb brengen, maar dat lukt me niet echt.
De eerste keer dat hij de tabel overloopt gaat het goed, maar vanaf de tabel de 2de keer overlopen moet worden keert deze steeds terug zonder een waarde uit de tabel te hebben gehaald.
wat moet ik doen om het te laten werken?

zet je routine eens in het forum dan kunnen wij kijken wat er aan scheeld
als je mijn routine bekijkt zie je ergens fdlinks/fdrechts
deze waarde worden bij elke stap bekeken is de waarde hoger
als de tabel (08) of lager (ff) dan word de teller op 0 of 07 gezet zodat deze niet buiten zijn bereik loopt

niet opgeven gewoon even door bijten
ik het die tutorial hier gelezen en dacht da'kan'k'nie
maar ik ben eigenwijs dus toch proberen
1 weekje geprobeerd voorbeelden zoeken zie hier
een stappen controller nog niet helemaal klaar maar het werkt.
suc6

[Bericht gewijzigd door k.p.meinesz op ]

Ja, ik denk dat ik weet hoe het komt. Ik denk dat mijn teller buiten zijn bereik komt.
Alleen weet ik niet goed hoe ik dat nu moet oplossen.
In jou voorbeeld (k.p.meinesz) word er ook verwezen naar "status" geheugenplaats 03h.
Ik weet niet wat daarmee gedaan word want ik weet niet waarvoor status dient.


Start 	ORG 0x00            
        BSF 03,5
        MOVLW 00h
        MOVWF 05h
        MOVWF 06h
        BCF 03,5
	call reset
	goto	begin

tabel	ADDWF 	02h,1  
	retlw	01h
	retlw	02h
	retlw	03h
	retlw	04h
	retlw	05h	
	retlw	0FFh

begin	
	movwf	06h
	incf	19h
	movf	19h,0
	call	tabel
	goto begin
	call	reset

reset	clrf	19h
	return
  
	END

[Bericht gewijzigd door sille op ]

Sille -> plaats ff jouw programma, want dan zijn we er zo uit.

Op di 08-10-2002 19:49:15 schreef Bastiaan:
Sille -> plaats ff jouw programma, want dan zijn we er zo uit.

was ik dus net mee bezig. ;)

Op di 08-10-2002 19:43:31 schreef sille:


tabel	ADDWF 	02h,1  
	retlw	01h
	retlw	02h
	retlw	03h
	retlw	04h
	retlw	05h	
	retlw	0FFh

Mooie tabel alleen in je programma doe je niks met die laatste FFh dus zal die na die regel 05h en 0FFh vrolijk verder gaan in gebieden waar die helemaal niks mag doen.


begin	
	movwf	06h
	incf	19h
	movf	19h,0
	call	tabel
	goto begin
	call	reset

reset	clrf	19h
	return
  
	END

Je regel 'call reset' zal nooit worden uitgevoerd.

Op di 08-10-2002 20:36:56 schreef Bastiaan:

Je regel 'call reset' zal nooit worden uitgevoerd.

ik weet dat daar nog iets tussen moest. maar ik weet niet wat, of hoe ik het precies moet doen.
die call reset stond er al tussen omdat ik wel wist wat er moest gebeuren, maar niet hoe ik het moest laten gebeurn.
daarom zei ik ook dat ik dacht dat mijn teller buiten bereik ging...

je moet steeds de waarde ff aftrekken van je poort of adres
op het moment dat de uitkomst nul is veranderd er iets in het status register zie blz 15 van de datasheet.
met die verandering kun je dan iets laten gebueren.

kan je de routine ook meteen wel geven maar ik denk dat je beter kunt onthouden als je het zelf uitvist.

je komt er wel uit

suc6

blijf vragen als het niet lukt maar blijf proberen.