Mercurial > controller
annotate controller.ino @ 4:e2ec8dc3a6d8 default tip
Always empty the receive buffer
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Thu, 15 Sep 2016 00:03:04 +0200 |
| parents | 9f41bcaa3cee |
| children |
| rev | line source |
|---|---|
|
1
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
1 #include <Wire.h> |
|
0
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
2 #include "pwm.h" |
|
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
3 |
|
1
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
4 |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
5 const uint8_t I2C_ADDRESS = 0x09; |
|
0
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
6 const uint8_t MAX_PINS = 18; |
|
4
e2ec8dc3a6d8
Always empty the receive buffer
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
2
diff
changeset
|
7 const uint32_t PWM_PERIOD = 20000L; // 50Hz |
|
1
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
8 |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
9 volatile uint8_t *ports[MAX_PINS] = { |
|
0
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
10 &PORTD, &PORTD, |
|
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
11 &PORTD, &PORTD, &PORTD, &PORTD, &PORTD, &PORTD, &PORTB, &PORTB, |
|
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
12 &PORTB, &PORTB, &PORTB, &PORTB, &PORTC, &PORTC, &PORTC, &PORTC, |
|
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
13 }; |
|
1
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
14 uint8_t pins[MAX_PINS] = { |
|
0
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
15 1, 0, |
|
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
16 2, 3, 4, 5, 6, 7, 0, 1, |
|
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
17 2, 3, 4, 5, 0, 1, 2, 3, |
|
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
18 }; |
|
2
9f41bcaa3cee
Handle servo updates in the main loop
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
19 volatile bool changed = false; |
|
0
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
20 |
|
1
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
21 |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
22 void receive(int16_t count) { |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
23 union { |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
24 byte bytes[2]; |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
25 uint16_t value; |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
26 } bytes2int; |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
27 uint8_t servo = Wire.read(); |
|
4
e2ec8dc3a6d8
Always empty the receive buffer
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
2
diff
changeset
|
28 while ((Wire.available() >= 2) && (servo < MAX_PINS)) { |
|
1
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
29 bytes2int.bytes[0] = Wire.read(); |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
30 bytes2int.bytes[1] = Wire.read(); |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
31 pwm_set_phase_batch(servo, bytes2int.value); |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
32 ++servo; |
|
0
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
33 } |
|
4
e2ec8dc3a6d8
Always empty the receive buffer
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
2
diff
changeset
|
34 while (Wire.available()) { |
|
e2ec8dc3a6d8
Always empty the receive buffer
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
2
diff
changeset
|
35 Wire.read(); |
|
e2ec8dc3a6d8
Always empty the receive buffer
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
2
diff
changeset
|
36 } |
|
2
9f41bcaa3cee
Handle servo updates in the main loop
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
37 changed = true; |
|
0
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
38 } |
|
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
39 |
|
1
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
40 |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
41 void setup() { |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
42 pwm_init(ports, pins, MAX_PINS, PWM_PERIOD); |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
43 for (uint8_t i = 0; i < MAX_PINS; ++i) { |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
44 pwm_set_phase_batch(i, 0); |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
45 } |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
46 pwm_apply_batch(); |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
47 Wire.begin(I2C_ADDRESS); |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
48 Wire.onReceive(receive); |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
49 } |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
50 |
|
7b2d0a758e63
Add pcb and finish i2c slave
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
0
diff
changeset
|
51 |
|
0
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
52 void loop() { |
|
2
9f41bcaa3cee
Handle servo updates in the main loop
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
53 if (changed) { |
|
9f41bcaa3cee
Handle servo updates in the main loop
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
54 pwm_apply_batch(); |
|
9f41bcaa3cee
Handle servo updates in the main loop
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
55 changed = false; |
|
9f41bcaa3cee
Handle servo updates in the main loop
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
56 } |
|
0
2b5078b37907
Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
57 } |
