PIC och PWM

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

*Ingen* kommer att läsa någon kod alls om du inte *själv* testar den först.
Slappt...
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Kan inte annat än hålla med! Att förutsätta att folk skall lägga tid på att kontrollera din kod innan du själv ens testat den är dödfött. Man hjälper jättegärna till om du först testar och konstaterar var det finns problem, och sedan ställer en specifik fråga om det.
wolie
Inlägg: 118
Blev medlem: 1 juli 2007, 11:07:08
Ort: Gbg

Inlägg av wolie »

Alltså, självklart har jag debugat den i simulator, men jag har inte testat den i kretsen. Bara tänkt om någon såg ett uppenbart fel, så som fel TMR eller liknande kunde säga till. :(
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kanske inte direkt ett fel, men...

> #pragma config = 0b.11.1100.0100

Går det inte att koda det så att det också går att se *hur* det är
konfigurerat, utan att behöva slå upp varje individuell bit... ?

Sen är det i alla fall enklast om du testar koden först... :-)
wolie
Inlägg: 118
Blev medlem: 1 juli 2007, 11:07:08
Ort: Gbg

Inlägg av wolie »

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
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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.
Skriv svar