/
haptic.c
147 lines (123 loc) · 3.89 KB
/
haptic.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <p24FJ128GB206.h>
#include "config.h"
#include "common.h"
#include "usb.h"
#include "pin.h"
#include "uart.h"
#include "timer.h"
#include "oc.h"
#include "ui.h"
#include <stdio.h>
//DEFINE VENDOR REQUESTS
#define SET_VALS 1 // Vendor request that receives 2 unsigned integer values
#define GET_VALS 2 // Vendor request that returns 2 unsigned integer values
//DEFINE TIMERS
#define LED_TIMER &timer1 //timer for LEDs
#define PWM_TIMER &timer2 //timer for PWM controller
//DEFINE PIN NAMES
#define CUR &A[0] //OUT1 - Current pin
#define EMF &A[1] //OUT2 - Back EMF pin
#define FB &A[2]
#define ENC &D[0] //Encoder pin
#define SF &D[1] //Status Flag pin
#define D2 &D[2] //Disable IN2 pin
#define D1 &D[3] //Disable IN1 pin
#define ENA &D[4] //Enable motor pin
#define IN2 &D[5] //Input 2 pin
#define IN1 &D[6] //Input 1 pin
#define SLEW &D[7] //Slew rate pin
#define INV &D[8] //Inverting pin
//DEFINE VARIABLES AND INITIAL VALUES
void initChip(void);
void initInt(void);
void __attribute__((interrupt)) _CNInterrupt(void);
uint16_t VAL1 = 65536*2/5;
uint16_t VAL2 = 0;
//OTHER INITIAL CONDITIONS
void initChip(){
init_clock();
init_uart();
init_timer();
init_ui();
init_pin();
init_oc();
pin_analogIn(CUR);
pin_analogIn(EMF);
pin_analogIn(FB);
pin_digitalIn(SF);
pin_digitalIn(ENC);
pin_digitalOut(D1);
pin_digitalOut(D2);
pin_digitalOut(IN1);
pin_digitalOut(IN2);
pin_digitalOut(ENA);
pin_digitalOut(SLEW);
pin_digitalOut(INV);
oc_pwm(&oc1, D2, PWM_TIMER, 250, 0);
}
//INITIALIZE MOTOR
void initMotor(void) {
pin_write(ENA, 1); //set enable pin to ON
pin_write(SLEW, 1); //set slew rate to HIGH
pin_write(INV, 0); //set invert OFF
pin_write(D1, 0); //disable IN1 is OFF
pin_write(D2, 1); //disable IN2 is ON
}
void VendorRequests(void) {
WORD temp;
switch (USB_setup.bRequest) {
case SET_VALS:
VAL1 = USB_setup.wValue.w;
VAL2 = USB_setup.wIndex.w;
BD[EP0IN].bytecount = 0; // set EP0 IN byte count to 0
BD[EP0IN].status = 0xC8; // send packet as DATA1, set UOWN bit
break;
case GET_VALS:
temp.w = VAL1;
BD[EP0IN].address[0] = temp.b[0];
BD[EP0IN].address[1] = temp.b[1];
temp.w = VAL2;
BD[EP0IN].address[2] = temp.b[0];
BD[EP0IN].address[3] = temp.b[1];
BD[EP0IN].bytecount = 4; // set EP0 IN byte count to 4
BD[EP0IN].status = 0xC8; // send packet as DATA1, set UOWN bit
break;
default:
USB_error_flags |= 0x01;
}
}
void VendorRequestsIn(void) {
switch (USB_request.setup.bRequest) {
default:
USB_error_flags |= 0x01; // set Request Error Flag
}
}
void VendorRequestsOut(void) {
switch (USB_request.setup.bRequest) {
default:
USB_error_flags |= 0x01; // set Request Error Flag
}
}
int16_t main(void) {
InitUSB(); // initialize the USB registers and serial interface engine
initChip();
initMotor();
led_on(&led1);
timer_setPeriod(LED_TIMER, 0.5); //start internal clock with defined period
timer_start(LED_TIMER);
pin_write(IN1, 1);
pin_write(IN2, 0);
pin_write(D2, 65536*2/5);
while (USB_USWSTAT!=CONFIG_STATE) { // while the peripheral is not configured...
ServiceUSB(); // ...service USB requests
}
while (1) {
ServiceUSB(); // service any pending USB requests
//LED1 TOGGLE TO CONFIRM RUNNING CODE
if (timer_flag(LED_TIMER)) {
timer_lower(LED_TIMER);
led_toggle(&led1);
pin_write(D2, VAL1);
}
}
}