root / trunk / code / projects / diagnostic_station / station / hardware_wall.c @ 1281
History | View | Annotate | Download (1.64 KB)
1 | 1183 | deffi | #include "hardware_wall.h" |
---|---|---|---|
2 | 1281 | kwoo | #include <avr/io.h> |
3 | #include <avr/interrupt.h> |
||
4 | 1183 | deffi | |
5 | 1281 | kwoo | uint16_t wall_position; // Wall position in encoder ticks
|
6 | 1213 | deffi | |
7 | 1183 | deffi | void wall_init ()
|
8 | { |
||
9 | 1281 | kwoo | // Start the motors
|
10 | motors_init(); |
||
11 | motor2_set(FORWARD, 0);
|
||
12 | |||
13 | // Enable 5V switching regulator to power dynamos
|
||
14 | DDRB |= _BV(PB4); |
||
15 | PORTB &= ~_BV(PB4); |
||
16 | |||
17 | // Turn on the interrupts for the A quadrature
|
||
18 | cli(); |
||
19 | EICRB |= _BV(ISC60); |
||
20 | EIMSK |= _BV(INT6); |
||
21 | sei(); |
||
22 | |||
23 | // Enable limit switch as input
|
||
24 | DDRF &= ~_BV(DDF0); |
||
25 | |||
26 | usb_puts("Moving back...\r\n");
|
||
27 | delay_ms(1000);
|
||
28 | // Move wall back until the switch is triggered
|
||
29 | motor2_set(FORWARD, 255);
|
||
30 | while (!(PINF & _BV(PINF0)));
|
||
31 | motor2_set(FORWARD, 0);
|
||
32 | |||
33 | delay_ms(1000);
|
||
34 | usb_puts("Moving forward...\r\n");
|
||
35 | |||
36 | // Move wall forward slowly until the switch is untriggered
|
||
37 | motor2_set(BACKWARD, 255);
|
||
38 | while (PINF & _BV(PINF0));
|
||
39 | motor2_set(FORWARD, 0);
|
||
40 | |||
41 | usb_puts("Done with wall init\r\n");
|
||
42 | |||
43 | wall_position=0;
|
||
44 | |||
45 | 1183 | deffi | } |
46 | |||
47 | 1205 | deffi | |
48 | 1183 | deffi | void wall_set_position (uint16_t position)
|
49 | { |
||
50 | usb_puts ("# Moving wall to position ");
|
||
51 | usb_puti (position); |
||
52 | usb_puts (NL); |
||
53 | |||
54 | // FIXME implement
|
||
55 | |||
56 | 1281 | kwoo | //wall_position=position+1;
|
57 | 1213 | deffi | |
58 | usb_puts ("# Wall position reached" NL);
|
||
59 | 1183 | deffi | } |
60 | |||
61 | 1281 | kwoo | |
62 | 1183 | deffi | // We might also need this because the wall_set_position might not reach the exact position
|
63 | uint16_t wall_get_position () |
||
64 | { |
||
65 | 1281 | kwoo | return wall_position;
|
66 | 1183 | deffi | } |
67 | 1281 | kwoo | |
68 | // Read encoder when it changes and determine our position
|
||
69 | ISR(INT6_vect) { |
||
70 | uint8_t tmp = PINE; |
||
71 | |||
72 | if (((tmp & _BV(PE6)) << 1) ^ (tmp & _BV(PE7))) { |
||
73 | wall_position--; |
||
74 | } else {
|
||
75 | wall_position++; |
||
76 | } |
||
77 | } |