diff --git a/examples/osd/dual-rgbw-actor/Makefile b/examples/osd/dual-rgbw-actor/Makefile index 87efba905..1305e71b9 100644 --- a/examples/osd/dual-rgbw-actor/Makefile +++ b/examples/osd/dual-rgbw-actor/Makefile @@ -3,7 +3,7 @@ all: er-example-server # variable for this Makefile # configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) -WITH_COAP=13 +WITH_COAP=7 # for some platforms UIP_CONF_IPV6=1 diff --git a/examples/osd/dual-rgbw-actor/flash.sh b/examples/osd/dual-rgbw-actor/flash.sh index 060c0bb39..b91668634 100755 --- a/examples/osd/dual-rgbw-actor/flash.sh +++ b/examples/osd/dual-rgbw-actor/flash.sh @@ -1,2 +1,2 @@ #!/bin/bash -avrdude -V -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a +avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/dual-rgbw-actor/t4-servo-hardware.h b/examples/osd/dual-rgbw-actor/t4-servo-hardware.h index 98d3c01d7..65438f1af 100644 --- a/examples/osd/dual-rgbw-actor/t4-servo-hardware.h +++ b/examples/osd/dual-rgbw-actor/t4-servo-hardware.h @@ -35,14 +35,14 @@ static servo_channel_type servo_channels [] = { /* PORTx, DDRx, PINxn, PWM */ - {0x05, 0x04, PINB7, 0} // r -, {0x0E, 0x0D, PINE2, 0} // g -, {0x05, 0x04, PINB6, 0} // b -, {0x05, 0x04, PINB5, 0} // w -, {0x05, 0x04, PINB1, 0} // r -, {0x05, 0x04, PINB0, 0} // g -, {0x05, 0x04, PINB2, 0} // b -, {0x05, 0x04, PINB3, 0} // w + {0x05, 0x04, 1 << PINB7, 0} // r1 +, {0x0E, 0x0D, 1 << PINE2, 0} // g1 +, {0x05, 0x04, 1 << PINB6, 0} // b1 +, {0x05, 0x04, 1 << PINB5, 0} // w1 +, {0x05, 0x04, 1 << PINB1, 0} // r2 +, {0x05, 0x04, 1 << PINB0, 0} // g2 +, {0x05, 0x04, 1 << PINB2, 0} // b2 +, {0x05, 0x04, 1 << PINB3, 0} // w2 }; #endif diff --git a/examples/osd/dual-rgbw-actor/t4-servo-sensors.h b/examples/osd/dual-rgbw-actor/t4-servo-sensors.h deleted file mode 100644 index b07b5a677..000000000 --- a/examples/osd/dual-rgbw-actor/t4-servo-sensors.h +++ /dev/null @@ -1,78 +0,0 @@ -//os_fname_map// t4-servo-config:h:h -// Copyright (C) 2014 Marcus Priesch, All rights reserved -// In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at -// **************************************************************************** -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// **************************************************************************** -// -//++ -// Name -// t4-servo-config -// -// Purpose -// configuration for t4-servo -// -// Revision Dates -// 10-Mar-2014 (MPR) Creation -// ««revision-date»»··· -//-- - -#include - -#ifndef __T4_SERVO_CONFIG_H__ -#define __T4_SERVO_CONFIG_H__ 1 - -// timing: (X:pwm, _:zero) -// -// X_______________XXXXXXXXXXXXX_______________XXXXXXXXXXXXX -// -// |<------------->|<--------->|<------------->|<--------->| ... -// SERVO_OFFSET SERVO_MAX SERVO_OFFSET SERVO_MAX -// -// within SERVO_MAX you get the PWM set with servo_set (id, pwm) -// if you set SERVO_OFFSET to zero, you get a pwm from 0 to 100% duty cycle -// -// the period of the smallest tick is derived from the timer4 prescaler -// plus the ISR overhead. however, the latter one should be constant -// regardless of the pwm signal generated - -#define SERVO_OFFSET 0 -#define SERVO_MIN 0 -#define SERVO_MAX 255 - -// Counter value for timer 4 without any prescaler for a single tick -#define PWMFREQ 500 -#define T4_VALUE F_CPU/SERVO_MAX/PWMFREQ - -#define SERVO_COUNT 8 - -#define T4_SENSOR_NAME "Dual RGBW Led" - -#ifndef servo_channels_defined -#define servo_channels_defined -static servo_channel_type servo_channels [SERVO_COUNT] = -{ {0x0E, 0x0D, PINE2, 0} -, {0x0B, 0x0D, PINB7, 0} -, {0x0B, 0x0D, PINB6, 0} -, {0x0B, 0x0D, PINB5, 0} -, {0x0B, 0x0D, PINB0, 0} -, {0x0B, 0x0D, PINB1, 0} -, {0x0B, 0x0D, PINB2, 0} -, {0x0B, 0x0D, PINB3, 0} -}; -#endif -#endif - - diff --git a/platform/osd-merkur/dev/t4-servo-sensor.c b/platform/osd-merkur/dev/t4-servo-sensor.c index cbf82306c..a35b2de02 100644 --- a/platform/osd-merkur/dev/t4-servo-sensor.c +++ b/platform/osd-merkur/dev/t4-servo-sensor.c @@ -1,113 +1,101 @@ -/* -** Copyright (C) 2013 Marcus Priesch, All rights reserved -** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. Neither the name of the Institute nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND -** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -** SUCH DAMAGE. -** -**++ -** Name -** t4-servo-sensor -** -** Purpose -** Implements a sensor around t4servo.c -** -** -** Revision Dates -** 31-Mar-2013 (MPR) Creation -** ««revision-date»»··· -**-- -*/ - -#include "contiki.h" -#include "dev/t4-servo.h" -#include "dev/t4-servo-sensor.h" - -const struct sensors_sensor t4_servo_sensor; -static int status(int type); -static int enabled = 0; - -static int value (int channel) - { - if (channel >= SERVO_COUNT) - return -1; - else if (channel < 0) - return -2; - else - return t4_servo_get (channel); - } - -static int configure (int type, int c) // type, c: SENSORS_ACTIVE, 1 -> act. - // type, c: SENSORS_ACTIVE, 0 -> deact. - { - switch (type) - { - case SENSORS_ACTIVE : - if (c == 0) - { - t4_servo_off (); - } - else if (c == 1) - { - t4_servo_init (); - t4_servo_set_io (0, T4_SENSOR_1_PORT, T4_SENSOR_1_DDR, T4_SENSOR_1_PIN); - t4_servo_set_io (1, T4_SENSOR_2_PORT, T4_SENSOR_2_DDR, T4_SENSOR_2_PIN); - t4_servo_set_io (2, T4_SENSOR_3_PORT, T4_SENSOR_3_DDR, T4_SENSOR_3_PIN); - t4_servo_set_io (3, T4_SENSOR_4_PORT, T4_SENSOR_4_DDR, T4_SENSOR_4_PIN); - } - break; - - case 0 : - t4_servo_set (0, c); - break; - - case 1 : - t4_servo_set (1, c); - break; - - case 2 : - t4_servo_set (2, c); - break; - - case 3 : - t4_servo_set (3, c); - - default: - break; - } - return 0; - } - -static int status(int type) - { - switch (type) - { - case SENSORS_ACTIVE: - case SENSORS_READY: - return enabled; - } - return 0; - } - -SENSORS_SENSOR(t4_servo_sensor, T4_SENSOR_NAME, value, configure, status); +/* +** Copyright (C) 2013-2014 Marcus Priesch, All rights reserved +** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. Neither the name of the Institute nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +** SUCH DAMAGE. +** +**++ +** Name +** t4-servo-sensor +** +** Purpose +** Implements a sensor around t4servo.c +** +** +** Revision Dates +** 31-Mar-2013 (MPR) Creation +** 12-Mar-2014 (MPR) Factored to support configurable amount of pwm's +** ««revision-date»»··· +**-- +*/ + +#include "contiki.h" +#include "dev/t4-servo.h" +#include "dev/t4-servo-sensor.h" + +const struct sensors_sensor t4_servo_sensor; + +static int status(int type); +static int enabled = 0; + +static int value (int channel) + { + if (channel >= SERVO_COUNT) + return -1; + else if (channel < 0) + return -2; + else + return t4_servo_get (channel); + } + +static int configure (int type, int c) // type, c: SENSORS_ACTIVE, 1 -> act. + // type, c: SENSORS_ACTIVE, 0 -> deact. + { + switch (type) + { + case SENSORS_ACTIVE : + if (c == 0) + { + t4_servo_off (); + } + else if (c == 1) + { + t4_servo_init (); + } + break; + + default : + if (type >= SERVO_COUNT) + return -1; + else + t4_servo_set (type, c); + break; + + } + return 0; + } + +static int status(int type) + { + switch (type) + { + case SENSORS_ACTIVE: + case SENSORS_READY: + return enabled; + } + return 0; + } + +SENSORS_SENSOR(t4_servo_sensor, T4_SENSOR_NAME, value, configure, status); diff --git a/platform/osd-merkur/dev/t4-servo-sensor.h b/platform/osd-merkur/dev/t4-servo-sensor.h index bbbf22adf..099bb4c66 100644 --- a/platform/osd-merkur/dev/t4-servo-sensor.h +++ b/platform/osd-merkur/dev/t4-servo-sensor.h @@ -1,71 +1,52 @@ -/* -** Copyright (C) 2013 Marcus Priesch, All rights reserved -** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. Neither the name of the Institute nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND -** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -** SUCH DAMAGE. -** -**++ -** Name -** t4-servo-sensor -** -** Purpose -** Implements a sensor around t4servo.c -** -** -** Revision Dates -** 31-Mar-2013 (MPR) Creation -** ««revision-date»»··· -**-- -*/ - -#ifndef __T4_SERVO_SENSOR_H__ -#define __T4_SERVO_SENSOR_H__ - -#include "lib/sensors.h" - -extern const struct sensors_sensor t4_servo_sensor; - -#define T4_SENSOR_NAME "T4-Sensor" - -#define T4_SENSOR_1_PORT 0x0E -#define T4_SENSOR_1_DDR 0x0D -#define T4_SENSOR_1_PIN PINE4 - -#define T4_SENSOR_2_PORT 0x0E -#define T4_SENSOR_2_DDR 0x0D -#define T4_SENSOR_2_PIN PINE3 - -#define T4_SENSOR_3_PORT 0x0E -#define T4_SENSOR_3_DDR 0x0D -#define T4_SENSOR_3_PIN PINE5 - -#define T4_SENSOR_4_PORT 0x0E -#define T4_SENSOR_4_DDR 0x0D -#define T4_SENSOR_4_PIN PINE6 - -#endif /* __T4_SERVO_SENSOR_H__ */ - - - +/* +** Copyright (C) 2013-2014 Marcus Priesch, All rights reserved +** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. Neither the name of the Institute nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +** SUCH DAMAGE. +** +**++ +** Name +** t4-servo-sensor +** +** Purpose +** Implements a sensor around t4servo.c +** +** +** Revision Dates +** 31-Mar-2013 (MPR) Creation +** 12-Mar-2014 (MPR) Factored to support configurable amount of pwm's + ««revision-date»»··· +**-- +*/ + +#ifndef __T4_SERVO_SENSOR_H__ +#define __T4_SERVO_SENSOR_H__ + +#include "lib/sensors.h" +#include "t4-servo-config.h" + +extern const struct sensors_sensor t4_servo_sensor; + +#endif /* __T4_SERVO_SENSOR_H__ */ diff --git a/platform/osd-merkur/dev/t4-servo.c b/platform/osd-merkur/dev/t4-servo.c index 60a6b7027..45f74ad9b 100644 --- a/platform/osd-merkur/dev/t4-servo.c +++ b/platform/osd-merkur/dev/t4-servo.c @@ -1,150 +1,139 @@ -/* -** Copyright (C) 2013 Marcus Priesch, All rights reserved -** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. Neither the name of the Institute nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND -** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -** SUCH DAMAGE. -** -**++ -** Name -** t4-servo -** -** Purpose -** Implements software pwm on any portpins via timer 4 -** -** -** Revision Dates -** 31-Mar-2013 (MPR) Creation -** ��revision-date����� -**-- -*/ - -#include "t4-servo.h" -#include -#include -#include "led.h" - -static servo_channel_type servo_channels [SERVO_COUNT]; - -// timer 4: CTC OCR4A -#define WGM4 0x4 - -void t4_servo_init (void) -{ - unsigned char channel; - - for (channel = 0; channel < SERVO_COUNT; channel ++) - { - servo_channels [channel].duty = SERVO_MAX/2; - t4_servo_set_io (channel, DEFAULT_PORT, DEFAULT_DDR, DEFAULT_PIN); - } - - cli (); - TCCR4A = 0x00; - TCCR4A_struct.wgm4 = WGM4 & 0x3; - TCCR4B_struct.wgm4 = (WGM4 & 0xc) >> 2; - TCCR4B_struct.cs4 = 0x1; // No prescaler - TCCR4C = 0x00; - OCR4A = T4_VALUE; - TIMSK4_struct.ocie4a = 1; - sei(); -} - -void t4_servo_off (void) - { - TIMSK4_struct.ocie4a = 0; - } - -int t4_servo_set_io - ( unsigned char channel - , unsigned char port - , unsigned char ddr - , unsigned char pin - ) - { - if (channel >= SERVO_COUNT) - return -1; - - servo_channels [channel].port = port; - servo_channels [channel].ddr = ddr; - servo_channels [channel].pin = 1 << pin; - - _SFR_IO8 (ddr) |= pin; - - return 0; - } - -int t4_servo_get (unsigned int channel) - { - if (channel >= SERVO_COUNT) - return -1; - - return servo_channels [channel].duty; - } - -int t4_servo_set (unsigned int channel, unsigned int duty) - { - if (channel >= SERVO_COUNT) - return -1; - - if (duty > SERVO_MAX) - return -2; - - if (duty < SERVO_MIN) - return -3; - - servo_channels [channel].duty = duty; - return 0; - } - -ISR (TIMER4_COMPA_vect, ISR_NOBLOCK) - { - unsigned char channel; - static unsigned int tick_count = 0; - - cli (); - for (channel = 0; channel < SERVO_COUNT; channel ++) - { - if (tick_count < servo_channels [channel].duty) - { - // turn on - _SFR_IO8 (servo_channels [channel].ddr ) |= servo_channels [channel].pin; - _SFR_IO8 (servo_channels [channel].port) |= servo_channels [channel].pin; - } - else - { - // turn off - _SFR_IO8 (servo_channels [channel].port) &= ~(servo_channels [channel].pin); - _SFR_IO8 (servo_channels [channel].ddr ) |= servo_channels [channel].pin; - } - } - - tick_count ++; - - if (tick_count >= (SERVO_MAX + SERVO_OFFSET)) - { - tick_count = 0; - } - sei(); - } +/* +** Copyright (C) 2013-2014 Marcus Priesch, All rights reserved +** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. Neither the name of the Institute nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +** SUCH DAMAGE. +** +**++ +** Name +** t4-servo +** +** Purpose +** Implements software pwm on any portpins via timer 4 +** +** +** Revision Dates +** 31-Mar-2013 (MPR) Creation +** 12-Mar-2014 (MPR) Factored to support configurable amount of pwm's +** ««revision-date»»··· +**-- +*/ + +#include "t4-servo.h" +#include "t4-servo-config.h" +#include "t4-servo-hardware.h" +#include +#include + +// static servo_channel_type servo_channels [SERVO_COUNT]; + +// timer 4: CTC OCR4A +#define WGM4 0x4 + +void t4_servo_init (void) +{ + unsigned char channel; + + for (channel = 0; channel < SERVO_COUNT; channel ++) + { + _SFR_IO8 (servo_channels [channel].ddr ) |= servo_channels [channel].pin; + _SFR_IO8 (servo_channels [channel].port) &= ~(servo_channels [channel].pin); + } + + cli (); + TCCR4A = 0x00; + TCCR4A_struct.wgm4 = WGM4 & 0x3; + TCCR4B_struct.wgm4 = (WGM4 & 0xc) >> 2; + TCCR4B_struct.cs4 = 0x1; // No prescaler + TCCR4C = 0x00; + OCR4A = (T4_VALUE); + TIMSK4_struct.ocie4a = 1; + TIMSK4_struct.toie4 = 1; + sei(); +} + +void t4_servo_off (void) + { + TIMSK4_struct.toie4 = 0; + TIMSK4_struct.ocie4a = 0; + } + +int t4_servo_get (unsigned int channel) + { + if (channel >= SERVO_COUNT) + return -1; + //printf ("t4_servo_get: %d, %d\n", channel, servo_channels [channel].duty); + return servo_channels [channel].duty; + } + +int t4_servo_set (unsigned int channel, unsigned char duty) + { + //printf ("t4_servo_set: %d, %d\n", channel, duty); + + if (channel >= SERVO_COUNT) + return -1; + + if (duty > SERVO_MAX) + return -2; + + if (duty < SERVO_MIN) + return -3; + + servo_channels [channel].duty = duty; + return 0; + } + +ISR (TIMER4_COMPA_vect, ISR_NOBLOCK) + { + unsigned char channel; + static unsigned int tick_count = 0; + + cli (); + for (channel = 0; channel < SERVO_COUNT; channel ++) + { + if (tick_count < servo_channels [channel].duty) + { + // turn on +// _SFR_IO8 (servo_channels [channel].ddr ) |= servo_channels [channel].pin; + _SFR_IO8 (servo_channels [channel].port) |= servo_channels [channel].pin; + } + else + { + // turn off + _SFR_IO8 (servo_channels [channel].port) &= ~(servo_channels [channel].pin); +// _SFR_IO8 (servo_channels [channel].ddr ) |= servo_channels [channel].pin; + } + } + + tick_count ++; + + if (tick_count >= (SERVO_MAX + SERVO_OFFSET)) + { + tick_count = 0; + } + sei(); + + } + diff --git a/platform/osd-merkur/dev/t4-servo.h b/platform/osd-merkur/dev/t4-servo.h index 72334a088..5acdc4013 100644 --- a/platform/osd-merkur/dev/t4-servo.h +++ b/platform/osd-merkur/dev/t4-servo.h @@ -1,96 +1,61 @@ -/* -** Copyright (C) 2013 Marcus Priesch, All rights reserved -** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. Neither the name of the Institute nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND -** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -** SUCH DAMAGE. -** -**++ -** Name -** t4-servo -** -** Purpose -** Implements software pwm on any portpins via timer 4 -** -** -** Revision Dates -** 31-Mar-2013 (MPR) Creation -** ��revision-date����� -**-- -*/ - -#ifndef __T4_SERVO_H__ -#define __T4_SERVO_H__ - -// timing: (X:pwm, _:zero) -// -// X_______________XXXXXXXXXXXXX_______________XXXXXXXXXXXXX -// -// |<------------->|<--------->|<------------->|<--------->| ... -// SERVO_OFFSET SERVO_MAX SERVO_OFFSET SERVO_MAX -// -// within SERVO_MAX you get the PWM set with servo_set (id, pwm) -// if you set SERVO_OFFSET to zero, you get a pwm from 0 to 100% duty cycle -// -// the period of the smallest tick is derived from the timer4 prescaler -// plus the ISR overhead. however, the latter one should be constant -// regardless of the pwm signal generated - - -#define SERVO_OFFSET 256 -#define SERVO_MIN 16 -#define SERVO_MAX 32 - -// Counter value for timer 4 without any prescaler for a single tick -#define PWMFREQ 500 -#define T4_VALUE F_CPU/SERVO_MAX/PWMFREQ - -#define SERVO_COUNT 4 - -#define DEFAULT_PORT 0x0E -#define DEFAULT_PIN 1 -#define DEFAULT_DDR 0x0D - -typedef struct struct_servo_channel -{ - unsigned char port; - unsigned char pin; - unsigned char ddr; - unsigned char duty; -} servo_channel_type; - -void t4_servo_init(void); -void t4_servo_off(void); - -int t4_servo_get(unsigned int channel); -int t4_servo_set(unsigned int channel, unsigned int duty); - -int t4_servo_set_io - ( unsigned char channel - , unsigned char port - , unsigned char ddr - , unsigned char pin - ); - -#endif /* __T4_SERVO_H__ */ +/* +** Copyright (C) 2013-2014 Marcus Priesch, All rights reserved +** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. Neither the name of the Institute nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +** SUCH DAMAGE. +** +**++ +** Name +** t4-servo +** +** Purpose +** Implements software pwm on any portpins via timer 4 +** +** +** Revision Dates +** 31-Mar-2013 (MPR) Creation +** 12-Mar-2014 (MPR) Factored to support configurable amount of pwm's + ««revision-date»»··· +**-- +*/ + +#ifndef __T4_SERVO_H__ +#define __T4_SERVO_H__ + +typedef struct struct_servo_channel +{ + unsigned char port; + unsigned char ddr; + unsigned char pin; + unsigned char duty; +} servo_channel_type; + +void t4_servo_init(void); +void t4_servo_off(void); + +int t4_servo_get(unsigned int channel); +int t4_servo_set(unsigned int channel, unsigned char duty); + +#endif /* __T4_SERVO_H__ */