Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 1397 → Rev 1398

/RC-Expander/branches/MX16s_10Ch_V1.0/MX12 Expander 1.2sp/main.c
File deleted
/RC-Expander/branches/MX16s_10Ch_V1.0/MX12 Expander 1.2sp/MX12_expander__V1_2sp.hex
File deleted
/RC-Expander/branches/MX16s_10Ch_V1.0/MX12 Expander 1.2sp/main.h
File deleted
/RC-Expander/branches/MX16s_10Ch_V1.0/MX12 Expander 1.2sp/MX12-Erweiterung.pnproj
File deleted
\ No newline at end of file
/RC-Expander/branches/MX16s_10Ch_V1.0/MX12 Expander 1.2sp/makefile
File deleted
/RC-Expander/branches/MX16s_10Ch_V1.0/MX12_Expander1.3/main.h
File deleted
/RC-Expander/branches/MX16s_10Ch_V1.0/MX12_Expander1.3/MX12-Erweiterung.pnproj
File deleted
\ No newline at end of file
/RC-Expander/branches/MX16s_10Ch_V1.0/MX12_Expander1.3/makefile
File deleted
/RC-Expander/branches/MX16s_10Ch_V1.0/MX12_Expander1.3/MX12_extender__V1_3.hex
File deleted
/RC-Expander/branches/MX16s_10Ch_V1.0/MX12_Expander1.3/MX12-Erweiterung.pnps
File deleted
\ No newline at end of file
/RC-Expander/branches/MX16s_10Ch_V1.0/MX12_Expander1.3/main.c
File deleted
/RC-Expander/branches/MX16s_10Ch_V1.0/_make.bat
0,0 → 1,21
set PATH=D:\Projekte\Atmel_AVR\_Tools\GCC\WinAVR-20100110_V4.3.3\bin;%PATH%
 
del *.elf
del *.hex
 
@rem -> compile and link
avr-gcc -Os -Wall -mmcu=attiny44a -DF_CPU=8000000 -o main.elf main.c
 
@rem -> generate program hex file
avr-objcopy -O ihex main.elf main.hex
 
@rem -> display program size
avr-size main.hex
 
@rem -Os optimization level (optimize for size)
@rem -Wall show all warnings
@rem -mmcu=attiny44a generate code for ATtiny44a
@rem -DF_CPU=8000000 CPU-Frequenz 8.0 MHz
@rem -o output file name
 
pause
/RC-Expander/branches/MX16s_10Ch_V1.0/main.c
0,0 → 1,212
/*------------------------------------------------------------------------------
** Ident : main.c **
** Project : MX16s 8->10 ppm channel expander **
** Author : lakeroe **
** Description : main module **
** Copyright (c) : 12.2011 lakeroe **
** Original code and idea : Jacques Wanders **
** http://forum.mikrokopter.de/topic-4405.html **
** http://forum.mikrokopter.de/topic-4556.html **
**----------------------------------------------------------------------------**
** Release : v1.0 initial release **
** Date : 25-12-2011 **
**----------------------------------------------------------------------------**
** The use of this project (hardware, software, binary files, sources and **
** documentation) is only permittet for non-commercial use **
** (directly or indirectly) **
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. **
------------------------------------------------------------------------------*/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include "main.h"
 
enum
{
stPPM_SYNC,
stPPM_SYNC_WAIT,
stPPM_CHANNEL_START,
stPPM_CHANNEL_DATA,
stPPM_CHANNEL_9_DATA,
stPPM_CHANNEL_10_START,
stPPM_CHANNEL_10_DATA,
stPPM_FINISH_PULSE,
stPPM_FRAME_END
};
 
unsigned char channel_number = 0;
unsigned char ppm_state = stPPM_SYNC;
 
