LaStei
carpe cerevisi
Of een beetje rekenwerk, je laat het lage byte rondlopen als een vrijlopende teller, en je past alleen het hoge byte aan. Met wat rekenwerk kun je zeker de juiste grond klokfrequentie instellen.
Jeroen13
//Project Quadrocopter 2.0 in progress //dsESC4x //PIC32Flight
Op 13 april 2006 18:42:14 schreef JoWi:
De timer telt omhoog van 0 naar 65.535 en genereert een interrupt. Dan telt ie vanaf 0 weer omhoog.
Als je nu een kortere tijd wil dan laad je timer 1 met bijv. 20.000. Vervolgens telt hij naar 66.535 (maar dat duurt nu slechts 45.535 klokpulsen), genereert een interrupt en gaat vanaf 0 verder. De tijd tot de volgende interrupt is dan 65.535 klokpulsen. In de interrupt moet je dus opnieuw 20.000 in de timer laden. Dus bij elke interrupt.Nu zijn er twee problemen:
1) Het duurt even voor je in de interrupt de timer opnieuw laadt. De teller staat dus niet op 0 maar bijv. al op 7. Er zijn dus al 7 kloks voorbij gegaan (Dit is niet constant, het kan meer zijn afhankelijk van je code (meerdere interruptbronnen) en de interrupt latency.
Dat moet je corrigeren. Dat doe je door niet bijv. 20.000 in de timer te laden maar door dit op te tellen bij de huidige timer waarde.
2) Omdat de timer 16 bit is en je slechts 8 bit tegelijk kan laden kan het voorkomen dat het lage byte net rondloopt (van 255->0) tussen het laden van het lage en hoge byte in. (De timer telt onafhankelijk van je programma) Je hebt dan een fout van 256 kloks omdat het hoge byte van de timer met 1 is opgehoogt. Je moet dus controleren of zo'n roll-over is opgetreden tijdens het laden van de timer. Ergens in de datasheets kan je wel vinden hoe je daarop moet testen en dan corrigeren.Met klokpuls bedoel ik trouwens de timer-klok, en dat hoeft niet gelijk te zijn aan de processorklok (zoals door gebruik van de prescaler of een externe bron)
Wow dat is pas duidelijk uitleg
nu snap ik het een heel stuk beter.
Dan nog 2 vragen
Als de interrupt routine loopt dus ik heb een teller erin gemaakt om een pin voor 2 ms hoog te maken loopt dan de interrupt teller door dus dat hij tijdens de routine naar 65K telt ?
En weet je zo welke forumule ik moet gebruiken, in de datasheet staat Fosc/4 en dan komt de prescaler.
Dus:
20000000/4=5000000
5000000/8=625000 Timerfrequentie dus dat zijn 625.000 klokplusen per seconde ?
65535/625000=0,104 seconde (104ms) maximaal ? Dus kan ik het beste voor TMR1H CD invullen en TMR1L zo laten.
Hmm heb de volgende waardes volgens scoop
2ms=350 voor de teller
1,5=262 voor de teller
1ms=175 voor de teller
Alleen zodra ik bij (Teller3<= X) op plaats X een variable neer zet ipv een getal klopt het niet meer kwa tijd hoe kan dat ?
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Op 13 april 2006 19:50:46 schreef DJJeroen:
[...]Wow dat is pas duidelijk uitleg
nu snap ik het een heel stuk beter.
Dan nog 2 vragen
Als de interrupt routine loopt dus ik heb een teller erin gemaakt om een pin voor 2 ms hoog te maken loopt dan de interrupt teller door dus dat hij tijdens de routine naar 65K telt ?
In het begin van de interrupt is het eerste werk de interrupt vlag clearen, en de timer weer instellen. Eenmaal die timer weer gezet, is de tijd weer aan het lopen (ook al heb je die 2ms, de timer loopt gewoon door).
En weet je zo welke forumule ik moet gebruiken, in de datasheet staat Fosc/4 en dan komt de prescaler.
Dus:
20000000/4=5000000
5000000/8=625000 Timerfrequentie dus dat zijn 625.000 klokplusen per seconde ?
65535/625000=0,104 seconde (104ms) maximaal ? Dus kan ik het beste voor TMR1H CD invullen en TMR1L zo laten.
Hmm heb de volgende waardes volgens scoop
2ms=350 voor de teller
1,5=262 voor de teller
1ms=175 voor de tellerAlleen zodra ik bij (Teller3<= X) op plaats X een variable neer zet ipv een getal klopt het niet meer kwa tijd hoe kan dat ?
In ASM kan je maar om met 1 variabele, dan moet je via het werkregister om:
movfw Variabele ; variabele in werkregister steken
movwf teller3 ; waarde werkregister in timer3 steken
Hoe jou compiler dit doet weet ik niet, maar de help kan je daarbij ongetijfeld vooruithelpen. Ben je er trouwens zeker van dat je eerst in die variabele de juiste waarde steekt?
Je berekening ziet er goed uit, om de teller helemaal te laten tellen van 0000 naar FFFF duurt het idd 0.104s.
Jeroen13
//Project Quadrocopter 2.0 in progress //dsESC4x //PIC32Flight
Ow oke, ik programmeer niet in ASM maar in C weet zelf ook niet hoe hij dat doet, maarja kan gewoon kijken op de scoop hoeveel 1ms is of 2ms.
Alleen gaat de servo niet helemaal tot het einde als ik 2ms heb.
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Op 13 april 2006 23:05:55 schreef DJJeroen:
Ow oke, ik programmeer niet in ASM maar in C weet zelf ook niet hoe hij dat doet, maarja kan gewoon kijken op de scoop hoeveel 1ms is of 2ms.Alleen gaat de servo niet helemaal tot het einde als ik 2ms heb.
Dow eens op F1 in je compiler, of bekijk eens de voorbeelden.
En van je servo: datasheet lezen, herlezen en nog eens lezen. Volg alles zo goed mogelijk op, eenmaal alles werkt kan je nog dingen weglaten.
Jeroen13
//Project Quadrocopter 2.0 in progress //dsESC4x //PIC32Flight
Op 14 april 2006 09:27:03 schreef Videomodulator:
[...]
Dow eens op F1 in je compiler, of bekijk eens de voorbeelden.
En van je servo: datasheet lezen, herlezen en nog eens lezen. Volg alles zo goed mogelijk op, eenmaal alles werkt kan je nog dingen weglaten.
Heb een Hi-Tech C compiler die ik gebruik in MPLab dus zit geen help file bij, en heb ook geen datasheet van de servo (had ik nog liggen)
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Op 14 april 2006 11:45:00 schreef DJJeroen:
[...]Heb een Hi-Tech C compiler die ik gebruik in MPLab dus zit geen help file bij, en heb ook geen datasheet van de servo (had ik nog liggen)
Tenzij google bij jou niet werkt, zie ik het probleem niet. Nofi, maar als je zelf niet uitkijkt en/of zoekt zal je de oplossing nooit vinden (laat staan begrijpen en kunnen toepassen).
Jeroen13
//Project Quadrocopter 2.0 in progress //dsESC4x //PIC32Flight
Op 14 april 2006 14:24:47 schreef Videomodulator:
[...]
Tenzij google bij jou niet werkt, zie ik het probleem niet. Nofi, maar als je zelf niet uitkijkt en/of zoekt zal je de oplossing nooit vinden (laat staan begrijpen en kunnen toepassen).
Op google is niks te vinden van die servo hoe vreemd het ook klinkt, maar is niet z'n ramp.
En voor Hi-Tech heb ik nog niet gekeken
http://www.htsoft.com/forum/all/categories.php/Cat/0
Registreer je hier es..
Moet tussen de "general code" subforum wel te vinden zijn..
@Jeroen13
zou je je werkende code eens kunnen posten aub?
Ik zit namelijk met hetzelfde probleem en krijg het niet opgelost.
Ik zou je zeer dankbaar zijn.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
