mirror of
				https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
				synced 2025-10-31 03:14:16 +00:00 
			
		
		
		
	
		
			
	
	
		
			451 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			451 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  |   Arduino.h - standard definitions for Arduino build environment | ||
|  |   Part of Arduino - http://www.arduino.cc/
 | ||
|  | 
 | ||
|  |   Copyright (c) 2007 David A. Mellis [duplicated from pins_arduino.h, not present in original] | ||
|  | 
 | ||
|  |   This library is free software; you can redistribute it and/or | ||
|  |   modify it under the terms of the GNU Lesser General Public | ||
|  |   License as published by the Free Software Foundation; either | ||
|  |   version 2.1 of the License, or (at your option) any later version. | ||
|  | 
 | ||
|  |   This library is distributed in the hope that it will be useful, | ||
|  |   but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
|  |   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||
|  |   Lesser General Public License for more details. | ||
|  | 
 | ||
|  |   You should have received a copy of the GNU Lesser General | ||
|  |   Public License along with this library; if not, write to the | ||
|  |   Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
|  |   Boston, MA  02111-1307  USA | ||
|  | 
 | ||
|  |   Updated for 'xmega' core by bob frazier, S.F.T. Inc. - http://mrp3.com/
 | ||
|  |   for the XMegaForArduino project - http://github.com/XMegaForArduino
 | ||
|  | 
 | ||
|  |   In some cases, the xmega updates make assumptions about the pin assignments. | ||
|  |   See 'pins_arduino.h' for more detail. | ||
|  | 
 | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifndef Arduino_h
 | ||
|  | #define Arduino_h
 | ||
|  | 
 | ||
|  | #include <stdlib.h>
 | ||
|  | #include <string.h>
 | ||
|  | #include <math.h>
 | ||
|  | 
 | ||
|  | #include <avr/pgmspace.h>
 | ||
|  | #include <avr/io.h>
 | ||
|  | #include <avr/interrupt.h>
 | ||
|  | 
 | ||
|  | #include "binary.h"
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C"{ | ||
|  | #endif // __cplusplus
 | ||
|  | 
 | ||
|  | #define HIGH 0x1
 | ||
|  | #define LOW  0x0
 | ||
|  | 
 | ||
|  | #define INPUT                0x0 /* totem poll, input */
 | ||
|  | #define OUTPUT               0x1 /* totem poll, output */
 | ||
|  | #define INPUT_BUS_KEEPER     0x2 /* weak pull up/down to maintain state when switched to or in input mode */
 | ||
|  | #define INPUT_PULLUP         0x3 /* pullup resistor on input */
 | ||
|  | #define INPUT_PULLDOWN       0x4 /* pulldown resistor on input */
 | ||
|  | #define OUTPUT_OR            0x5 /* output open drain 'or', no pulldown */
 | ||
|  | #define OUTPUT_AND           0x6 /* output open drain 'and', no pullup */
 | ||
|  | #define INPUT_OR_PULLDOWN    0x7 /* output open drain 'or' with pulldown */
 | ||
|  | #define INPUT_AND_PULLUP     0x8 /* output open drain 'and' with pullup */
 | ||
|  | #define OUTPUT_OR_PULLDOWN   0x9 /* output open drain 'or' with pulldown */
 | ||
|  | #define OUTPUT_AND_PULLUP    0xa /* output open drain 'and' with pullup */
 | ||
|  | #define INPUT_OUTPUT_MASK    0xf /* mask for INPUT/OUTPUT flags */
 | ||
|  | #define INPUT_SENSE_DEFAULT  0    /* input sense default - currently 'BOTH' */
 | ||
|  | #define INPUT_SENSE_RISING   0x10 /* just rising */
 | ||
|  | #define INPUT_SENSE_FALLING  0x20 /* just falling */
 | ||
|  | #define INPUT_SENSE_BOTH     0x30 /* rising AND falling */
 | ||
|  | #define INPUT_SENSE_LEVEL    0x40 /* high level (or low if I invert it) */
 | ||
|  | #define INPUT_SENSE_DISABLED 0x50 /* buffered input disabled (most pins won't be able to use 'IN' if you do this) */
 | ||
