#include "USBdsc.c"
#define MIN_PERIOD 80000.0
typedef union {
char bytes[8];
struct {
unsigned int x_value;
unsigned int y_value;
unsigned int rx_value;
unsigned int ry_value;
};
} T_USB_Report;
T_USB_Report MyReport;
int debug_toogle = 0;
unsigned long int ic1_start = 0;
unsigned long int value1 = 0;
int toogle1 = 0;
unsigned long int ic2_start = 0;
unsigned long int value2 = 0;
int toogle2 = 0;
unsigned long int ic3_start = 0;
unsigned long int value3 = 0;
int toogle3 = 0;
unsigned long int ic4_start = 0;
unsigned long int value4 = 0;
int toogle4 = 0;
int sync = 0;
char ReadBuffer[64], WriteBuffer[64];
unsigned long int CalculDelta (unsigned long int T2, unsigned long int T1) {
// Calcul T2-T1, même si le timer déborde et repart à 0
if (T2<T1) {
// théoriquement impossible sauf en cas de débordement
return 4294967295-(T1-T2)+1;
}
else return T2-T1;
}
void IC1_ISR() iv IVT_INPUT_CAPTURE_1 ilevel 6 ics ICS_SOFT {
unsigned long temp = 0;
LATG.f6 = 1;
sync = 1;
TMR1 = 0; //reset timeout comm.
temp = IC1BUF;
IC1BUF = 0;
if (toogle1 == 0) {
ic1_start = temp;
toogle1 = 1;
}
else {
// value1 = CalculDelta(temp, ic1_start);
// Calcul T2-T1, même si le timer déborde et repart à 0
if (temp<ic1_start) {
// théoriquement impossible sauf en cas de débordement
value1 = 4294967295-(ic1_start-temp)+1;
}
else value1 = temp-ic1_start;
toogle1 = 0;
}
debug_toogle++;
if (debug_toogle >= 50) {
debug_toogle = 0;
LATD.f1 = !PORTD.f1;
}
IC1IF_bit = 0;
}
void IC2_ISR() iv IVT_INPUT_CAPTURE_2 ilevel 5 ics ICS_SOFT {
unsigned long temp = 0;
temp = IC2BUF;
IC2BUF = 0;
if (toogle2 == 0) {
ic2_start = temp;
toogle2 = 1;
}
else {
// value2 = CalculDelta(temp, ic2_start);
// Calcul T2-T1, même si le timer déborde et repart à 0
if (temp<ic2_start) {
// théoriquement impossible sauf en cas de débordement
value2 = 4294967295-(ic2_start-temp)+1;
}
else value2 = temp-ic2_start;
toogle2 = 0;
}
IC2IF_bit = 0;
}
void IC3_ISR() iv IVT_INPUT_CAPTURE_3 ilevel 4 ics ICS_SOFT {
unsigned long temp = 0;
temp = IC3BUF;
IC3BUF = 0;
if (toogle3 == 0) {
ic3_start = temp;
toogle3 = 1;
}
else {
// value3 = CalculDelta(temp, ic3_start);
// Calcul T2-T1, même si le timer déborde et repart à 0
if (temp<ic3_start) {
// théoriquement impossible sauf en cas de débordement
value3 = 4294967295-(ic3_start-temp)+1;
}
else value3 = temp-ic3_start;
toogle3 = 0;
}
IC3IF_bit = 0;
}
void IC4_ISR() iv IVT_INPUT_CAPTURE_4 ilevel 3 ics ICS_SOFT {
unsigned long temp = 0;
temp = IC4BUF;
IC4BUF = 0;
if (toogle4 == 0) {
ic4_start = temp;
toogle4 = 1;
}
else {
// value4 = CalculDelta(temp, ic4_start);
// Calcul T2-T1, même si le timer déborde et repart à 0
if (temp<ic4_start) {
// théoriquement impossible sauf en cas de débordement
value4 = 4294967295-(ic4_start-temp)+1;
}
else value4 = temp-ic4_start;
toogle4 = 0;
}
IC4IF_bit = 0;
}
void USB_ISR() iv IVT_USB_1 ilevel 7 ics ICS_SRS {
USB_Interrupt_Proc();
USBIF_bit = 0;
}
void TMR1_ISR() iv IVT_TIMER_1 ilevel 1 ics ICS_SOFT {
LATG.f6 = 0;
/*
value1 = 120000;
value2 = value1;
value3 = value1;
value4 = value1;
*/
sync = 0;
TMR1 = 0;
T1IF_bit = 0;
}
void ClearBuffer (char * buffer, int buffer_len) {
int i = 0;
for (i=0; i<buffer_len; i++) *(buffer+i) = 0;
}
void main() {
toogle1 = 0;
toogle2 = 0;
toogle3 = 0;
toogle4 = 0;
ic1_start = 0;
ic2_start = 0;
ic3_start = 0;
ic4_start = 0;
value1 = 0;
value2 = 0;
value3 = 0;
value4 = 0;
debug_toogle = 0;
AD1PCFG = 0xFFFF;
JTAGEN_bit = 0;
CHECON = 0x32;
ODCB = 0;
TRISD = 0xffff;
TRISD.f1 = 0;
TRISG.f6 = 0;
LATG.f6 = 0;
LATD.f1 = 0;
IC1CONbits.ICM = 0b110;
IC1CONbits.FEDGE = 1;
IC1CONbits.C32 = 1;
IC1CONbits.ICI = 0;
IC1CONbits.ICSIDL = 0;
IC2CON = IC1CON;
IC3CON = IC1CON;
IC4CON = IC1CON;
T2CONSET.f1 = 0;
T2CONSETbits.T32 = 1;
T2CONSETbits.TGATE = 0;
T2CONSETbits.TCKPS0 = 0;
T2CONSETbits.TCKPS1 = 0;
T2CONSETbits.TCKPS2 = 0;
TMR2 = 0;
PR2 = 0xFFFFFFFF;
T2CONSETbits.ON = 1;
PR1 = 65535;
TMR1 = 0;
T1CONSETbits.TCKPS0 = 1;
T1CONSETbits.TCKPS1 = 1;
T1CONSETbits.TGATE = 0;
T1CONSETbits.SIDL = 0;
T1CONSETbits.TCS = 0;
T1CONSETbits.ON = 1;
IC1IP0_bit = 0;
IC1IP1_bit = 1;
IC1IP2_bit = 1;
IC2IP0_bit = 1;
IC2IP1_bit = 0;
IC2IP2_bit = 1;
IC3IP0_bit = 0;
IC3IP1_bit = 0;
IC3IP2_bit = 1;
IC4IP0_bit = 1;
IC4IP1_bit = 1;
IC4IP2_bit = 0;
USBIP0_bit = 1;
USBIP1_bit = 1;
USBIP2_bit = 1;
T1IP0_bit = 1;
T1IP1_bit = 0;
T1IP2_bit = 0;
USBIE_bit = 1;
IC1IE_bit = 1;
IC2IE_bit = 1;
IC3IE_bit = 1;
IC4IE_bit = 1;
T1IE_bit = 1;
EnableInterrupts();
HID_Enable(ReadBuffer, WriteBuffer);
IC1CONbits.ON = 1;
IC2CONbits.ON = 1;
IC3CONbits.ON = 1;
IC4CONbits.ON = 1;
T4CONSETbits.ON = 1;
while (1) {
MyReport.x_value = (value1-MIN_PERIOD)/1.22;
MyReport.y_value = (value2-MIN_PERIOD)/1.22;
MyReport.rx_value = (value3-MIN_PERIOD)/1.22;
MyReport.ry_value = (value4-MIN_PERIOD)/1.22;
HID_Write(MyReport.bytes, sizeof(MyReport));
delay_ms(10);
}
}