3
3
#ifndef Firmata_Boards_h
4
4
#define Firmata_Boards_h
5
5
6
- #include <Arduino.h> // for digitalRead, digitalWrite, etc
6
+ #include <inttypes.h>
7
+
8
+ #if defined(ARDUINO ) && ARDUINO >= 100
9
+ #include "Arduino.h" // for digitalRead, digitalWrite, etc
10
+ #else
11
+ #include "WProgram.h"
12
+ #endif
7
13
8
14
// Normally Servo.h must be included before Firmata.h (which then includes
9
15
// this file). If Servo.h wasn't included, this allows the code to still
@@ -120,62 +126,73 @@ writePort(port, value, bitmask): Write an 8 bit port.
120
126
121
127
// Arduino Duemilanove, Diecimila, and NG
122
128
#if defined(__AVR_ATmega168__ ) || defined(__AVR_ATmega328P__ )
129
+ #if defined(NUM_ANALOG_INPUTS ) && NUM_ANALOG_INPUTS == 6
130
+ #define TOTAL_ANALOG_PINS 6
131
+ #define TOTAL_PINS 20 // 14 digital + 6 analog
132
+ #else
123
133
#define TOTAL_ANALOG_PINS 8
124
- #define TOTAL_PINS 24 // 14 digital + 2 unused + 8 analog
134
+ #define TOTAL_PINS 22 // 14 digital + 8 analog
135
+ #endif
125
136
#define VERSION_BLINK_PIN 13
126
- #define IS_PIN_DIGITAL (p ) ((( p) >= 2 && (p) <= 13) || ((p) >= 16 && (p) <= 21) )
127
- #define IS_PIN_ANALOG (p ) ((p) >= 16 && (p) <= 23 )
137
+ #define IS_PIN_DIGITAL (p ) ((p) >= 2 && (p) <= 19 )
138
+ #define IS_PIN_ANALOG (p ) ((p) >= 14 && (p) < 14 + TOTAL_ANALOG_PINS )
128
139
#define IS_PIN_PWM (p ) IS_PIN_DIGITAL(p)
129
- #define IS_PIN_SERVO (p ) ((p) >= 2 && (p) <= 13 && (p) - 2 < MAX_SERVOS)
130
- #define IS_PIN_I2C (p ) (0 )
131
- #define PIN_TO_DIGITAL (p ) (((p) < 16) ? (p) : (p) - 2 )
132
- #define PIN_TO_ANALOG (p ) ((p) - 16 )
140
+ #define IS_PIN_SERVO (p ) (IS_PIN_DIGITAL (p) && (p) - 2 < MAX_SERVOS)
141
+ #define IS_PIN_I2C (p ) ((p) == 18 || (p) == 19 )
142
+ #define PIN_TO_DIGITAL (p ) (p )
143
+ #define PIN_TO_ANALOG (p ) ((p) - 14 )
133
144
#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
134
145
#define PIN_TO_SERVO (p ) ((p) - 2)
135
146
#define ARDUINO_PINOUT_OPTIMIZE 1
136
147
137
148
149
+ // Wiring (and board)
150
+ #elif defined(WIRING )
151
+ #define VERSION_BLINK_PIN WLED
152
+ #define IS_PIN_DIGITAL (p ) ((p) >= 0 && (p) < TOTAL_PINS)
153
+ #define IS_PIN_ANALOG (p ) ((p) >= FIRST_ANALOG_PIN && (p) < (FIRST_ANALOG_PIN+TOTAL_ANALOG_PINS))
154
+ #define IS_PIN_PWM (p ) IS_PIN_DIGITAL(p)
155
+ #define IS_PIN_SERVO (p ) ((p) >= 0 && (p) < MAX_SERVOS)
156
+ #define IS_PIN_I2C (p ) ((p) == SDA || (p) == SCL)
157
+ #define PIN_TO_DIGITAL (p ) (p)
158
+ #define PIN_TO_ANALOG (p ) ((p) - FIRST_ANALOG_PIN)
159
+ #define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
160
+ #define PIN_TO_SERVO (p ) (p)
161
+
162
+
138
163
// old Arduinos
139
164
#elif defined(__AVR_ATmega8__ )
140
165
#define TOTAL_ANALOG_PINS 6
141
- #define TOTAL_PINS 22 // 14 digital + 2 unused + 6 analog
166
+ #define TOTAL_PINS 20 // 14 digital + 6 analog
142
167
#define VERSION_BLINK_PIN 13
143
- #define IS_PIN_DIGITAL (p ) ((( p) >= 2 && (p) <= 13) || ((p) >= 16 && (p) <= 21) )
144
- #define IS_PIN_ANALOG (p ) ((p) >= 16 && (p) <= 21 )
168
+ #define IS_PIN_DIGITAL (p ) ((p) >= 2 && (p) <= 19 )
169
+ #define IS_PIN_ANALOG (p ) ((p) >= 14 && (p) <= 19 )
145
170
#define IS_PIN_PWM (p ) IS_PIN_DIGITAL(p)
146
- #define IS_PIN_SERVO (p ) ((p) >= 2 && (p) <= 13 && (p) - 2 < MAX_SERVOS)
147
- #define IS_PIN_I2C (p ) (0 )
148
- #define PIN_TO_DIGITAL (p ) (((p) < 16) ? (p) : (p) - 2 )
149
- #define PIN_TO_ANALOG (p ) ((p) - 16 )
171
+ #define IS_PIN_SERVO (p ) (IS_PIN_DIGITAL (p) && (p) - 2 < MAX_SERVOS)
172
+ #define IS_PIN_I2C (p ) ((p) == 18 || (p) == 19 )
173
+ #define PIN_TO_DIGITAL (p ) (p )
174
+ #define PIN_TO_ANALOG (p ) ((p) - 14 )
150
175
#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
151
176
#define PIN_TO_SERVO (p ) ((p) - 2)
152
177
#define ARDUINO_PINOUT_OPTIMIZE 1
153
178
154
179
155
180
// Arduino Mega
156
- #elif defined(__AVR_ATmega1280__ ) || defined( __AVR_ATmega2560__ )
181
+ #elif defined(__AVR_ATmega1280__ )
157
182
#define TOTAL_ANALOG_PINS 16
158
183
#define TOTAL_PINS 70 // 54 digital + 16 analog
159
184
#define VERSION_BLINK_PIN 13
160
185
#define IS_PIN_DIGITAL (p ) ((p) >= 2 && (p) < TOTAL_PINS)
161
186
#define IS_PIN_ANALOG (p ) ((p) >= 54 && (p) < TOTAL_PINS)
162
187
#define IS_PIN_PWM (p ) IS_PIN_DIGITAL(p)
163
188
#define IS_PIN_SERVO (p ) ((p) >= 2 && (p) - 2 < MAX_SERVOS)
164
- #define IS_PIN_I2C (p ) (0 )
189
+ #define IS_PIN_I2C (p ) ((p) == 20 || (p) == 21 )
165
190
#define PIN_TO_DIGITAL (p ) (p)
166
191
#define PIN_TO_ANALOG (p ) ((p) - 54)
167
192
#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
168
193
#define PIN_TO_SERVO (p ) ((p) - 2)
169
194
170
195
171
- // Wiring
172
- #elif defined(__AVR_ATmega128__ )
173
- #define TOTAL_ANALOG_PINS 8
174
- #define TOTAL_PINS 51
175
- #define VERSION_BLINK_PIN 48
176
- // TODO: hardware abstraction for wiring board
177
-
178
-
179
196
// Teensy 1.0
180
197
#elif defined(__AVR_AT90USB162__ )
181
198
#define TOTAL_ANALOG_PINS 0
@@ -201,7 +218,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
201
218
#define IS_PIN_ANALOG (p ) ((p) >= 11 && (p) <= 22)
202
219
#define IS_PIN_PWM (p ) IS_PIN_DIGITAL(p)
203
220
#define IS_PIN_SERVO (p ) ((p) >= 0 && (p) < MAX_SERVOS)
204
- #define IS_PIN_I2C (p ) (0 )
221
+ #define IS_PIN_I2C (p ) ((p) == 5 || (p) == 6 )
205
222
#define PIN_TO_DIGITAL (p ) (p)
206
223
#define PIN_TO_ANALOG (p ) (((p)<22)?21-(p):11)
207
224
#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
@@ -217,7 +234,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
217
234
#define IS_PIN_ANALOG (p ) ((p) >= 38 && (p) < TOTAL_PINS)
218
235
#define IS_PIN_PWM (p ) IS_PIN_DIGITAL(p)
219
236
#define IS_PIN_SERVO (p ) ((p) >= 0 && (p) < MAX_SERVOS)
220
- #define IS_PIN_I2C (p ) (0 )
237
+ #define IS_PIN_I2C (p ) ((p) == 0 || (p) == 1 )
221
238
#define PIN_TO_DIGITAL (p ) (p)
222
239
#define PIN_TO_ANALOG (p ) ((p) - 38)
223
240
#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
@@ -233,7 +250,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
233
250
#define IS_PIN_ANALOG (p ) ((p) >= 24 && (p) < TOTAL_PINS)
234
251
#define IS_PIN_PWM (p ) IS_PIN_DIGITAL(p)
235
252
#define IS_PIN_SERVO (p ) ((p) >= 0 && (p) < MAX_SERVOS)
236
- #define IS_PIN_I2C (p ) (0 )
253
+ #define IS_PIN_I2C (p ) ((p) == 16 || (p) == 17 )
237
254
#define PIN_TO_DIGITAL (p ) (p)
238
255
#define PIN_TO_ANALOG (p ) ((p) - 24)
239
256
#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
@@ -249,7 +266,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
249
266
#define IS_PIN_ANALOG (p ) ((p) >= 36 && (p) < TOTAL_PINS)
250
267
#define IS_PIN_PWM (p ) IS_PIN_DIGITAL(p)
251
268
#define IS_PIN_SERVO (p ) ((p) >= 0 && (p) < MAX_SERVOS)
252
- #define IS_PIN_I2C (p ) (0 )
269
+ #define IS_PIN_I2C (p ) ((p) == 4 || (p) == 5 )
253
270
#define PIN_TO_DIGITAL (p ) (p)
254
271
#define PIN_TO_ANALOG (p ) ((p) - 36)
255
272
#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
@@ -270,9 +287,9 @@ static inline unsigned char readPort(byte, byte) __attribute__((always_inline, u
270
287
static inline unsigned char readPort (byte port , byte bitmask )
271
288
{
272
289
#if defined(ARDUINO_PINOUT_OPTIMIZE )
273
- if (port == 0 ) return PIND & B11111100 & bitmask ; // ignore Rx/Tx 0/1
274
- if (port == 1 ) return PINB & B00111111 & bitmask ; // pins 8-13 (14,15 are disabled for the crystal)
275
- if (port == 2 ) return PINC & bitmask ;
290
+ if (port == 0 ) return ( PIND & 0xFC ) & bitmask ; // ignore Rx/Tx 0/1
291
+ if (port == 1 ) return (( PINB & 0x3F ) | (( PINC & 0x03 ) << 6 )) & bitmask ;
292
+ if (port == 2 ) return (( PINC & 0x3C ) >> 2 ) & bitmask ;
276
293
return 0 ;
277
294
#else
278
295
unsigned char out = 0 , pin = port * 8 ;
@@ -297,17 +314,27 @@ static inline unsigned char writePort(byte port, byte value, byte bitmask)
297
314
{
298
315
#if defined(ARDUINO_PINOUT_OPTIMIZE )
299
316
if (port == 0 ) {
300
- bitmask = bitmask & 0xFC ; // Tx & Rx pins
317
+ bitmask = bitmask & 0xFC ; // do not touch Tx & Rx pins
318
+ byte valD = value & bitmask ;
319
+ byte maskD = ~bitmask ;
301
320
cli ();
302
- PORTD = (PORTD & ~ bitmask ) | ( bitmask & value ) ;
321
+ PORTD = (PORTD & maskD ) | valD ;
303
322
sei ();
304
323
} else if (port == 1 ) {
324
+ byte valB = (value & bitmask ) & 0x3F ;
325
+ byte valC = (value & bitmask ) >> 6 ;
326
+ byte maskB = ~(bitmask & 0x3F );
327
+ byte maskC = ~((bitmask & 0xC0 ) >> 6 );
305
328
cli ();
306
- PORTB = (PORTB & ~bitmask ) | (bitmask & value );
329
+ PORTB = (PORTB & maskB ) | valB ;
330
+ PORTC = (PORTC & maskC ) | valC ;
307
331
sei ();
308
332
} else if (port == 2 ) {
333
+ bitmask = bitmask & 0x0F ;
334
+ byte valC = (value & bitmask ) << 2 ;
335
+ byte maskC = ~(bitmask << 2 );
309
336
cli ();
310
- PORTC = (PORTC & ~ bitmask ) | ( bitmask & value ) ;
337
+ PORTC = (PORTC & maskC ) | valC ;
311
338
sei ();
312
339
}
313
340
#else
0 commit comments