|  | #define INPUT_SENSE_MASK     0x70 /* mask for 'input sense' bits */
 | ||
|  | #define INPUT_OUTPUT_INVERT  0x80 /* bit for 'inverted' I/O - note that digitalRead and digitalWrite will re-invert to maintain consistency */
 | ||
|  | 
 | ||
|  | // NOTE:  'INPUT_OUTPUT_INVER' is primarily there to support LOW LEVEL interrupts.  if you specify this flag for normal
 | ||
|  | //        digital I/O, there will be no 'visible effect' since digitalRead and digitalWrite will "re-invert" the bit value
 | ||
|  | //        and act as if the invert flag weren't set.  That way, if you select 'LOW LEVEL' interrupt, you will read the
 | ||
|  | //        low level as a '0' (as it should be) via digitalRead, even though the value MUST be inverted for this to work.
 | ||
|  | 
 | ||
|  | // NOTE:  the values of 'true' and 'false' should be defined by C++ already
 | ||
|  | #define true /*0x1*/(!0) /* rather than '1' true is defined as '!0' - it's logically accurate */
 | ||
|  | #define false 0x0
 | ||
|  | 
 | ||
|  | #define PI 3.1415926535897932384626433832795
 | ||
|  | #define HALF_PI 1.5707963267948966192313216916398
 | ||
|  | #define TWO_PI 6.283185307179586476925286766559
 | ||
|  | #define DEG_TO_RAD 0.017453292519943295769236907684886
 | ||
|  | #define RAD_TO_DEG 57.295779513082320876798154814105
 | ||
|  | 
 | ||
|  | /* I do not know what these next 4 #defines do, but all 4 seem to be WRONG - bf */ | ||
|  | #define SERIAL  0x0
 | ||
|  | #define DISPLAY 0x1
 | ||
|  | 
 | ||
|  | #define LSBFIRST 0
 | ||
|  | #define MSBFIRST 1
 | ||
|  | 
 | ||
|  | // INTERRUPT TYPE - LOW, HIGH, CHANGE, FALLING, RISING  (compatibility with DUE etc.)
 | ||
|  | // 'LOW' is defined as '0' already
 | ||
|  | // 'HIGH' is defined as '1' already
 | ||
|  | #define CHANGE 2
 | ||
|  | #define FALLING 3
 | ||
|  | #define RISING 4
 | ||
|  | 
 | ||
|  | // definitions for atmega328 etc. carried forward - not sure what this is for
 | ||
|  | #define INTERNAL 3
 | ||
|  | #define DEFAULT 1
 | ||
|  | #define EXTERNAL 0
 | ||
|  | 
 | ||
|  | // undefine stdlib's abs if encountered (from 'arduino' version)
 | ||
|  | #ifdef abs
 | ||
|  | #undef abs
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #define min(a,b) ((a)<(b)?(a):(b))
 | ||
|  | #define max(a,b) ((a)>(b)?(a):(b))
 | ||
|  | #define abs(x) ((x)>0?(x):-(x))
 | ||
|  | #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
 | ||
|  | #define round(x)     ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
 | ||
|  | #define radians(deg) ((deg)*DEG_TO_RAD)
 | ||
|  | #define degrees(rad) ((rad)*RAD_TO_DEG)
 | ||
|  | #define sq(x) ((x)*(x))
 | ||
|  | 
 | ||
|  | #define interrupts() sei()
 | ||
|  | #define noInterrupts() cli()
 | ||
|  | 
 | ||
|  | #define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
 | ||
|  | #define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )
 | ||
|  | #define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() )
 | ||
|  | 
 | ||
|  | #define lowByte(w) ((uint8_t) ((w) & 0xff))
 | ||
|  | #define highByte(w) ((uint8_t) ((w) >> 8))
 | ||
|  | 
 | ||
|  | #define bitRead(value, bit) (((value) >> (bit)) & 0x01)
 | ||
|  | #define bitSet(value, bit) ((value) |= (1UL << (bit)))
 | ||
|  | #define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
 | ||
