Styra RC servo PIC XC8

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Styra RC servo PIC XC8

Inlägg av Pajn »

Jag sitter och försöker driva ett RC servo men kan inte förstå vad det är som händer.

Koden ser ut såhär:

Kod: Markera allt

#define WHEEL_LEFT LATA0
#define WHEEL_RIGHT LATA1

int cnt = 0;
char pulse = 15;

void interrupt highInterrupt() {
    if(TMR0IF) {
        if (cnt < pulse) {
            WHEEL_LEFT = 1;
        } else {
            WHEEL_LEFT = 0;
        }
        if (cnt > 200) {
            cnt = 0;
        }
        cnt++;

        TMR0 = 56;             // Initial Value for 0.1ms Interrupt
        TMR0IF = 0;         // Clear TIMER0 interrupt flag
    }
}

/*
 * 
 */
void main() {
    // Use 8MHz int osc
    OSCCON = 0b01111111;
    // Enable priority interrupts
    IPEN = 1;
    // Enable TMR0 and INT0 interrupts
    INTCON = 0b10110000;
    // TMR0 high priority
    INTCON2 = 0b10000100;
    // Disable other interrupts
    INTCON3 = 0b00000000;
    // Enable TMR0 8Bit 1:1
    T0CON = 0b11001000;
    // Start TMR0 at 25
    TMR0 = 56;
    // Enable TMR2
    T2CON = 0b00000100;
    // Disable USB
    UCON = 0;
    UTRDIS = 1;

    //Init pins
    LATA = 0;
    ADCON1 = 0x0F;
    CMCON = 0x07;
    TRISA = 0;
    LATB = 0;
    TRISB = 0b00100000;

    LATA2 = 1;
    for (;;) {
        if (RB5) {
            pulse = 10;
        } else {
            pulse = 20;
        }
    }
}
Iden är att TMR0 ska ge ett interrupt varje 0.1mS. 1.5mS puls ska ge stillastående, 1mS puls ska ge rörelse i en riktning och 2mS i den andra.
Det som händer:
Om jag har RB5 hög när jag ger ström till kretsen kommer pulser som gör att servot snurrar CW. Drar jag den låg börjar servot snurra CCW. Så långt är allt rätt.
Men om jag drar RB5 hög igen kommer inga pulser och spänningen över RA2 (som jag drar hög i början) blir ~2.5V vilket jag antar betyder att kretsen startar om hela tiden. Drar jag RB5 låg igen kommer pulser och servot snurrar CCW.

Jag har testat utan servot med endast en lysdiod men får samma resultat (för att utesluta att servot drar för mycket ström).

Det sitter en konding på 100nF nära kretsen. Vid matningen sitter en 100nF, en 1µF och en 3300µF. Matningen består av en 7805. På andra sidan 7805 sitter en 10µF och ett 9V batteri. Jag har mätt att spänningen håller sig på 5V så det bör inte vara problemet.

Mclr har ett pullupmotstånd på 12k
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra RC servo PIC XC8

Inlägg av Icecap »

Du skapar alltså pulsen. Men du verkar ha glömt paus mellan pulserna...
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Styra RC servo PIC XC8

Inlägg av Pajn »

När cnt når över hur lång pulsen ska va blir ju pinnen låg igen, och cnt resettas ju inte förens den når 200 (= 20ms)
Användarvisningsbild
adent
Inlägg: 4247
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Styra RC servo PIC XC8

Inlägg av adent »

Nu har jag inte koll på pic:ar, men jag förmodar att du ändrar pulse-variabeln ifrån main()?
Isåfall ska den vara volatile-deklarerad så inte kompilatorn förutsätter fel saker.

MVH: Mikael
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra RC servo PIC XC8

Inlägg av Icecap »

Nu där jag är mindre påverkad av svetsögon ser jag att det borde fungera. Jag ser dock en del småproblem:
- cnt är deklarerat som int, den ska vara volatile unsigned char.
- Timer0 laddas om sist i rutinen, detta ger en osäker tid som beror på om cnt ska nollas eller inte osv.
- pulse ska vara deklarerat som unsigned char.

Av beskrivningen verkar avkoppling osv. att vara korrekt men det är ju möjligt att lägga in en utgång som går hög under initieringen och går låg omedelbart innan main-loop. Då kan man se om PIC'en startar om hela tiden.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Styra RC servo PIC XC8

Inlägg av Pajn »

Ny dag med fräsha ögon.

Jag testade era tipps, men det hjälpte inte (Men det kommer hjälpa mig i framtiden så stort tack!).
Så jag började felsöka och upptäckte att picen startar om när pinnen dras hög, men inte låg.

Lite mysko tyckte jag så jag undersökte kopplingen igen för sjätte gången (fast med fräshare ögon som sagt)
och självklart var det ju fel, den ensamma VSSen satt en pinne fel...

Måste komma på nått sätt att märka upp pinnarna på, inte första gången jag har räknat fel
på de där små jäklarna. Nån som sitter på en smidig lösning? Borde inte bara vara jag som inte
klarar av att hålla räkningen?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Styra RC servo PIC XC8

Inlägg av sodjan »

> Nån som sitter på en smidig lösning?

Mindre slarv?
Jag kommer inte på något annat...
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Styra RC servo PIC XC8

Inlägg av Pajn »

Självklart, borde ha väntat tills en annan dag när jag inte var lika trött.

Men jag tänkte om någon märkte upp sina kretsar på nått sätt eller gjorde nånting,
kreativa lösningar är det inte dåligt med på det här forumet. Att fråga skadar väl inte?
Användarvisningsbild
adent
Inlägg: 4247
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Styra RC servo PIC XC8

Inlägg av adent »

cnt behöver inte vara volatile. Faktum är att den bara används inne i interruptet. Jag hade gjort den till en

static unsigned char cnt = 0;

och lagt den inne i Interruptet, den behövs och används bara där. Bra att gömma undan sådant.
pulse däremot behöver som sagt vara volatile eftersom den används både i interruptet och main.
Fungerar antagligen bra ändå tills man slår på minsta lilla optimering.
Dessutom bör den vara unsigned char också: volatile unsigned char pulse;

MVH: Mikael
Skriv svar