// timer1_capture_interrupt (void)
// Synchronise PPM frame and copy input events to PPM_OUT, start mixing Ch9,10 data when detect start pulse of Ch9
ISR (TIM1_CAPT_vect)
{
cli (); // disable interrupts
unsigned int data;
 
switch (ppm_state)
{
case stPPM_SYNC: // detect rising edge pulse
data = ICR1; // get timer value after input capture
SET_COUNTER_TO_ZERO;
FALLING_EDGE_TRIGGER;
if(data >= MIN_SYNC_TIME && data <= MAX_SYNC_TIME) // valid sync trigger
{
SET_PPM_OUT_HIGH;
ppm_state = stPPM_CHANNEL_DATA; // next state: get data
channel_number = 0;
}
else // trigger but not a valid sync time
{
SET_PPM_OUT_LOW;
ppm_state = stPPM_SYNC_WAIT; // next state: wait for next sync event
}
break;
 
case stPPM_SYNC_WAIT: // detect falling edge pulse
SET_PPM_OUT_LOW; // not nessecery, output should already be low
SET_COUNTER_TO_ZERO;
SET_CAPTURE_COUNTER_TO_ZERO;
RISING_EDGE_TRIGGER;
ppm_state = stPPM_SYNC; // next state: try again for new sync
break;
 
case stPPM_CHANNEL_START: // detect rising edge pulse
SET_COUNTER_TO_ZERO;
SET_PPM_OUT_HIGH;
FALLING_EDGE_TRIGGER;
channel_number++; // prepare for next MX16s channel clock
if(channel_number>7) // all eight channels read
{
SET_COUNTER_TO_ZERO;
SET_PPM_OUT_HIGH;
SET_TIMER_TO_COMPA_CTC;
DISABLE_INPUT_CAPTURE;
ENABLE_OUTPUT_COMPARE;
OCR1A = START_PULSE; // startpulse length 0.4ms
TRIGGER_INPUT_COMPARE_INTERRUPT;
ppm_state = stPPM_CHANNEL_9_DATA; // 9th. channel but now self created
channel_number = 0;
}
else
ppm_state = stPPM_CHANNEL_DATA;
break;
 
case stPPM_CHANNEL_DATA: // detect falling edge pulse
SET_COUNTER_TO_ZERO;
SET_PPM_OUT_LOW;
RISING_EDGE_TRIGGER;
ppm_state = stPPM_CHANNEL_START; // wait for next channel rising edge pulse
break;
 
default:
SET_PPM_OUT_LOW; // not nessecery, output should already be low
SET_COUNTER_TO_ZERO;
SET_CAPTURE_COUNTER_TO_ZERO;
RISING_EDGE_TRIGGER;
ppm_state = stPPM_SYNC; // next state: try again for new sync
break;
}
sei ();
}
 
// timer1_compare_interrupt (void)
// Mixing channel 9,10 data into ppm out, start input capture for frame synchronisation
ISR (TIM1_COMPA_vect)
{
cli ();
switch (ppm_state)
{
case stPPM_CHANNEL_9_DATA:
SET_PPM_OUT_LOW;
SET_COUNTER_TO_ZERO;
if (PINA & (1 << CHANNEL_9)) // Channel 9 on/off
OCR1A = PPM_PULSE_MAX - START_PULSE;
else
OCR1A = PPM_PULSE_MIN - START_PULSE;
// set OCR1A between [PPM_PULSE_MIN-START_PULSE] and [PPM_PULSE_MAX-START_PULSE] for transmitting analog value
ppm_state = stPPM_CHANNEL_10_START; // next State
break;
 
case stPPM_CHANNEL_10_START:
SET_PPM_OUT_HIGH;
SET_COUNTER_TO_ZERO;
OCR1A = START_PULSE; // startpulse length 0.4ms
ppm_state = stPPM_CHANNEL_10_DATA; // next State
break;
 
case stPPM_CHANNEL_10_DATA:
SET_PPM_OUT_LOW;
SET_COUNTER_TO_ZERO;
if (PINA & (1 << CHANNEL_10)) // Channel 10 on/off
OCR1A = PPM_PULSE_MAX - START_PULSE;
else
OCR1A = PPM_PULSE_MIN - START_PULSE;
// set OCR1A between [PPM_PULSE_MIN-START_PULSE] and [PPM_PULSE_MAX-START_PULSE] for transmitting analog value
ppm_state = stPPM_FINISH_PULSE; // next State
break;
 
case stPPM_FINISH_PULSE: // create last pulse
SET_PPM_OUT_HIGH;
SET_COUNTER_TO_ZERO;
OCR1A = START_PULSE; // startpulse length 0.4ms
ppm_state = stPPM_FRAME_END; // next State
break;
 
case stPPM_FRAME_END:
default:
SET_PPM_OUT_LOW;
RISING_EDGE_TRIGGER;
DISABLE_OUTPUT_COMPARE;
ENABLE_INPUT_CAPTURE;
SET_TIMER_TO_COMPA_CTC;
SET_COUNTER_TO_ZERO;
SET_COMPARE_COUNTER_TO_ZERO;
SET_CAPTURE_COUNTER_TO_ZERO;
ppm_state = stPPM_SYNC; // next State
TRIGGER_INPUT_CAPTURE_INTERRUPT;
break;
}
sei ();
}
 