|  | #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
 | ||
|  | 
 | ||
|  | 
 | ||
|  | typedef unsigned int word; | ||
|  | 
 | ||
|  | #define bit(b) (1UL << (b))
 | ||
|  | 
 | ||
|  | typedef uint8_t boolean; | ||
|  | typedef uint8_t byte; | ||
|  | 
 | ||
|  | void init(void); | ||
|  | void initVariant(void); | ||
|  | 
 | ||
|  | int atexit(void (*func)()) __attribute__((weak)); | ||
|  | 
 | ||
|  | void adc_setup(void); // implemented in wiring_analog.c - configures ADC for analogRead()
 | ||
|  | // adc_setup must be called whenever exiting SLEEP MODE or ADC will malfunction
 | ||
|  | // It is automatically called from 'init()' but sleep mode typically resets the controller
 | ||
|  | 
 | ||
|  | void pinMode(uint8_t, uint8_t); | ||
|  | void digitalWrite(uint8_t, uint8_t); | ||
|  | int digitalRead(uint8_t); | ||
|  | int analogRead(uint8_t); | ||
|  | void analogReference(uint8_t mode); // somewhat different for xmega (default is Vcc/2) - see 'enum _analogReference_', below
 | ||
|  |                                     // pass only one of THOSE values as 'mode'
 | ||
|  | void analogWrite(uint8_t, int); | ||
|  | 
 | ||
|  | // special XMEGA-specific functions for the analog inputs
 | ||
|  | 
 | ||
|  | int analogReadDeltaWithGain(uint8_t pin, uint8_t negpin, uint8_t gain); | ||
|  | // typically 'pin' can be A0 through An, 'negpin' may be restricted but typically A4-A7 or 'ANALOG_READ_DELTA_USE_GND' to use GND
 | ||
|  | // NOTE:  On the A-series processors it is NOT possible to use 'diff input with gain' on MORE than A0-A7
 | ||
|  | //        On later processors (like D series) it _IS_ possible.
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #define ANALOG_READ_DELTA_USE_GND 0xff
 | ||
|  | 
 | ||
|  | // there is a bug in several headers for ADC_REFSEL_gm - should be 0x70, not 0x30 (and it gets re-defined, too)
 | ||
|  | #ifdef ADC_REFSEL_gm
 | ||
|  | #undef ADC_REFSEL_gm
 | ||
|  | #endif // ADC_REFSEL_gm
 | ||
|  | #define ADC_REFSEL_gm 0x70
 | ||
|  | 
 | ||
|  | enum _analogReference_ // pass to 'analogReference' function - see D manual section 22.14.3, or 28.16.3 in 'AU' manual
 | ||
|  | { | ||
|  |   analogReference_INT1V = (ADC_REFSEL_INT1V_gc), | ||
|  |   analogReference_PORTA0 = (ADC_REFSEL_AREFA_gc),   // PORT A pin 0 is the AREF
 | ||
|  | 
 | ||
|  | #if !defined (__AVR_ATxmega8E5__) && !defined (__AVR_ATxmega16E5__) && !defined (__AVR_ATxmega32E5__)
 | ||
|  |   // these 2 aren't valid for 'E' series
 | ||
|  |   analogReference_PORTB0 = (ADC_REFSEL_AREFB_gc),   // PORT B pin 0 is the AREF
 | ||
|  | 
 | ||
|  |   analogReference_VCC = (ADC_REFSEL0_bm) /* (ADC_REFSEL_VCC_gc)*/,        // VCC / 10, actually
 | ||
|  |   // NOTE:  'ADC_REFSEL_VCC_gc' exists for some headers, and others 'ADC_REFSEL_INTVCC_gc'
 | ||
|  |   //        to avoid compile problems I use the bitmask instead.
 | ||
|  | #endif // E series
 | ||
|  | 
 | ||
|  | #if defined(__AVR_ATxmega64d4__) || defined(__AVR_ATxmega64a1u__) || defined(__AVR_ATxmega128a1u__)
 | ||
|  |   analogReference_VCCDIV2 = (ADC_REFSEL_VCCDIV2_gc) // using THIS forces gain to 1/2, so it's rail-rail
 | ||
|  | #else
 | ||
|  |   analogReference_VCCDIV2 = (0x04<<4) // (ADC_REFSEL_VCCDIV2_gc)
 | ||
|  |   // NOTE that for some processor headers, ADC_REFSEL_VCCDIV2_gc is not properly defined
 | ||
|  |   // this definition '(0x04<<4)' is taken from the 64d4 header.  it's also THE DEFAULT for max compatibility
 | ||
|  | #endif // processors that define ADC_REFSEL_VCCDIV2_gc correctly
 | ||
|  | };   | ||
|  | 
 | ||
