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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }