I have finally got my code working but my servo jitters really badly. I'm using a 20ms interrupt to start my pulse and then a second interrupt running at 100us and counting it 11 times before turning my pulse off. Is this the wrong way to go about it? I'm using a 20MHz crystal.
#include <p18f4620.h>
#include <timers.h>
#include <stdio.h>
#include <delays.h>
void power (void);
void signal (void);
void HandlerHigh (void);
void HandlerLow (void);
unsigned char clock = 0;
unsigned char clock2 = 0;
unsigned char delay = 0;
int servo_on = 0;
void main (void)
{
int Time = 0;
INTCON = 0x20; //disable global and enable TMR0 interrupt
INTCON2 = 0x84; //TMR0 high priority
IPR1 = 0x00; //TMR1 low priority
RCONbits.IPEN = 1; //enable priority levels
INTCONbits.GIEH = 1; //enable interrupts
INTCONbits.GIEL = 1; //enable low interrupts
TMR1H |= 0xfe;
TMR1L |= 0x10;
WriteTimer0(61);
power(); // Led output to show pic has power
OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_256);
OpenTimer1(TIMER_INT_ON & T1_8BIT_RW & T1_SOURCE_INT & T1_PS_1_1);
WriteTimer0(61);
while (1)
{
signal(); //send out servo signal
}
}
void signal (void)
{
if (servo_on == 1)
{
servo_on = 0;
PORTAbits.RA1 = 1;
delay = 1;
clock2 =0;
}
if ((delay == 1) && (clock2 == 11))
{
clock2 = 0;
delay = 0;
PORTAbits.RA1 = 0;
}
}
/*Set a Led to show PIC is running*/
void power (void)
{
ADCON1 = 0x0f;
TRISA = 0x00000110;
PORTA = 0;
PORTAbits.RA0 = 1;
}
//----------------------------------------------------------------------------
// High priority interrupt vector
#pragma code VectorHigh = 0x08
void VectorHigh (void)
{
_asm
goto HandlerHigh //jump to interrupt routine
_endasm
}
//----------------------------------------------------------------------------
// High priority interrupt routine
#pragma code
#pragma interrupt HandlerLow
void HandlerHigh (void)
{
if (INTCONbits.TMR0IF) //check for TMR0 overflow
{
INTCONbits.TMR0IF = 0; //clear interrupt flag
WriteTimer0(61);
clock++;
Nop();
}
if (clock > 1)
{
clock = 0;
servo_on = 1;
}
}
//----------------------------------------------------------------------------
// Low priority interrupt vector
#pragma code VectorLow = 0x18
void VectorLow (void)
{
_asm
goto HandlerLow
_endasm
}
//----------------------------------------------------------------------------
// High priority interrupt routine
#pragma code
#pragma interrupt HandlerHigh
void HandlerLow (void)
{
if (PIR1bits.TMR1IF) //check for TMR1 overflow
{
PIR1bits.TMR1IF = 0; //clear interrupt flag
TMR1H |= 0xfe;
TMR1L |= 0x10;
clock2++;
}
}
#include <p18f4620.h>
#include <timers.h>
#include <stdio.h>
#include <delays.h>
void power (void);
void signal (void);
void HandlerHigh (void);
void HandlerLow (void);
unsigned char clock = 0;
unsigned char clock2 = 0;
unsigned char delay = 0;
int servo_on = 0;
void main (void)
{
int Time = 0;
INTCON = 0x20; //disable global and enable TMR0 interrupt
INTCON2 = 0x84; //TMR0 high priority
IPR1 = 0x00; //TMR1 low priority
RCONbits.IPEN = 1; //enable priority levels
INTCONbits.GIEH = 1; //enable interrupts
INTCONbits.GIEL = 1; //enable low interrupts
TMR1H |= 0xfe;
TMR1L |= 0x10;
WriteTimer0(61);
power(); // Led output to show pic has power
OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_256);
OpenTimer1(TIMER_INT_ON & T1_8BIT_RW & T1_SOURCE_INT & T1_PS_1_1);
WriteTimer0(61);
while (1)
{
signal(); //send out servo signal
}
}
void signal (void)
{
if (servo_on == 1)
{
servo_on = 0;
PORTAbits.RA1 = 1;
delay = 1;
clock2 =0;
}
if ((delay == 1) && (clock2 == 11))
{
clock2 = 0;
delay = 0;
PORTAbits.RA1 = 0;
}
}
/*Set a Led to show PIC is running*/
void power (void)
{
ADCON1 = 0x0f;
TRISA = 0x00000110;
PORTA = 0;
PORTAbits.RA0 = 1;
}
//----------------------------------------------------------------------------
// High priority interrupt vector
#pragma code VectorHigh = 0x08
void VectorHigh (void)
{
_asm
goto HandlerHigh //jump to interrupt routine
_endasm
}
//----------------------------------------------------------------------------
// High priority interrupt routine
#pragma code
#pragma interrupt HandlerLow
void HandlerHigh (void)
{
if (INTCONbits.TMR0IF) //check for TMR0 overflow
{
INTCONbits.TMR0IF = 0; //clear interrupt flag
WriteTimer0(61);
clock++;
Nop();
}
if (clock > 1)
{
clock = 0;
servo_on = 1;
}
}
//----------------------------------------------------------------------------
// Low priority interrupt vector
#pragma code VectorLow = 0x18
void VectorLow (void)
{
_asm
goto HandlerLow
_endasm
}
//----------------------------------------------------------------------------
// High priority interrupt routine
#pragma code
#pragma interrupt HandlerHigh
void HandlerLow (void)
{
if (PIR1bits.TMR1IF) //check for TMR1 overflow
{
PIR1bits.TMR1IF = 0; //clear interrupt flag
TMR1H |= 0xfe;
TMR1L |= 0x10;
clock2++;
}
}