Det skulle kunna vara så att interrupten kommer medan den väntar de där 1.5milli sekunderna.
testa att stänga av interrupten innan du ger servona sina pulser, o så sätter du på den igen när den är klar.. Du skulle kanske även kunna öka baudraten lite, så att du vet att den väntar på tecken i vöer 20ms?
jag har även ett annat allternativ till kod, om du vill se. jag är inte van vid basic kod, men har skrivit lite psevdokod, som du får översätta om du vill använda den
DEFINE OSC 4
define HSER_RCSTA 90h
define HSER_BAUD 2400
define HSER_SPBRG 25
on interrupt goto ReadValue
INTCON = %11000000
s0_out var PORTB.1
s1_out var PORTB.2
servo0 var word
servo1 var word
servo0 = 1500
servo1 = 1500
LOW s0_out
low s1_out
timer_prescaler = xxxx //ställ prescalern så att timern räknar upp en
gång var 0.1ms => 200 =20ms
PIE1.5 = 1 //det sissta man gör är att sätta igång interruptet, så man
//vet att initieringen blir klar
timer interrupt = 1
trap:
goto trap
DISABLE
ReadValue:
if(timer_interrupt_flag) // timer har slagit över från 0xff till 0x00
{
clear_timer_interrupt_flag
PIE1.5 = 0 //disable usart int
s0_out = 1
pauseus (servo0)
s0_out = 0
s1_out = 1
pauseus (servo1)
s1_out = 0
time = read_timer0() //kollar hur lång tid det hela har tagit
write timer(0xff - 200+ time)
}
if(usart_interrupt_flag)
{
clear_usart_interrupt_flag
hserin [servo0, servo1]
INTCON.0 = 0
INTCON.1 = 0
}
resume
enable
END