|  | // NOTE: this constant isn't always defined, either
 | ||
|  | #ifndef ADC_CH_GAIN_gm
 | ||
|  | #define ADC_CH_GAIN_gm  0x1C  /* Gain Factor group mask. */
 | ||
|  | #endif // ADC_CH_GAIN_gm
 | ||
|  | 
 | ||
|  | 
 | ||
|  | unsigned long millis(void); | ||
|  | unsigned long micros(void); | ||
|  | void delay(unsigned long); | ||
|  | void delayMicroseconds(unsigned int us); | ||
|  | unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); | ||
|  | 
 | ||
|  | void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); | ||
|  | uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); | ||
|  | 
 | ||
|  | // XMEGA specific
 | ||
|  | void wait_for_interrupt(void); // uses 'IDLE' sleep mode to wait for an interrupt, then returns
 | ||
|  | void low_power_delay(unsigned long ms); // similar to 'delay' but goes into low power 'IDLE sleep' state
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // X M E G A   X M E G A   X M E G A   X M E G A   X M E G A   X M E G A   X M E G A   X M E G A
 | ||
|  | //
 | ||
|  | // NOTE:  for 'attachInterrupt' the 'mode' parameter indicates non-default input pins
 | ||
|  | //        and the interrupt mode, as well as the interrupt priority.  If the interrupt
 | ||
|  | //        priority is INT_MODE_PRI_DEFAULT (0), it will be assigned a 'default' value.
 | ||
|  | //        Default interrupt pin is pin 2 except for PORTR (since it doesn't have a pin 2)
 | ||
|  | //        when it has not been specified.
 | ||
|  | //
 | ||
|  | //        usage:
 | ||
|  | //          attachInterrupt(PORTD_INT0,                                     the specific interrupt vector - see pins_arduino.h
 | ||
|  | //                          my_callback,                                    user-defined callback function
 | ||
|  | //                          RISING                                          interrupt mode (can be LOW, HIGH, RISING, FALLING, CHANGE)
 | ||
|  | //                          | INT_MODE_PIN_DEFAULT                          the pin(s) to assign to this interrupt, or default pin 2 (optional)
 | ||
|  | //                          | INT_MODE_PRI_DEFAULT);                        interrupt priority, default is 'high' (optional)
 | ||
|  | //
 | ||
|  | //        Additional note, the 'pin' constants (see below) refer to the port's pin number, and
 | ||
|  | //        NOT the 'digital I/O pin' number.  See 'pins_arduino.h' for more on this.
 | ||
|  | //
 | ||
|  | // for compatibility with newer arduino environment, attachInterrupt 'interruptNum' parameter
 | ||
|  | // can use the return value from 'digitalPinToInterrupt(pin)'
 | ||
|  | //
 | ||
|  | // X M E G A   X M E G A   X M E G A   X M E G A   X M E G A   X M E G A   X M E G A   X M E G A
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | void attachInterrupt(uint8_t interruptNum, void (*)(void), int mode = 0); // default 'mode' param is:  LOW | INT_MODE_PRI_DEFAULT | INT_MODE_PIN_DEFAULT
 | ||
|  | #else // not __cplusplus
 | ||
|  | void attachInterrupt(uint8_t interruptNum, void (*)(void), int mode); | ||
|  | #endif // __cplusplus
 | ||
|  | 
 | ||
