Sida 1 av 2

PIC och RC servo vill inte..

Postat: 6 januari 2008, 11:33:31
av squiz3r
Hej, jag håller på att försöka göra ett program till en PIC16F877A som ska styra ett moddat "Blue Bird BMS-630mg" servo. Mitt problem är att jag har kollat i oscilliscopet, och där ser det bra ut, jag har kopplat in ett gammalt Parallax servo, och där fungerar det, men när jag kopplar in de nya servona går det inte..

Jag testade skriva koden såhär:

Kod: Markera allt

fram ;subrutin för att köra
bsf h_servo
bsf v_servo
call del_clock ;paus för att få servona att gå medsols.
bcf h_servo
bcf v_servo
också lät jag den subrutinen göras var 20'e ms. På oscilliscopet ser signalerna exakt lika dana ut, men när jag kopplar in den nya sortens servo så funkar den bara på det servot som jag satte igång först.. (i detta fallet h_servo).

Sen testade jag:

Kod: Markera allt

fram ;subrutin för att köra
bsf h_servo
call del_clock ;paus för att få servona att gå medsols.
bcf h_servo
bsf v_servo
call del_clock ;paus för att få servona att gå medsols.
bcf v_servo
Men då blev det samma sak som innan att bara "h_servo" fungerade med de nya servona.

Men det funkade om jag skrev:

Kod: Markera allt

fram ;subrutin för att köra
bsf h_servo
call del_clock ;paus för att få servona att gå medsols.
bcf h_servo
call del_20ms ;pausa i 20 millisekunder.
bsf v_servo
call del_clock ;paus för att få servona att gå medsols.
bcf v_servo
Alltså satte en till paus i mellan dem.

Det som gör att servona inte fungerar är att när de inte är inkopplade (eller när de gammla är inkopplade) så är där en fin signal, men så fort som jag kopplar in det nya så blir signalen konstant hög... Någon som kan förså varför?

Mvh

Edit: Jag har kommit framm till att jag inte behöver ha en 20ms pause imellan dem, utan det räcker med en NOP, så det kan jag ju acceptera, men jag vill ju ändå veta vad det beror på.. Tack på förhand!

Postat: 6 januari 2008, 12:16:14
av sodjan
> jag har kopplat in ett gammalt Parallax servo, och där fungerar det, men när jag kopplar in de nya servona går det inte..

Är det *BARA* den skillnaden ??
I så fall är väl koden ganska oinstressant,
Vad är det sm skilljer servona åt ?

> men så fort som jag kopplar in det nya så blir signalen konstant hög...

Låter som felkoppling,,,

Postat: 6 januari 2008, 12:27:50
av Stinrew
En fråga:

Det sär servot ser stort och kraftfullt ut. Hur ser matningsspänningen ut om du kollar med oscilloskåpet(jag tycker att det borde krävas en hel del ström för att driva det)??

Postat: 6 januari 2008, 15:17:16
av JustNeed
Jag höll på aslänge med att få digitalservon att funka för ett tag sedan. Det visade sig att problemet var att de behövde lite mer spänning/ström(körde från batterier).

Postat: 6 januari 2008, 15:39:05
av squiz3r
"Låter som felkoppling,,, "
Verkar inte så, jag kopplar in dem likadant, och om jag läggen in en pause på en "NOP" emellan dem så hjälper ju det :S

Jag körde från labbagget, det drar ungefär 1Amp och jag har satt kondingar lite här och var, strömmen ser ganska bra ut tycker jag..

mvh

Postat: 6 januari 2008, 16:21:31
av Stinrew
Är du säker på att din PIC går stabilt, så det inte är den som startar om vid varje försök att köra servot? Har dom samma strömförsörjning, eller kör du PICen separat?

Postat: 6 januari 2008, 17:01:11
av sodjan
> och om jag läggen in en pause på en "NOP" emellan dem

Jag har inte en aning om hur signaleringen till "digitala" servon ser ur,
om det nu var det som det handlar om. Menar du att du har en paus
motsvarande *enbart* en NOP istället för de vanliga ca 20 ms ?

