Sida 2 av 2

Postat: 18 april 2008, 10:36:29
av sodjan
*Ingen* kommer att läsa någon kod alls om du inte *själv* testar den först.
Slappt...

Postat: 18 april 2008, 10:47:46
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.

Postat: 18 april 2008, 14:15:32
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. :(

Postat: 18 april 2008, 14:35:03
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... :-)

Postat: 19 april 2008, 13:14:59
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
}

Postat: 19 april 2008, 18:52:08
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.