|  | void detachInterrupt(uint8_t interruptNum); // NOTE:  detaches ALL interrupts for that port (special exceptions for serial flow control)
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // this next function reads data from the calibration row, including the serial # info.
 | ||
|  | // This is often referred to as the 'PRODUCT SIGNATURE ROW'.  It is xmega-specific.
 | ||
|  | uint8_t readCalibrationData(uint16_t iIndex); | ||
|  | 
 | ||
|  | 
 | ||
|  | // INTERRUPT MODE FLAGS - for attachInterrupt 'mode' parameter
 | ||
|  | 
 | ||
|  | #define INT_MODE_MODE_MASK 0x003f
 | ||
|  | #define INT_MODE_PRI_MASK  0x00c0
 | ||
|  | #define INT_MODE_PRI_DEFAULT    0
 | ||
|  | #define INT_MODE_PRI_LOW   0x0040
 | ||
|  | #define INT_MODE_PRI_MED   0x0080
 | ||
|  | #define INT_MODE_PRI_HIGH  0x00c0
 | ||
|  | #define INT_MODE_PRI_SHIFT      6 /* shift right 6 bits to get a 0, 1, 2 or 3 for priority (0 is 'default') */
 | ||
|  | #define INT_MODE_PIN_MASK  0xff00
 | ||
|  | #define INT_MODE_PIN0      0x0100
 | ||
|  | #define INT_MODE_PIN1      0x0200
 | ||
|  | #define INT_MODE_PIN2      0x0400
 | ||
|  | #define INT_MODE_PIN3      0x0800
 | ||
|  | #define INT_MODE_PIN4      0x1000
 | ||
|  | #define INT_MODE_PIN5      0x2000
 | ||
|  | #define INT_MODE_PIN6      0x4000
 | ||
|  | #define INT_MODE_PIN7      0x8000
 | ||
|  | #define INT_MODE_PIN_DEFAULT    0 /* no 'pin bits' set implies 'default' which is pin 2 on each capable port */
 | ||
|  | #define INT_MODE_PIN_SHIFT      8 /* shift right 8 bits to get the pin bits in a single byte */
 | ||
|  | 
 | ||
|  | // NOTE:  the 'pin' constants refer to the port's pin number, and not the digital I/O pin
 | ||
|  | //        The default 'pin 2' refers to the port's pin 2. See 'pins_arduino.h' for more on this.
 | ||
|  | //        Multiple pins may be specified, so it is a bit mask.  If a pin is specified by using
 | ||
|  | //        digitalPinToInterrupt() and you also specify pins using the 'INT_MODE_PINx' flags, the
 | ||
|  | //        pin specified in the 'interruptNum' parameter will be 'or'd with the pins specified in
 | ||
|  | //        'mode'.  This can result in some unpredictable outcomes, so you should either use
 | ||
|  | //        'digitalPinToInterrupt' for 'interruptNum', or specify the port as 'interruptNum' and
 | ||
|  | //        then specfify the pin info in 'mode'.
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #define NOT_AN_INTERRUPT (-1) /* a placeholder for various arrays, etc. */
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // SETUP and LOOP (no changes from Arduino classic)
 | ||
|  | 
 | ||
|  | void setup(void); | ||
|  | void loop(void); | ||
|  | 
 | ||
|  | 
 | ||
|  | // hardware flow control 'helpers'
 | ||
|  | void serial_0_cts_callback(void); | ||
|  | void serial_1_cts_callback(void); | ||
|  | void InitSerialFlowControlInterrupts(void); | ||
|  | 
 | ||
|  | 
 | ||
|  | // On the xmega, the addresses of the port registers are
 | ||
|  | // greater than 255, so we can't store them in uint8_t's.
 | ||
|  | extern const uint16_t PROGMEM port_to_mode_PGM[]; | ||
|  | extern const uint16_t PROGMEM port_to_input_PGM[]; | ||
|  | extern const uint16_t PROGMEM port_to_output_PGM[]; | ||
|  | extern const uint16_t PROGMEM digital_pin_to_control_PGM[]; | ||
|  | 
 | ||
|  | // these contain index values so they CAN be uint8_t's
 | ||
