diff --git a/hardware/arduino/sam/libraries/Servo/Servo.h b/hardware/arduino/sam/libraries/Servo/Servo.h deleted file mode 100644 index 4fdaf9c18..000000000 --- a/hardware/arduino/sam/libraries/Servo/Servo.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 - Copyright (c) 2009 Michael Margolis. All right reserved. - - 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -/* - - A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. - The servos are pulsed in the background using the value most recently written using the write() method - - Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. - Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. - The sequence used to sieze timers is defined in timers.h - - The methods are: - - Servo - Class for manipulating servo motors connected to Arduino pins. - - attach(pin ) - Attaches a servo motor to an i/o pin. - attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds - default min is 544, max is 2400 - - write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) - writeMicroseconds() - Sets the servo pulse width in microseconds - read() - Gets the last written servo pulse width as an angle between 0 and 180. - readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) - attached() - Returns true if there is a servo attached. - detach() - Stops an attached servos from pulsing its i/o pin. - */ - -#ifndef Servo_h -#define Servo_h - -#include - -/* - * Defines for 16 bit timers used with Servo library - * - * If _useTimerX is defined then TimerX is a 16 bit timer on the current board - * timer16_Sequence_t enumerates the sequence that the timers should be allocated - * _Nbr_16timers indicates how many 16 bit timers are available. - */ - -// For SAM3X: -#define _useTimer1 -#define _useTimer2 -#define _useTimer3 -#define _useTimer4 -#define _useTimer5 - -/* - TC0, chan 0 => TC0_Handler - TC0, chan 1 => TC1_Handler - TC0, chan 2 => TC2_Handler - TC1, chan 0 => TC3_Handler - TC1, chan 1 => TC4_Handler - TC1, chan 2 => TC5_Handler - TC2, chan 0 => TC6_Handler - TC2, chan 1 => TC7_Handler - TC2, chan 2 => TC8_Handler - */ - -#if defined (_useTimer1) -#define TC_FOR_TIMER1 TC1 -#define CHANNEL_FOR_TIMER1 0 -#define ID_TC_FOR_TIMER1 ID_TC3 -#define IRQn_FOR_TIMER1 TC3_IRQn -#define HANDLER_FOR_TIMER1 TC3_Handler -#endif -#if defined (_useTimer2) -#define TC_FOR_TIMER2 TC1 -#define CHANNEL_FOR_TIMER2 1 -#define ID_TC_FOR_TIMER2 ID_TC4 -#define IRQn_FOR_TIMER2 TC4_IRQn -#define HANDLER_FOR_TIMER2 TC4_Handler -#endif -#if defined (_useTimer3) -#define TC_FOR_TIMER3 TC1 -#define CHANNEL_FOR_TIMER3 2 -#define ID_TC_FOR_TIMER3 ID_TC5 -#define IRQn_FOR_TIMER3 TC5_IRQn -#define HANDLER_FOR_TIMER3 TC5_Handler -#endif -#if defined (_useTimer4) -#define TC_FOR_TIMER4 TC0 -#define CHANNEL_FOR_TIMER4 2 -#define ID_TC_FOR_TIMER4 ID_TC2 -#define IRQn_FOR_TIMER4 TC2_IRQn -#define HANDLER_FOR_TIMER4 TC2_Handler -#endif -#if defined (_useTimer5) -#define TC_FOR_TIMER5 TC0 -#define CHANNEL_FOR_TIMER5 0 -#define ID_TC_FOR_TIMER5 ID_TC0 -#define IRQn_FOR_TIMER5 TC0_IRQn -#define HANDLER_FOR_TIMER5 TC0_Handler -#endif - -typedef enum { _timer1, _timer2, _timer3, _timer4, _timer5, _Nbr_16timers } timer16_Sequence_t ; - -#define Servo_VERSION 2 // software version of this library - -#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo (0.544ms) -#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo (2,4ms) -#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached (1.5ms) -#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds (20ms) - -#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer -#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER) - -#define INVALID_SERVO 255 // flag indicating an invalid servo index - -typedef struct { - uint8_t nbr :6 ; // a pin number from 0 to 63 - uint8_t isActive :1 ; // true if this channel is enabled, pin not pulsed if false -} ServoPin_t ; - -typedef struct { - ServoPin_t Pin; - volatile unsigned int ticks; -} servo_t; - -class Servo -{ -public: - Servo(); - uint8_t attach(int pin); // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure - uint8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes. - void detach(); - void write(int value); // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds - void writeMicroseconds(int value); // Write pulse width in microseconds - int read(); // returns current pulse width as an angle between 0 and 180 degrees - int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) - bool attached(); // return true if this servo is attached, otherwise false -private: - uint8_t servoIndex; // index into the channel data for this servo - int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH - int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH -}; - -#endif diff --git a/hardware/arduino/sam/libraries/Servo/examples/Knob/Knob.ino b/hardware/arduino/sam/libraries/Servo/examples/Knob/Knob.ino deleted file mode 100644 index 886e107f8..000000000 --- a/hardware/arduino/sam/libraries/Servo/examples/Knob/Knob.ino +++ /dev/null @@ -1,22 +0,0 @@ -// Controlling a servo position using a potentiometer (variable resistor) -// by Michal Rinott - -#include - -Servo myservo; // create servo object to control a servo - -int potpin = 0; // analog pin used to connect the potentiometer -int val; // variable to read the value from the analog pin - -void setup() -{ - myservo.attach(9); // attaches the servo on pin 9 to the servo object -} - -void loop() -{ - val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023) - val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180) - myservo.write(val); // sets the servo position according to the scaled value - delay(15); // waits for the servo to get there -} diff --git a/hardware/arduino/sam/libraries/Servo/examples/Sweep/Sweep.ino b/hardware/arduino/sam/libraries/Servo/examples/Sweep/Sweep.ino deleted file mode 100644 index fb326e7e7..000000000 --- a/hardware/arduino/sam/libraries/Servo/examples/Sweep/Sweep.ino +++ /dev/null @@ -1,31 +0,0 @@ -// Sweep -// by BARRAGAN -// This example code is in the public domain. - - -#include - -Servo myservo; // create servo object to control a servo - // a maximum of eight servo objects can be created - -int pos = 0; // variable to store the servo position - -void setup() -{ - myservo.attach(9); // attaches the servo on pin 9 to the servo object -} - - -void loop() -{ - for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees - { // in steps of 1 degree - myservo.write(pos); // tell servo to go to position in variable 'pos' - delay(15); // waits 15ms for the servo to reach the position - } - for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees - { - myservo.write(pos); // tell servo to go to position in variable 'pos' - delay(15); // waits 15ms for the servo to reach the position - } -} diff --git a/hardware/arduino/sam/libraries/Servo/keywords.txt b/hardware/arduino/sam/libraries/Servo/keywords.txt deleted file mode 100644 index ca5ba79e3..000000000 --- a/hardware/arduino/sam/libraries/Servo/keywords.txt +++ /dev/null @@ -1,24 +0,0 @@ -####################################### -# Syntax Coloring Map Servo -####################################### - -####################################### -# Datatypes (KEYWORD1) -####################################### - -Servo KEYWORD1 - -####################################### -# Methods and Functions (KEYWORD2) -####################################### -attach KEYWORD2 -detach KEYWORD2 -write KEYWORD2 -read KEYWORD2 -attached KEYWORD2 -writeMicroseconds KEYWORD2 -readMicroseconds KEYWORD2 - -####################################### -# Constants (LITERAL1) -####################################### diff --git a/hardware/arduino/avr/libraries/Servo/Servo.cpp b/libraries/Servo/arch/avr/Servo.cpp similarity index 86% rename from hardware/arduino/avr/libraries/Servo/Servo.cpp rename to libraries/Servo/arch/avr/Servo.cpp index a17ed34e1..e4801b97e 100644 --- a/hardware/arduino/avr/libraries/Servo/Servo.cpp +++ b/libraries/Servo/arch/avr/Servo.cpp @@ -17,31 +17,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -/* - - A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. - The servos are pulsed in the background using the value most recently written using the write() method - - Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. - Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. - - The methods are: - - Servo - Class for manipulating servo motors connected to Arduino pins. - - attach(pin ) - Attaches a servo motor to an i/o pin. - attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds - default min is 544, max is 2400 - - write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) - writeMicroseconds() - Sets the servo pulse width in microseconds - read() - Gets the last written servo pulse width as an angle between 0 and 180. - readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) - attached() - Returns true if there is a servo attached. - detach() - Stops an attached servos from pulsing its i/o pin. - -*/ - #include #include @@ -100,28 +75,28 @@ static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t #ifndef WIRING // Wiring pre-defines signal handlers so don't define any if compiling for the Wiring platform // Interrupt handlers for Arduino #if defined(_useTimer1) -ISR(TIMER1_COMPA_vect) +SIGNAL (TIMER1_COMPA_vect) { handle_interrupts(_timer1, &TCNT1, &OCR1A); } #endif #if defined(_useTimer3) -ISR(TIMER3_COMPA_vect) +SIGNAL (TIMER3_COMPA_vect) { handle_interrupts(_timer3, &TCNT3, &OCR3A); } #endif #if defined(_useTimer4) -ISR(TIMER4_COMPA_vect) +SIGNAL (TIMER4_COMPA_vect) { handle_interrupts(_timer4, &TCNT4, &OCR4A); } #endif #if defined(_useTimer5) -ISR(TIMER5_COMPA_vect) +SIGNAL (TIMER5_COMPA_vect) { handle_interrupts(_timer5, &TCNT5, &OCR5A); } @@ -335,3 +310,4 @@ bool Servo::attached() { return servos[this->servoIndex].Pin.isActive ; } + diff --git a/libraries/Servo/arch/avr/ServoTimers.h b/libraries/Servo/arch/avr/ServoTimers.h new file mode 100644 index 000000000..70cffff48 --- /dev/null +++ b/libraries/Servo/arch/avr/ServoTimers.h @@ -0,0 +1,59 @@ +/* + Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + Copyright (c) 2009 Michael Margolis. All right reserved. + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + * Defines for 16 bit timers used with Servo library + * + * If _useTimerX is defined then TimerX is a 16 bit timer on the current board + * timer16_Sequence_t enumerates the sequence that the timers should be allocated + * _Nbr_16timers indicates how many 16 bit timers are available. + */ + +/** + * AVR Only definitions + * -------------------- + */ + +// Say which 16 bit timers can be used and in what order +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define _useTimer5 +#define _useTimer1 +#define _useTimer3 +#define _useTimer4 +typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ; + +#elif defined(__AVR_ATmega32U4__) +#define _useTimer1 +typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ; + +#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) +#define _useTimer3 +#define _useTimer1 +typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ; + +#elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__) +#define _useTimer3 +#define _useTimer1 +typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ; + +#else // everything else +#define _useTimer1 +typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ; +#endif + diff --git a/hardware/arduino/sam/libraries/Servo/Servo.cpp b/libraries/Servo/arch/sam/Servo.cpp similarity index 86% rename from hardware/arduino/sam/libraries/Servo/Servo.cpp rename to libraries/Servo/arch/sam/Servo.cpp index 756e92662..dec911019 100644 --- a/hardware/arduino/sam/libraries/Servo/Servo.cpp +++ b/libraries/Servo/arch/sam/Servo.cpp @@ -1,5 +1,5 @@ /* - Servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + Servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers - Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. This library is free software; you can redistribute it and/or @@ -17,32 +17,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -/* - A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. - The servos are pulsed in the background using the value most recently written using the write() method - - Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. - Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. - - The methods are: - - Servo - Class for manipulating servo motors connected to Arduino pins. - - attach(pin ) - Attaches a servo motor to an i/o pin. - attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds - default min is 544, max is 2400 - - write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) - writeMicroseconds() - Sets the servo pulse width in microseconds - read() - Gets the last written servo pulse width as an angle between 0 and 180. - readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) - attached() - Returns true if there is a servo attached. - detach() - Stops an attached servos from pulsing its i/o pin. - -*/ - #include -#include "Servo.h" +#include #define usToTicks(_us) (( clockCyclesPerMicrosecond() * _us) / 32) // converts microseconds to tick #define ticksToUs(_ticks) (( (unsigned)_ticks * 32)/ clockCyclesPerMicrosecond() ) // converts from ticks back to microseconds @@ -306,5 +282,3 @@ bool Servo::attached() return servos[this->servoIndex].Pin.isActive; } - - diff --git a/libraries/Servo/arch/sam/ServoTimers.h b/libraries/Servo/arch/sam/ServoTimers.h new file mode 100644 index 000000000..a68ac52ef --- /dev/null +++ b/libraries/Servo/arch/sam/ServoTimers.h @@ -0,0 +1,89 @@ +/* + Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + Copyright (c) 2009 Michael Margolis. All right reserved. + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + * Defines for 16 bit timers used with Servo library + * + * If _useTimerX is defined then TimerX is a 16 bit timer on the current board + * timer16_Sequence_t enumerates the sequence that the timers should be allocated + * _Nbr_16timers indicates how many 16 bit timers are available. + */ + +/** + * SAM Only definitions + * -------------------- + */ + +// For SAM3X: +#define _useTimer1 +#define _useTimer2 +#define _useTimer3 +#define _useTimer4 +#define _useTimer5 + +/* + TC0, chan 0 => TC0_Handler + TC0, chan 1 => TC1_Handler + TC0, chan 2 => TC2_Handler + TC1, chan 0 => TC3_Handler + TC1, chan 1 => TC4_Handler + TC1, chan 2 => TC5_Handler + TC2, chan 0 => TC6_Handler + TC2, chan 1 => TC7_Handler + TC2, chan 2 => TC8_Handler + */ + +#if defined (_useTimer1) +#define TC_FOR_TIMER1 TC1 +#define CHANNEL_FOR_TIMER1 0 +#define ID_TC_FOR_TIMER1 ID_TC3 +#define IRQn_FOR_TIMER1 TC3_IRQn +#define HANDLER_FOR_TIMER1 TC3_Handler +#endif +#if defined (_useTimer2) +#define TC_FOR_TIMER2 TC1 +#define CHANNEL_FOR_TIMER2 1 +#define ID_TC_FOR_TIMER2 ID_TC4 +#define IRQn_FOR_TIMER2 TC4_IRQn +#define HANDLER_FOR_TIMER2 TC4_Handler +#endif +#if defined (_useTimer3) +#define TC_FOR_TIMER3 TC1 +#define CHANNEL_FOR_TIMER3 2 +#define ID_TC_FOR_TIMER3 ID_TC5 +#define IRQn_FOR_TIMER3 TC5_IRQn +#define HANDLER_FOR_TIMER3 TC5_Handler +#endif +#if defined (_useTimer4) +#define TC_FOR_TIMER4 TC0 +#define CHANNEL_FOR_TIMER4 2 +#define ID_TC_FOR_TIMER4 ID_TC2 +#define IRQn_FOR_TIMER4 TC2_IRQn +#define HANDLER_FOR_TIMER4 TC2_Handler +#endif +#if defined (_useTimer5) +#define TC_FOR_TIMER5 TC0 +#define CHANNEL_FOR_TIMER5 0 +#define ID_TC_FOR_TIMER5 ID_TC0 +#define IRQn_FOR_TIMER5 TC0_IRQn +#define HANDLER_FOR_TIMER5 TC0_Handler +#endif + +typedef enum { _timer1, _timer2, _timer3, _timer4, _timer5, _Nbr_16timers } timer16_Sequence_t ; + diff --git a/hardware/arduino/avr/libraries/Servo/examples/Knob/Knob.ino b/libraries/Servo/examples/Knob/Knob.ino similarity index 100% rename from hardware/arduino/avr/libraries/Servo/examples/Knob/Knob.ino rename to libraries/Servo/examples/Knob/Knob.ino diff --git a/hardware/arduino/avr/libraries/Servo/examples/Sweep/Sweep.ino b/libraries/Servo/examples/Sweep/Sweep.ino similarity index 100% rename from hardware/arduino/avr/libraries/Servo/examples/Sweep/Sweep.ino rename to libraries/Servo/examples/Sweep/Sweep.ino diff --git a/hardware/arduino/avr/libraries/Servo/keywords.txt b/libraries/Servo/keywords.txt similarity index 100% rename from hardware/arduino/avr/libraries/Servo/keywords.txt rename to libraries/Servo/keywords.txt diff --git a/libraries/Servo/library.properties b/libraries/Servo/library.properties new file mode 100644 index 000000000..72d8bf6fc --- /dev/null +++ b/libraries/Servo/library.properties @@ -0,0 +1,10 @@ +name=Servo +author=cmaglie +email=Cristian Maglie +sentence=Controls a lot of Servos. +paragraph=This library can control a great number of servos.
It makes careful use of timers: the library can control 12 servos with only 1 timer!
+url=http://github.com/cmaglie/Servo +architectures=avr,sam +version=1.0 +dependencies= +core-dependencies=arduino (>=1.5.0) diff --git a/hardware/arduino/avr/libraries/Servo/Servo.h b/libraries/Servo/src/Servo.h similarity index 63% rename from hardware/arduino/avr/libraries/Servo/Servo.h rename to libraries/Servo/src/Servo.h index 8168494c3..10e79a87e 100644 --- a/hardware/arduino/avr/libraries/Servo/Servo.h +++ b/libraries/Servo/src/Servo.h @@ -18,28 +18,31 @@ */ /* - - A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. - The servos are pulsed in the background using the value most recently written using the write() method + A servo is activated by creating an instance of the Servo class passing + the desired pin to the attach() method. + The servos are pulsed in the background using the value most recently + written using the write() method. - Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. - Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + Note that analogWrite of PWM on pins associated with the timer are + disabled when the first servo is attached. + Timers are seized as needed in groups of 12 servos - 24 servos use two + timers, 48 servos will use four. The sequence used to sieze timers is defined in timers.h The methods are: - Servo - Class for manipulating servo motors connected to Arduino pins. + Servo - Class for manipulating servo motors connected to Arduino pins. - attach(pin ) - Attaches a servo motor to an i/o pin. - attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds - default min is 544, max is 2400 + attach(pin ) - Attaches a servo motor to an i/o pin. + attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds + default min is 544, max is 2400 - write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) - writeMicroseconds() - Sets the servo pulse width in microseconds - read() - Gets the last written servo pulse width as an angle between 0 and 180. - readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) - attached() - Returns true if there is a servo attached. - detach() - Stops an attached servos from pulsing its i/o pin. + write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) + writeMicroseconds() - Sets the servo pulse width in microseconds + read() - Gets the last written servo pulse width as an angle between 0 and 180. + readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) + attached() - Returns true if there is a servo attached. + detach() - Stops an attached servos from pulsing its i/o pin. */ #ifndef Servo_h @@ -50,40 +53,15 @@ /* * Defines for 16 bit timers used with Servo library * - * If _useTimerX is defined then TimerX is a 16 bit timer on the curent board + * If _useTimerX is defined then TimerX is a 16 bit timer on the current board * timer16_Sequence_t enumerates the sequence that the timers should be allocated * _Nbr_16timers indicates how many 16 bit timers are available. - * */ -// Say which 16 bit timers can be used and in what order -#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) -#define _useTimer5 -#define _useTimer1 -#define _useTimer3 -#define _useTimer4 -typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ; +// Architecture specific include +#include -#elif defined(__AVR_ATmega32U4__) -#define _useTimer1 -typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ; - -#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) -#define _useTimer3 -#define _useTimer1 -typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ; - -#elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__) -#define _useTimer3 -#define _useTimer1 -typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ; - -#else // everything else -#define _useTimer1 -typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ; -#endif - -#define Servo_VERSION 2 // software version of this library +#define Servo_VERSION 2 // software version of this library #define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo #define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo @@ -102,7 +80,7 @@ typedef struct { typedef struct { ServoPin_t Pin; - unsigned int ticks; + volatile unsigned int ticks; } servo_t; class Servo