Postat: 6 januari 2008, 17:14:25
av Icecap
Vad jag rakt av ser är det ett av de vanliga read-modify-write-problemer och den borde speciellt sodjan känna till, du har ju skrivit om en del.

Anledningen är att när man kör bit-operationer läsas porten precis i början av instruktionens utförande och skrivs sist, detta gör att har man den minste kapacitiva belastning hinner portpinnen inte att gå '0' (/'1') innan man läser igen, alltså kommer den pinne att sättas omedelbart till det "gamla" värdet.

EDIT:
bcf h_servo:
1: Instruktionen dekodas
2: porten läsas
3: Bit'en modifieras
4: Porten skrivs
bsf v_servo
1: Instruktionen dekodas
2: porten läsas MEN h_servo HAR INTE HUNNIT BYTA LÄGE pga. kapacitiv belastning.
3: Bit'en modifieras
4: Porten skrivs MEN DEN SKRIVS MED FEL VÄRDE FÖR h_servo!

Med en NOP mellan hinner den kapacitiva belastningen att laddas ur och den läsas som '0'.

Postat: 6 januari 2008, 17:21:55
av sodjan
Icecap har sannolikt rätt, nu när man togs sig tid att läsa *all* kod... :roll:

Postat: 6 januari 2008, 19:19:49
av squiz3r
Ok, Tack! Ska kolla om det beror på det. Jag misstänkte lite att det kunde vara något sånt, men jag viste inte riktigt hur det fungerade. :)

Återkommer med ressultat!

Mvh

Re: PIC och RC servo vill inte..

Postat: 9 april 2009, 19:44:50
av squiz3r
Hej. Dags att väcka en gammal tråd!

Som Icecap trodde så var det just det som var felet, och nu har jag samma problem igen!

Saken nu är bara att det är en PIC18F4620, och på 18 serien har man ju ett till register just för att ta bort detta problemet om jag fattat det rätt? (LAT-registeren)

Så varför får jag samma problem nu i så fall??

För övrigt skriver jag i c nu. (MCC18 från microchip)

// Danne

Re: PIC och RC servo vill inte..

Postat: 9 april 2009, 19:48:50
av bearing
Du kanske använder portarna på fel sätt? eller bara en bugg?
Har du simulerat?
Har du kollat med oscilloskåp?
Hur ser koden ut?

Re: PIC och RC servo vill inte..

Postat: 9 april 2009, 20:22:51
av sodjan
Håller med bearing... :-)

Re: PIC och RC servo vill inte..

Postat: 9 april 2009, 20:23:15
av squiz3r
Hur menar du med att jag använder portarna på fel sätt?

Först döper jag porten till något:
#define ettServo LATbits.LATD5

Sen sätter jag dem till utgånger:
TRISD = 0b00000000;

också sätter jag dem höga:
ettServo = 1;
ettAnnatServo = 1;
..osv


Sen sätter jag dem låga:
ettServo = 0;
ettAnnatServo = 0;
..osv


och då blir det felet... Men om jag sätter en NOP innan jag tilldelar nästa port ett värde så fungerar det...

Om jag har fattat det rätt så kan man lika gärna skriva till PORTX istället för LATX för det skrivs ändå bara till LATX oavsett vad man skriver?

Har inte simulerat, vet inte vad jag ska leta efter i så fall...
Jag har kollat med oscilloscope, och det blir exakt som jag beskrev i mitt första inlägg, nämligen att värdet ändras tillbaks..

Edit: Sodjan: Håller med om vad??

Re: PIC och RC servo vill inte..

Postat: 9 april 2009, 20:26:42
av sodjan
> Om jag har fattat det rätt så kan man lika gärna skriva till PORTX istället för
> LATX för det skrivs ändå bara till LATX oavsett vad man skriver?

Ja, om du alltid skriver *hela* registret. Om du även läser porten
(t.ex genom att använda BCF/BSF mot den) så kan LAT-registret
underlätta.

Hur har du gjort med analoga funktioner på porten/portarna ?

> Edit: Sodjan: Håller med om vad??

Det bearing sa, så klart. :-)
Att det saknas/saknades information för att kunna uttala sig.