|  | extern const uint8_t PROGMEM digital_pin_to_port_PGM[]; | ||
|  | extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[]; | ||
|  | extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; | ||
|  | // extern const uint8_t PROGMEM digital_pin_to_bit_PGM[];  not used on xmega
 | ||
|  | extern const uint16_t PROGMEM port_to_input_PGM[]; | ||
|  | 
 | ||
|  | // Get the bit location within the hardware port of the given virtual pin.
 | ||
|  | // This comes from the pins_*.c file for the active board configuration.
 | ||
|  | //
 | ||
|  | // These perform slightly better as macros compared to inline functions
 | ||
|  | //
 | ||
|  | #define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
 | ||
|  | #define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
 | ||
|  | #define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )
 | ||
|  | // note pins_arduino.h may need to override this next one, depending
 | ||
|  | #define analogInPinToBit(P) ((P) & 7) /* analog pin 0 = 0 (PORTA), analog pin 8 = 0 (PORTB) */
 | ||
|  | #define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) )
 | ||
|  | #define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) )
 | ||
|  | #define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) )
 | ||
|  | #define pinControlRegister(P) ( (volatile uint8_t *)( pgm_read_word( digital_pin_to_control_PGM + (P))) )
 | ||
|  | 
 | ||
|  | // use THIS macro to convert a _BV(n) value into 'n'
 | ||
|  | #define pinBitValueToIndex(B) ( (B)==_BV(0) ? 0 : (B)==_BV(1) ? 1 : (B)==_BV(2) ? 2 : (B)==_BV(3) ? 3 : \
 | ||
|  |                                 (B)==_BV(4) ? 4 : (B)==_BV(5) ? 5 : (B)==_BV(6) ? 6 : (B)==_BV(7) ? 7 : 0 ) | ||
|  | 
 | ||
|  | #define NOT_A_PIN 0
 | ||
|  | #define NOT_A_PORT 0
 | ||
|  | 
 | ||
|  | #ifdef ARDUINO_MAIN
 | ||
|  | // use of '_' prefix to prevent collisions with iox64d#.h and for consistency
 | ||
|  | #define _PA 1
 | ||
|  | #define _PB 2
 | ||
|  | #define _PC 3
 | ||
|  | #define _PD 4
 | ||
|  | #define _PE 5
 | ||
|  | #define _PR 6 /* was PF */
 | ||
|  | #define _PF 7
 | ||
|  | #define _PH 8
 | ||
|  | #define _PJ 9
 | ||
|  | #define _PK 10
 | ||
|  | #define _PQ 11
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | // modified timer definitions for xmega
 | ||
|  | // TCD2 --> TIMERD2
 | ||
|  | // TCC2 --> TIMERC2
 | ||
|  | // TCE0 --> TIMERE0 - 'D' series which has only 4 pins on PORTE */
 | ||
|  | // TCE2 --> TIMERE2 - A series and others that use all 8 pins for port E
 | ||
|  | // TCF2 --> TIMERF2 - A series and others that have PORT F
 | ||
|  | #define NOT_ON_TIMER 0
 | ||
|  | #define TIMERD2 1
 | ||
|  | #define TIMERC2 2
 | ||
|  | #define TIMERE0 3
 | ||
|  | #define TIMERE2 4
 | ||
|  | #define TIMERF2 5
 | ||
|  | #define TIMERC4 6
 | ||
|  | #define TIMERD5 7
 | ||
|  | // not using TCD0,1 nor TCC0,1
 | ||
|  | // The first 16 IO pins (PD0-PD7, PC0-PC7) will be PWM capable, as are PE0-PE3 (or PE0-PE7) and PF0-PF7 (when there)
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } // extern "C"
 | ||
|  | #endif // __cplusplus
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | #include "WCharacter.h"
 | ||
|  | #include "WString.h"
 | ||
|  | #include "HardwareSerial.h"
 | ||
|  | 
 | ||
|  | uint16_t makeWord(uint16_t w); | ||
|  | uint16_t makeWord(byte h, byte l); | ||
|  | 
 | ||
|  | #define word(...) makeWord(__VA_ARGS__)
 | ||
