From ef5441df09b2f0a560370e8ad7cd98093afd425f Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 1 Jun 2012 18:49:03 +0000 Subject: [PATCH 1/6] PPM frame > 32.5ms From 4711ca4c914094eaa6e1314c0f2bd6e4a9042028 Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 1 Jun 2012 19:46:00 +0000 Subject: [PATCH 2/6] PPM frame should now go up to 42ms --- src/model_menus.cpp | 2 +- src/pulses_arm.cpp | 4 ++-- src/pulses_avr.cpp | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 977060a28..e7d62ba19 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -769,7 +769,7 @@ void menuProcModel(uint8_t event) if(attr && (s_editMode>0 || p1valdiff)) { switch (m_posHorz) { case 0: - CHECK_INCDEC_MODELVAR(event, g_model.ppmFrameLength, -20, 20); + CHECK_INCDEC_MODELVAR(event, g_model.ppmFrameLength, -20, 39); break; case 1: CHECK_INCDEC_MODELVAR(event, g_model.ppmDelay, -4, 10); diff --git a/src/pulses_arm.cpp b/src/pulses_arm.cpp index 6e7164b41..1a92d819c 100644 --- a/src/pulses_arm.cpp +++ b/src/pulses_arm.cpp @@ -159,8 +159,8 @@ void setupPulsesPPM() // Don't enable interrupts through here else pwmptr->PWM_CH_NUM[3].PWM_CMR &= ~0x00000200 ; // CPOL - uint16_t rest = 22500u * 2; //Minimum Framelen=22.5 ms - rest += (int16_t(g_model.ppmFrameLength)) * 1000; + uint32_t rest = 22500u * 2; //Minimum Framelen=22.5 ms + rest += (int32_t(g_model.ppmFrameLength)) * 1000; for (uint32_t i = 0; i < p; i++) { //NUM_CHNOUT int16_t v = limit((int16_t)-PPM_range, g_chans512[i], (int16_t)PPM_range) + 2*PPM_CENTER; rest -= (v); diff --git a/src/pulses_avr.cpp b/src/pulses_avr.cpp index 24f39c73a..cd661522d 100644 --- a/src/pulses_avr.cpp +++ b/src/pulses_avr.cpp @@ -206,8 +206,8 @@ FORCEINLINE void setupPulsesPPM() uint16_t *ptr = (uint16_t *)pulses2MHz; uint8_t p = 8+(g_model.ppmNCH*2); // channels count uint16_t q = (g_model.ppmDelay*50+300)*2; //Stoplen *2 - uint16_t rest = 22500u*2-q; //Minimum Framelen=22.5 ms - rest += (int16_t(g_model.ppmFrameLength))*1000; + uint32_t rest = 22500u*2-q; // Minimum Framelen=22.5 ms + 10000 to avoid int32_t in the next line + rest += (int32_t(g_model.ppmFrameLength))*1000; for (uint8_t i=0; i Date: Fri, 1 Jun 2012 19:53:44 +0000 Subject: [PATCH 3/6] One comment removed, as it doesn't help too much :) --- src/pulses_avr.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/pulses_avr.cpp b/src/pulses_avr.cpp index cd661522d..180f99228 100644 --- a/src/pulses_avr.cpp +++ b/src/pulses_avr.cpp @@ -200,9 +200,6 @@ FORCEINLINE void setupPulsesPPM() //each pulse is 0.7..1.7ms long with a 0.3ms stop tail //The pulse ISR is 2mhz that's why everything is multiplied by 2 - // G: Found the following reference at th9x. The below code does not seem - // to produce quite exactly this, to my eye. *shrug* - // http://www.aerodesign.de/peter/2000/PCM/frame_ppm.gif uint16_t *ptr = (uint16_t *)pulses2MHz; uint8_t p = 8+(g_model.ppmNCH*2); // channels count uint16_t q = (g_model.ppmDelay*50+300)*2; //Stoplen *2 From 57fb4d41f3d0f44f678c27061ee60dcd79bdbb63 Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 1 Jun 2012 20:47:44 +0000 Subject: [PATCH 4/6] 200bytes flash saved in pulses --- src/pulses_avr.cpp | 79 ++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 48 deletions(-) diff --git a/src/pulses_avr.cpp b/src/pulses_avr.cpp index 180f99228..b8cddf352 100644 --- a/src/pulses_avr.cpp +++ b/src/pulses_avr.cpp @@ -46,6 +46,8 @@ uint8_t s_current_protocol = 255; uint8_t s_pulses_paused = 0; +uint16_t B3_comp_value; + #ifdef DSM2_SERIAL inline void DSM2_EnableTXD(void) { @@ -56,7 +58,6 @@ inline void DSM2_EnableTXD(void) void set_timer3_capture( void ) ; void set_timer3_ppm( void ) ; -void setupPulsesPPM16( uint8_t proto ) ; void startPulses() { @@ -192,36 +193,48 @@ ISR(TIMER1_COMPA_vect) //2MHz pulse generation #endif -FORCEINLINE void setupPulsesPPM() +void setupPulsesPPM(uint8_t proto) { int16_t PPM_range = g_model.extendedLimits ? 640*2 : 512*2; //range of 0.7..1.7msec //Total frame length = 22.5msec //each pulse is 0.7..1.7ms long with a 0.3ms stop tail //The pulse ISR is 2mhz that's why everything is multiplied by 2 - - uint16_t *ptr = (uint16_t *)pulses2MHz; - uint8_t p = 8+(g_model.ppmNCH*2); // channels count - uint16_t q = (g_model.ppmDelay*50+300)*2; //Stoplen *2 - uint32_t rest = 22500u*2-q; // Minimum Framelen=22.5 ms + 10000 to avoid int32_t in the next line + uint16_t *ptr = (proto == PROTO_PPM ? (uint16_t *)pulses2MHz : (uint16_t *) &pulses2MHz[PULSES_SIZE/2]); + uint8_t p = (proto == PROTO_PPM16 ? 16 : 8) + (g_model.ppmNCH * 2); //Channels *2 + uint16_t q = (g_model.ppmDelay*50+300)*2; // Stoplen *2 + uint32_t rest = 22500u*2 - q; // Minimum Framelen=22.5ms rest += (int32_t(g_model.ppmFrameLength))*1000; - for (uint8_t i=0; i Date: Fri, 1 Jun 2012 20:59:32 +0000 Subject: [PATCH 5/6] 40ms instead of 42ms is enough --- src/model_menus.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/model_menus.cpp b/src/model_menus.cpp index e7d62ba19..a56b90e8f 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -769,7 +769,7 @@ void menuProcModel(uint8_t event) if(attr && (s_editMode>0 || p1valdiff)) { switch (m_posHorz) { case 0: - CHECK_INCDEC_MODELVAR(event, g_model.ppmFrameLength, -20, 39); + CHECK_INCDEC_MODELVAR(event, g_model.ppmFrameLength, -20, 35); break; case 1: CHECK_INCDEC_MODELVAR(event, g_model.ppmDelay, -4, 10); From 1d430c129671c9176592a45481fad297ce2627b2 Mon Sep 17 00:00:00 2001 From: bsongis Date: Wed, 6 Jun 2012 15:44:43 +0000 Subject: [PATCH 6/6] Byte saving in PPM pulses (thanks Paul!) --- src/pulses_avr.cpp | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/pulses_avr.cpp b/src/pulses_avr.cpp index b8cddf352..5c6b97b3e 100644 --- a/src/pulses_avr.cpp +++ b/src/pulses_avr.cpp @@ -159,7 +159,7 @@ ISR(TIMER1_COMPA_vect) //2MHz pulse generation pulses2MHzRPtr += sizeof(uint16_t); if (*((uint16_t*)pulses2MHzRPtr) == 0) { - pulsePol = !g_model.pulsePol; + pulsePol = g_model.pulsePol; #if defined(PCBV4) TIMSK1 &= ~(1<