#include <pic.h> // pic specific identifiers
#define _XTAL_FREQ 20000000
__CONFIG(0x3F71); // Config bits
#define MOTOR_PORT PORTC // constants
#define MOTOR_TRIS TRISC //
#define RL RC0
#define FL RC3
#define RR RC4
#define FR RC5
// Required prototypes.. each function needs to be declared
// if called BEFORE definition.
void delayMs(int dly),speed(char motor, int speed);
void reverse(char motor), forward(char motor);
void main(void) // program entry
{
int index = 0;
unsigned char ch;
ADCON1 = 0x6; // Analogue off
MOTOR_TRIS = 0b00000000; // Motor port as outputs
ch = CCP1CON; // Set up PWM 1
ch &= 0xF0; // Dont need capture
ch |= 0x0C; // set bit 3 & 4 (PWM mode)
CCP1CON = ch;
ch = CCP2CON; // Set up PWM 2
ch &= 0xF0; // Dont need capture
ch |= 0x0C; // set bit 3 & 4 (PWM mode)
CCP2CON = ch;
PR2 = 126; // Set to middle 50%
ch = T2CON; // Set up pre-scale
ch &= 0xF8; // Mask top five bits (I dont know why!)
ch |= 0x02; // set bit 1.. 16x
T2CON = ch; // Store pre-scale
ch = T2CON; // post - scaler
ch &= 0x07; // keep lower 3 ( clear five top bits here anyway )
ch |= 0x00; // clear post-scaler 0000 = 1:1
T2CON = ch; // T2CON should hold 6!
TMR2ON = 1; // start timer
while(1) // endless Loop
{
speed(1,64); // Left motor forward half speed
speed(0,64); // Right " " " "
delayMs(5000); // watch motors
speed(1,64); // Left motor forward half speed
speed(0,192); // Right motor reverse half speed
delayMs(5000);
speed(1,10); // Left motor forward slow speed
speed(0,228); // Right motor reverse full speed
delayMs(5000);
speed(1,228); // Left motor forward full speed
speed(0,10); // Right motor forward slow speed
delayMs(5000);
}
}
void speed(char motor, int speed)
{
if(speed > 128)
reverse(motor); // over 128 reverse motor
else
forward(motor);
speed &= 0x7F; // Make positive
if(motor)
CCPR2L = speed; // Left speed
else
CCPR1L = speed; // right speed
}
void forward(char motor)
{
if(motor)
{
RL = 1; // left
FL = 0;
}
else
{
RR = 1; // right
FR = 0;
}
}
void reverse(char motor)
{
if(motor)
{
RL = 0; // left
FL = 1;
}
else
{
RR = 0; // right
FR = 1;
}
}
void delayMs(int dly) // __delay_ms() messes up with 20mhz xtal
{ // when over a certain amount.
while(dly--)
__delay_ms(1);
}