|  | 
 | ||
|  | #if 0
 | ||
|  | // these are not currently implemented - TODO implement them
 | ||
|  | 
 | ||
|  | unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); | ||
|  | #endif // 0
 | ||
|  | 
 | ||
|  | void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); | ||
|  | void noTone(uint8_t _pin); | ||
|  | 
 | ||
|  | 
 | ||
|  | // WMath prototypes
 | ||
|  | long random(long); | ||
|  | long random(long, long); | ||
|  | void randomSeed(unsigned int); | ||
|  | long map(long, long, long, long, long); | ||
|  | 
 | ||
|  | #endif // __cplusplus
 | ||
|  | 
 | ||
|  | // at this point we include the pin definitions from 'pins_arduino.h'
 | ||
|  | // you can customize 'pins_arduino.h' for your specific hardware
 | ||
|  | 
 | ||
|  | #include "pins_arduino.h"
 | ||
|  | 
 | ||
|  | // The default SPI interface is SPIC if not already defined
 | ||
|  | #ifndef DEFAULT_SPI
 | ||
|  | #define DEFAULT_SPI SPIC
 | ||
|  | #endif // DEFAULT_SPI
 | ||
|  | 
 | ||
|  | // the default TWI interface is TWIC if not already defined
 | ||
|  | #ifndef DEFAULT_TWI
 | ||
|  | #define DEFAULT_TWI TWIC
 | ||
|  | #endif // DEFAULT_TWI
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // added support for hardware serial flow control - spans multiple files
 | ||
|  | 
 | ||
|  | #if defined(SERIAL_0_RTS_PORT_NAME) && defined(SERIAL_0_RTS_PIN_INDEX)
 | ||
|  | #define SERIAL_0_RTS_ENABLED
 | ||
|  | #define SERIAL_0_RTS_PORT (&SERIAL_0_RTS_PORT_NAME)
 | ||
|  | #define SERIAL_0_RTS_PIN _BV(SERIAL_0_RTS_PIN_INDEX)
 | ||
|  | #endif // defined(SERIAL_0_RTS_PORT) && defined(SERIAL_0_RTS_PIN)
 | ||
|  | 
 | ||
|  | #if defined(SERIAL_1_RTS_PORT_NAME) && defined(SERIAL_1_RTS_PIN_INDEX)
 | ||
|  | #define SERIAL_1_RTS_ENABLED
 | ||
|  | #define SERIAL_1_RTS_PORT (&SERIAL_1_RTS_PORT_NAME)
 | ||
|  | #define SERIAL_1_RTS_PIN _BV(SERIAL_1_RTS_PIN_INDEX)
 | ||
|  | #endif // defined(SERIAL_1_RTS_PORT) && defined(SERIAL_1_RTS_PIN)
 | ||
|  | 
 | ||
|  | #if defined(SERIAL_0_CTS_PORT_NAME) && defined(SERIAL_0_CTS_PIN_INDEX)
 | ||
|  | #define SERIAL_0_CTS_ENABLED
 | ||
|  | #define SERIAL_0_CTS_PORT (&SERIAL_0_CTS_PORT_NAME)
 | ||
|  | #define SERIAL_0_CTS_PIN _BV(SERIAL_0_CTS_PIN_INDEX)
 | ||
|  | #endif // defined(SERIAL_0_CTS_PORT) && defined(SERIAL_0_CTS_PIN)
 | ||
|  | 
 | ||
|  | #if defined(SERIAL_1_CTS_PORT_NAME) && defined(SERIAL_1_CTS_PIN_INDEX)
 | ||
|  | #define SERIAL_1_CTS_ENABLED
 | ||
|  | #define SERIAL_1_CTS_PORT (&SERIAL_1_CTS_PORT_NAME)
 | ||
|  | #define SERIAL_1_CTS_PIN _BV(SERIAL_1_CTS_PIN_INDEX)
 | ||
|  | #endif // defined(SERIAL_1_CTS_PORT) && defined(SERIAL_1_CTS_PIN)
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif // Arduino_h
 | ||
|  | 
 | ||
|  | 
 |