*Ingen* kommer att läsa någon kod alls om du inte *själv* testar den först.
Slappt...
PIC och PWM
Har nu testat koden och problemet ligger i den sista delen då servon får pulser, men för långsamt/snabbt. Är osäker på om man kan göra så här med TMR1L och TMR1IE.
Kod: Markera allt
while(1){
PULSE = POT; //Pick up ADC POT value
PULSE -= 322; //Deduct POT's lowest ADC value (bottom end)
PULSE *= 63; //Multiply by difference between timer values for 2 and 1ms (126-63=63)
PULSE /= 307; //Divide by difference between Pot upper and lower values (629-322=307)
PULSE += 63;
TMR1L = PULSE.low8; //Set start value to PULSE
TMR1IE = 1; //Enable interupt
TMR1IF = 0; //Reset interrupt flag
SERVO = 1; //Go high
TMR1ON = 1; //Start Timer1 (timer increments to PULSE.low8 value)
while(TMR1IF==0); //TMR1IF flag is set to 1 when Timer1 reaches PULSE.low8 value
TMR1ON = 0; //Stop Timer1
SERVO = 0; //Go low
delay_ms(20); //for 20ms
}
Det finns ingen anledning att sätta TMR1IE = 1 om du i alla fall tänker *polla* TMR1IF !
Du måste bestämma dig, antingen använder du interrupt på ett korrekt sätt (d.v.s med en ISR)
eller inte alls (och håller *alla* xxIE flaggor = 0 hela tiden). Du kan inte gå
halva vägen, så att säga.
Sen undrar jag vilken tid det tar att göra dina beräkningar
(speciellt multiplikationen och divisionen). Du skulle nog försöka hitta en
annan metod som inte har dessa med. Table-lookup eller liknande.
Jag skulle separera funktionerna bättre i koden.
D.v.s ha genereringen av servo pulser för sig, sannolikt via ett timer interrupt,
och beräkningen av servo position för sig. Inte blanda ihop det.
Du måste bestämma dig, antingen använder du interrupt på ett korrekt sätt (d.v.s med en ISR)
eller inte alls (och håller *alla* xxIE flaggor = 0 hela tiden). Du kan inte gå
halva vägen, så att säga.
Sen undrar jag vilken tid det tar att göra dina beräkningar
(speciellt multiplikationen och divisionen). Du skulle nog försöka hitta en
annan metod som inte har dessa med. Table-lookup eller liknande.
Jag skulle separera funktionerna bättre i koden.
D.v.s ha genereringen av servo pulser för sig, sannolikt via ett timer interrupt,
och beräkningen av servo position för sig. Inte blanda ihop det.