#include <p18cxxx.h>
#include <delays.h>
#include <pwm.h>
#pragma config OSC = HSPLL
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config WDT = OFF
#pragma config MCLRE = ON
#pragma config PBADEN = OFF
#pragma config CCP2MX = PORTC
#pragma config LVP = OFF
#pragma config XINST = OFF
#define MLF LATCbits.LATC0 = 1; LATCbits.LATC3 = 0
#define MLR LATCbits.LATC0 = 0; LATCbits.LATC3 = 1
#define MLS LATCbits.LATC0 = 0; LATCbits.LATC3 = 0
#define MRF LATEbits.LATE0 = 1; LATEbits.LATE1 = 0
#define MRR LATEbits.LATE0 = 0; LATEbits.LATE1 = 1
#define MRS LATEbits.LATE0 = 0; LATEbits.LATE1 = 0
#define SPEED_MAX 1023
#define SPEED_FAST 800
#define SPEED_NORM 650
#define SPEED_SLOW 620
#define SPEED_TURN 620
#define GO_F() MRF; MLF
#define GO_R() MRR; MLF
#define GO_L() MRF; MLR
#define GO_S() MRS; MLS
volatile unsigned char dElAy;
void delay_10ms(unsigned char x){
for (dElAy = 0; dElAy < x; dElAy++) Delay1KTCYx(100);
}
void delay_s(unsigned char x){
for (dElAy = 0; dElAy < x; dElAy++) delay_10ms(100);
}
void pwmInit(){
//start pwm
// 1/Fpwm = (period + 1) * 4 * 1/Fosc * TMR2 prescaler
// 100KHz :
// 1/100000 = (period +1) *4/40000000
// period = 40000000 / 400000 -1 = 99
// 40KHz, period = 249
// OpenPWM1(249);
// OpenPWM2(249);
T2CON = 0;
OpenPWM1(0xde);
OpenPWM2(0xde);
//DC 0-1023 (10bit number)
SetDCPWM1(SPEED_NORM);
SetDCPWM2(SPEED_NORM);
}
void portInit(){
ADCON0 = 0;
ADCON1 = 0x0F;
TRISA = 0;
TRISB = 0;
TRISC = 0x80;
TRISD = 0;
TRISE = 0;
LATA = 0;
LATB = 0;
LATC = 0;
LATD = 0;
LATE = 0;
}
void main(){
signed char dx;
portInit();
pwmInit();
dx = -50;
while(1){
GO_S();Delay1KTCYx(10);
SetDCPWM1(SPEED_FAST +dx);
SetDCPWM2(SPEED_FAST);
GO_F();
delay_s(5);
GO_S();Delay1KTCYx(10);
SetDCPWM1(SPEED_TURN +dx);
SetDCPWM2(SPEED_TURN);
GO_R();
delay_s(1);
GO_S();Delay1KTCYx(10);
SetDCPWM1(SPEED_FAST +dx);
SetDCPWM2(SPEED_FAST);
GO_F();
delay_s(5);
GO_S();Delay1KTCYx(10);
SetDCPWM1(SPEED_TURN +dx);
SetDCPWM2(SPEED_TURN);
GO_L();
delay_s(1);
}
}