sille
Electronics is a fine hobby ;-) http://www.electro-online.be
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
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
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 
k.p.meinesz
Een schizofreen is nooit alleen!
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.
sille
Electronics is a fine hobby ;-) http://www.electro-online.be
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.
Jeroen Boere
IF you can't convince them, then confuse them!
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
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.
k.p.meinesz
Een schizofreen is nooit alleen!
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 ]
k.p.meinesz
Een schizofreen is nooit alleen!
hier kun je nog een paar voorbeelden vinden:
www.phanderson.com/PIC/16C84/routines/step_4.htm
www.phanderson.com/PIC/16C84/routines/step_3.htm
www.phanderson.com/PIC/16C84/routines/step_2.htm
www.phanderson.com/PIC/16C84/routines/step_1.htm
nog even een onnodige opmerking:
www.google.com
zoeken naar asm+pic16f
sille
Electronics is a fine hobby ;-) http://www.electro-online.be
*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?
k.p.meinesz
Een schizofreen is nooit alleen!
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 ]
sille
Electronics is a fine hobby ;-) http://www.electro-online.be
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 ]
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
sille
Electronics is a fine hobby ;-) http://www.electro-online.be
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. 
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
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.
sille
Electronics is a fine hobby ;-) http://www.electro-online.be
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...
k.p.meinesz
Een schizofreen is nooit alleen!
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.
