前两天在网上找到一些用单片机解码PPM接收机的资料和程序 文章介绍说程序包括正
负波参数, 油门动作侦测, 以及讯号保留及断讯过时回正位. "正负波参数" 也就是可以
支援 JR 及 Futaba 系统, "油门动作侦测" 防止开机
时发射机油门没有归回低位而发生危险 (包括 JR CH-1 and Futaba CH-3). "讯号保留"
為防止讯号不良或瞬间被干扰, 保留前一组完整之讯号, 也可以避免 SERVO 抖动. "断讯
过时回正位" 就是飞行安全模式, 一段时间没有讯号, 所有 SERVO 回正, 油门关到底..
...不错吧 ! PIC IC 体积又小, 线路又简单, 在他的 12C508/9 还加上一组 LED, 显示是否
工作且有接收到正常讯号
我试着做了一个但没成功 现把程序放上来请懂的哥们看看 本人电子硬件方面还过得去
软件一窍不通啊 我用的编程器是TOP2005 单片机用过贴片12C508A 插脚12F508 12F509
是不是单片机一定要12C508或12C509呀 我查了资料12C508A比12C508容量大点其他一样啊
不会上附件 先复制ASM文件上来 HEX文件也有
;***************************************************************************
; rxdecode.asm Pulse Position Modulation Decoder for 4 Channel Rx
;***************************************************************************
; Bruce Abbott bhabbott@paradise.net.nz
;
; for Microchip PIC 12C508, 12C509, 12F629 or 12F675.
;
;============================= Description =================================
;
; PPM DECODER:
;
; Each frame consists of 4 to 8 channels (5 to 9 pulses), followed by a sync
; gap. We only decode the first 4 channels.
;
; The width of each channel is 1 to 2mS (1.5mS when sticks centered). The
; sync gap is at least 2.5mS long, and frame length is approximately 20mS.
;
; The input signal should look something like this:-
;
; |<------------------ 1 frame (~20mS) -------------------->|
; |< 1~2mS >|
; _ _ _ _ _ _
; ___________| |_______| |______| |______| |______| |__ // ____________| |____
; sync gap ch1 ch2 ch3 ch4 etc. sync gap ch1
;
; NOTE: This waveform shows positive 'shift'. If your Rx outputs negative
; 'shift', the waveform is inverted.
;
; There is just enough time to generate four decoded outputs after receiving
; channel 4, and before the end of the sync gap.
;
; GLITCH FILTER:
;
; Each channel is averaged with the value from the previous frame, reducing
; servo jitter on weak signals. If any channel in a frame is corrupted, the
; whole frame is discarded and the last good frame is used instead.
;
; FAILSAFE:
;
; On receiving a sufficient number of good frames we save it for failsafe.
; Then, if the signal is corrupted for too long, we output the failsafe frame
; instead of the last good frame.
;
; THROTTLE ARMING:
;
; When entering failsafe the throttle is cut, and it will not be restarted
; until a good signal is detected AND the throttle is manually reset. This
; should prevent the situation where motor-induced RF interference causes
; the decoder to cycle in and out of failsafe repeatedly.
;
; For this feature to work the throttle channel has to be determined. Futaba
; and Hitec tranmitters assign the throttle to channel 3. JR, Airtronics and
; GWS use channel 1.
;
; Some ESC's need to have the throttle set to maximum at startup, perhaps to
; disable the brake or to enter programming mode. Therefore, channel 1 is
; designated as throttle if it measures less than 1.3mS or more than 1.7mS at
; startup, otherwise channel 3 is assumed.
;
; The throttle channel is forced to 1.05mS during failsafe, rather than set
; to its failsafe value, in case that value was full throttle!
;
; =============================================================================
; Summary of Changes
;
; 2003/12/2 V0.5 - Initial release
;
; 2003/12/27 V0.6 - ASM Error if 'addwf PCL' not in page 0.
; - Select processor via MPLab's Device Select menu.
; 2004/1/7 V0.7 - No output until failsafe frame captured. Should now be
; compatible with JR/GWS transmitters (throttle on CH1).
;
; 2004/1/9 V0.8 - Increased range to 0.75~2.28mS, now accepts >125% throws.
; Resolution is slightly reduced (from 5uS to 6uS).
; - Failsafe and Hold frames now use averaged output values.
; - Ignore missing 4th channel (for 3 channel TX) NOT TESTED!
;
; 2004/2/15 V0.9 - Fixed bug:- OSCCAL not initialized in 12F675 code!
; - Detect throttle channel. The throttle is held OFF after
; failsafe, until re-armed manually. This prevents cyling
; into and out of failsafe due to electrical noise coming
; from the motor.
;
; 2004/6/20 V1.0 - Using TMR0 to detect loss of signal. This prevents lockup
; during a clean signal loss (no noise) which may occur if
; used in a receiver which has muting.
; - TMR0 is also used to set frame repeat time in failsafe.
; - Fixed bug:- Initial channel output values were wrong.
;
; 2004/10/24 V1.1 - Positive and Negative shift versions.
; - Ignore short glitches on signal transitions.
; - Ensure throttle is low in failsafe, even if it was maxiumum
; at startup (possible requirement for ESC programming).
;
; 2004/12/12 V1.2 - Fixed bug: JR throttle arming was disabled due to a typo!
;
; 2005/1/20 V1.3 - Now accepts pulse widths from 180uS to 700uS.
;
; 2005/11/16 V1.4 - Change channels to 5 - 8. by Y.C.Tseng
; disable the ARM_THROTTLE and DETECT_JR
;
; -----------------------------------------------------------------------------
;#DEFINE ARM_THROTTLE ; enable if throttle arming control wanted.
;#DEFINE DETECT_JR ; enable for JR/Airtronics/GWS throttle detection.
#DEFINE version "1.4"
#DEFINE Negative_Shift ; enable for Futaba/Hitec on 72MHz
; Make sure that PROCESSOR and <include> file are compatible with your CPU!
; 12C508(A) and 12C509(A) can use 12C508 definitions. 12F629 can use 12F675
; definitions (just don't try to use the A/D module...)
;#DEFINE __12C508 ; enable if processor not specified elsewhere
;#DEFINE __12F675 ; (MPLAB:- use menu <Configure/Select_Device>)
;#DEFINE NO_OSCCAL ; enable if OSCCAL value was erased!
ifdef __12C508
PROCESSOR PIC12C508
INCLUDE <P12C508.inc>
__CONFIG _MCLRE_OFF&_CP_OFF&_WDT_ON&_IntRC_OSC
else
PROCESSOR PIC12F675
INCLUDE <P12F675.inc>
__CONFIG _MCLRE_OFF&_CP_OFF&_WDT_ON&_BODEN_ON&_INTRC_OSC_NOCLKOUT
endif
radix dec
errorlevel 0,-305,-302
; Bit definitions for the GPIO register and the TRIS register
#DEFINE CH_1 0 ; pin 7 Channel 5 output
#DEFINE CH_2 1 ; pin 6 Channel 6 output
#DEFINE CH_3 2 ; pin 5 Channel 7 output
#DEFINE PPM_in 3 ; pin 4 input pulse stream
#DEFINE CH_4 4 ; pin 3 Channel 8 Output
#DEFINE LED 5 ; pin 2 Signal Indicator LED
#DEFINE TrisBits H'FF'&~((1<<CH_1)|(1<<CH_2)|(1<<CH_3)|(1<<CH_4)|(1<<LED))
; Bits to be set with the OPTION instruction
; No wake up
; No weak pullups
; Timer 0 source internal
; Prescaler to Timer 0, divide by 256.
;
#DEFINE OptionBits B'11000111'
; =========================================================================
; Macro for generating short time delays
;
NO_OP MACRO count
NO_OP_COUNT SET count
WHILE NO_OP_COUNT>1
goto $+1 ; 2 clocks
NO_OP_COUNT SET NO_OP_COUNT-2
ENDW
IF NO_OP_COUNT
nop ; 1 clock
ENDIF
ENDM
;===========================================================================
; Macro to create offsets for variables in RAM
;
ifdef __12C508
ByteAddr SET 7
else
ByteAddr SET 32 ; user RAM starts here
endif
BYTE MACRO ByteName
ByteName EQU ByteAddr
ByteAddr SET ByteAddr+1
ENDM
[ 本帖最后由 想飞的咸鱼 于 2007-7-14 22:56 编辑 ] |