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
|
/*
* Input->output connection definitions
* for the joint-switches of a CNC machining center.
*/
static DEF_OUTPUT(C, 5, OUTPUT_INVERT); /* X joint limit */
static DEF_OUTPUT(C, 4, NONE); /* X joint REF */
static DEF_OUTPUT(C, 3, OUTPUT_INVERT); /* Y joint limit */
static DEF_OUTPUT(C, 2, NONE); /* Y joint REF */
static DEF_OUTPUT(C, 1, OUTPUT_INVERT); /* Z joint limit */
static DEF_OUTPUT(C, 0, NONE); /* Z joint REF */
static struct connection connections[] = {
{ /* X+ joint limit input --> Joint limits common output */
DEF_INPUT(D, 0, INPUT_INVERT),
.out = &output_pin_C5,
},
{ /* X- joint limit input --> Joint limits common output */
DEF_INPUT(D, 1, INPUT_INVERT),
.out = &output_pin_C5,
},
{ /* X joint REF input --> X joint REF output */
DEF_INPUT(D, 2, INPUT_INVERT),
.out = &output_pin_C4,
},
{ /* Y+ joint limit input --> Joint limits common output */
DEF_INPUT(D, 3, INPUT_INVERT),
.out = &output_pin_C3,
},
{ /* Y- joint limit input --> Joint limits common output */
DEF_INPUT(D, 4, INPUT_INVERT),
.out = &output_pin_C3,
},
{ /* Y joint REF input --> Y joint REF output */
DEF_INPUT(D, 5, INPUT_INVERT),
.out = &output_pin_C2,
},
{ /* Z+ joint limit input --> Joint limits common output */
DEF_INPUT(D, 6, INPUT_INVERT),
.out = &output_pin_C1,
},
{ /* Z- joint limit input --> Joint limits common output */
DEF_INPUT(D, 7, INPUT_INVERT),
.out = &output_pin_C1,
},
{ /* Z joint REF input --> Z joint REF output */
DEF_INPUT(B, 0, INPUT_INVERT),
.out = &output_pin_C0,
},
};
static void emergency_shutdown(void)
{
/* Assert all limit pins.
* Limit pins are active-low, so clear the bit. */
PORTC &= ~(1 << 5);
PORTC &= ~(1 << 3);
PORTC &= ~(1 << 1);
}
/* Pin for debugging. */
#define TEST_PORT PORTB
#define TEST_DDR DDRB
#define TEST_BIT 1
/* Debounce timing. */
#define DEBOUNCE_DWELL_TIME MSEC_TO_USEC(100)
/* We tolerate a joint move of max 5 microns for the ACTIVE_TIME.
* That's good enough for limits and refs. */
#define DEBOUNCE_ACTIVE_TIME 200 /* microseconds */
|