Servo aansturing

Hoi allemaal, ik probeer momenteel een servo aan te sturen met de volgende code:

c code:

#include <htc.h>

__CONFIG(MCLRE_ON & CP_OFF & WDTE_OFF & OSC_IntRC);

#define _XTAL_FREQ 4000000

void main()
 { 
TRIS = 0b111100; 
int t = 0; 
int rTime = 4000; 
int j;

while (t < rTime) 
{ 
GPIObits.GP1 = 1;
__delay_ms(1);
for (j=0;j<t;j=j+4) 
{ 
__delay_us(1); 
}

GPIObits.GP1 = 0; 
__delay_ms(17);
t = t + 20;
}
}

De bedoeling is dat de servo in ongeveer 4 seconden ongeveer half verdraaid. Hij doet echter niets. Sluit ik in plaats van de servo een led aan, dan zie ik deze knipperen, wat dus niet de bespreking zou moeten zijn, de knippering zou immers zo snel moeten zijn dat het niet te zien is.

Ik zie alleen niet wat ik fout doe...

Om de while loop moet nog een tweede (oneindige) loop zitten.

Nu loopt het programma er gewoon uit, wat er dan gebeurd is ongedefinieerd?

Verder zou ik dat zo niet doen maar met timers en/of interrupts werken. Dan krijg je een stabieler signaal.

P.S. Maak even de code tag met [ en ], nu zie je de indents niet.

Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.

Henri, dit is even een uitgekleedde versie van mijn code. Ik had er inderdaad een while loop omheen staan, en daarin nog wat andere commando's. Maar dan nog, hij zou nu toch bij het aansluiten 1 maal de gewenste beweging moeten geven?

En hoe zou u dat aanpakken met timers en/of interrupts?

Ik ken dat eerlijk gezegd niet.

De servo MOET continue een periodiek signaal ontvangen anders doet ie het niet!

Oplossing 1:

Twee timers gebruiken:

De eerste op een periode tijd van 20mS instellen (repeterend)

In de interrupt handler (van de 20mS) de servo pin hoog maken, dan een tweede timer starten (one shot) die de gewenste tijd afloopt. Dus tussen 1 en 2 mS afhankelijk van de stand die je wilt.

Dan in de tweede interrupt de servo pin laag maken (en eventueel de timer uitzetten).

Alles is afhankelijk van welke microcontroller je gebruikt.

Oplossing 2:

Wat nog mooier is een PWM signaal gebruiken (16 bits bij voorkeur) en die correct programmeren. Kost helemaal geen cpu overhead.
--

In je hoofprogramma set je de juiste variablen voor de stand van de timers/pwm etc.
Wel die dingen volatile declareren anders gaat het (meestal) fout.

Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.

Misschien kun je hier iets uit oppikken.

Edit
Als je nu nog een emailadres in uw profiel zou zetten dan kan ik je nog iets opsturen.

LDmicro user.