int main (void)
{
cli (); // disable interrupts
 
DDRA &= ~(1<<PPM_IN); // set Input Capture Pin as input
PORTA |= (1<<PPM_IN); // enable pullup
 
DDRB |= (1<<PPM_OUT_PIN); // configure PPM_OUT pin as output
SET_PPM_OUT_LOW; // set low
 
DDRA &= ~(1 << CHANNEL_9); // Channel 9 (Pin 10) input
PORTA |= (1 << CHANNEL_9); // enable pullup
 
DDRA &= ~(1 << CHANNEL_10); // Channel 10 (Pin 9) input
PORTA |= (1 << CHANNEL_10); // enable pullup
 
TCCR1A = ((0<<WGM11)|(0<<WGM10)); // CTC mode
TCCR1B = ((0<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10)); // CTC mode for COMPA, prescaler 8 / 8MHz => [1.0us]
 
CLEAR_INPUT_CAPTURE_INTERRUPT_FLAG; // reset ICF flag
SET_COUNTER_TO_ZERO;
SET_COMPARE_COUNTER_TO_ZERO;
ENABLE_INPUT_CAPTURE;
DISABLE_OUTPUT_COMPARE;
RISING_EDGE_TRIGGER;
 
sei (); // enable interrupts
 
while(1);
}
/RC-Expander/branches/MX16s_10Ch_V1.0/main.h
0,0 → 1,66
/*------------------------------------------------------------------------------
** Ident : main.h **
** Project : MX16s 8->10 ppm channel expander **
** Author : lakeroe **
** Copyright (c) : 12.2011 lakeroe **
** Original code and idea : Jacques Wanders **
** http://forum.mikrokopter.de/topic-4405.html **
** http://forum.mikrokopter.de/topic-4556.html **
**----------------------------------------------------------------------------**
** Release : v1.0 initial release **
** Date : 25-12-2011 **
**----------------------------------------------------------------------------**
** The use of this project (hardware, software, binary files, sources and **
** documentation) is only permittet for non-commercial use **
** (directly or indirectly) **
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. **
------------------------------------------------------------------------------*/
 
#define CHANNEL_9 PORTA3 // (Pin 10)
#define CHANNEL_10 PORTA4 // (Pin 9)
#define PPM_IN PORTA7 // (Pin 6)
#define PPM_OUT_PIN PORTB2 // (Pin 5)
 
#define START_PULSE 400 // [0.4ms]
 
#define PPM_PULSE_MIN 1000 // [1.0ms]
#define PPM_PULSE_MAX 2000 // [2.0ms]
 
#define MIN_SYNC_TIME 3000 // [3.0ms]
#define MAX_SYNC_TIME 22000 // total frame time - 8 x min channel frame time = 22ms - 8 x 1ms = 22 - 8
 
// minimum channel frame = START_PULSE_HIGH + START_PULSE_LOW = 400 + 600 counts = 1000 counts = 1ms
// PPM frame length = 22ms = 22000 counts
 
#define SET_PPM_OUT_HIGH PORTB |= (1<<PPM_OUT_PIN)
#define SET_PPM_OUT_LOW PORTB &= ~(1<<PPM_OUT_PIN)
 
#define FALLING_EDGE_TRIGGER TCCR1B &= ~(1<<ICES1)
#define RISING_EDGE_TRIGGER TCCR1B |= (1<<ICES1)
 
#define SET_COMPARE_COUNTER_TO_ZERO OCR1A = 0
#define SET_COUNTER_TO_ZERO TCNT1 = 0
#define SET_CAPTURE_COUNTER_TO_ZERO ICR1 = 0
 
#define DISABLE_INPUT_CAPTURE TIMSK1 &= ~(1<<ICIE1) // disable input capture
#define ENABLE_INPUT_CAPTURE TIMSK1 |= (1 << ICIE1) // enable input capture
 
#define DISABLE_OUTPUT_COMPARE TIMSK1 &= ~(1<<OCIE1A) // disable Output Compare A Match Interrupt
#define ENABLE_OUTPUT_COMPARE TIMSK1 |= (1<<OCIE1A) // enable Output Compare A Match Interrupt
 
#define TRIGGER_INPUT_CAPTURE_INTERRUPT TIFR1 |= (1<<ICF1) //
#define CLEAR_INPUT_CAPTURE_INTERRUPT_FLAG TIFR1 &= ~(1<<ICF1) // reset ICF flag
 
#define TRIGGER_INPUT_COMPARE_INTERRUPT TIFR1 |= (1<<OCF1A) //
 
#define SET_TIMER_TO_COMPA_CTC TCCR1B &= ~(1<<WGM13) // CTC mode for COMPA, prescaler 8 / 8MHz => [1.0us]
/RC-Expander/branches/MX16s_10Ch_V1.0/main.hex
0,0 → 1,34
:1000000010C01FC01EC01DC01CC01CC084C019C0B1
:1000100018C017C016C015C014C013C012C011C03C
:1000200010C011241FBECFE5D1E0DEBFCDBF10E070
:10003000A0E6B0E001C01D92A236B107E1F7CBD037
:10004000E2C0DECF1F920F920FB60F9211242F93B2
:100050003F938F939F93F89480916100813009F4CE
:1000600046C0813030F08230B1F0833009F03FC0BB
:1000700034C024B535B51DBC1CBC8EB58F7B8EBD80
:10008000285B3B4029533A4418F4C29A83E01EC0CF
:10009000C29881E029C01DBC1CBCC29A8EB58F7B62
:1000A0008EBD809160008F5F80936000883098F0F3
:1000B0001DBC1CBCC29A8EB58F7E8EBD6598619AA0
:1000C00080E991E09BBD8ABD599A84E080936100EC
:1000D0001092600016C083E007C01DBC1CBCC29813
:1000E0008EB580648EBD82E0809361000AC0C298A4
:1000F0001DBC1CBC15BC14BC8EB580648EBD10929A
:10010000610078949F918F913F912F910F900FBE36
:100110000F901F9018951F920F920FB60F921124F7
:100120008F939F93F894809161008530C1F0863061
:1001300018F48430B1F505C08630E1F0873089F5D8
:1001400027C0C2981DBC1CBCCB9B03C080E496E0BA
:1001500002C088E592E09BBD8ABD85E008C0C29AD6
:100160001DBC1CBC80E991E09BBD8ABD86E08093EC
:10017000610029C0C2981DBC1CBCCC9B03C080E49C
:1001800096E002C088E592E09BBD8ABD87E0EFCF94
:10019000C29A1DBC1CBC80E991E09BBD8ABD88E071
:1001A000E6CFC2988EB580648EBD6198659A8EB593
:1001B0008F7E8EBD1DBC1CBC1BBC1ABC15BC14BCE8
:1001C000109261005D9A78949F918F910F900FBE6D
:1001D0000F901F901895F894D798DF9ABA9AC29802
:1001E000D398DB9AD498DC9A1FBC8AE08EBD5D98C8
:1001F0001DBC1CBC1BBC1ABC659A61988EB5806482
:0A0200008EBD7894FFCFF894FFCF75
:00000001FF