5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: PPM接收机智能解码 [打印本页]

作者: 想飞的咸鱼    时间: 2007-7-14 22:39
标题: PPM接收机智能解码
前两天在网上找到一些用单片机解码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 编辑 ]
作者: 想飞的咸鱼    时间: 2007-7-14 22:43
; ==========================================================================
;                 RAM Variable Definitions  
;
    BYTE Flags  ; various boolean flags            
    BYTE PPMcount ; pulse length. 1~255 = 0.75~2.28mS  
    BYTE PPM_1  ; channel 1 in        
    BYTE PPM_2  ; channel 2 in
BYTE PPM_3  ; channel 3 in
BYTE PPM_4  ; channel 4 in
BYTE PWM_1  ; channel 1 out
BYTE PWM_2  ; channel 2 out
BYTE PWM_3  ; channel 3 out
BYTE PWM_4  ; channel 4 out
BYTE PMM_1  ; channel 1 memory
BYTE PMM_2  ; channel 2 memory
BYTE PMM_3  ; channel 3 memory
BYTE PMM_4  ; channel 4 memory
BYTE FLS_1  ; channel 1 failsafe
BYTE FLS_2  ; channel 2 failsafe      
BYTE FLS_3  ; channel 3 failsafe      
BYTE FLS_4  ; channel 4 failsafe      
BYTE GoodFrames ; No. of good frames to go before
      ; accepting failsafe frame.

BYTE HoldFrames ; No. of bad frames to go before going
      ; to failsafe
BYTE ArmFrames ; No. of low throttle frames to go
      ; before arming throttle.
BYTE Temp1
BYTE Temp2
BYTE DUMY_1

; flag values
;
#DEFINE WATCH 0  ; Watchdog timeout
#DEFINE GOT_FS 1  ; have captured failsafe frame
#DEFINE GOT_4 2  ; 4 channels found in current frame
#DEFINE DET_4 3  ; 4 channel TX detected
#DEFINE JR 4   ; JR throttle detected
#DEFINE ARMED 5  ; throttle armed
; number of consecutive good frames required at startup.
#DEFINE GOODCOUNT 10
; number of consecutive bad frames accepted without going to failsafe.
#DEFINE HOLDCOUNT 25
; number of consecutive low throttle frames required before arming.
#DEFINE ARMCOUNT 10

; macros for working with negative or positive shift
skip_PPM_high  MACRO
ifdef Negative_Shift
btfsc GPIO,PPM_in
else
btfss GPIO,PPM_in
endif
ENDM
skip_PPM_low   MACRO
ifdef Negative_Shift
btfss GPIO,PPM_in
else
btfsc GPIO,PPM_in
endif
ENDM
;****************************************************************************
;                                Code
;
ORG 0
goto ColdStart
;-------------------------- version string ----------------------------------
org 8  
ifdef __12C508
dt "RXDEC508"
endif
ifdef __12F629
dt "RXDEC629"
endif
ifdef __12F675
dt "RXDEC675"
endif
dt "--V"
dt version
dt "--"
ifdef ARM_THROTTLE
dt "ARMTHROT"
endif
ifdef DETECT_JR
dt "DETECTJR"
endif
ifdef Negative_Shift
dt "NEG_SHFT"
endif
;============================================================================
ColdStart:  
bcf Flags,WATCH
btfss STATUS,NOT_TO  ; copy Watchdog timeout flag
bsf Flags,WATCH
; get oscillator calibration value and use it to fine-tune clock frequency.
; 12C508/9 has value in W at startup, 12F629/75 gets it from RETLW at 0x3ff.
ifdef __12C508
ifdef NO_OSCCAL  
movlw 0x90   ; replace with value for your PIC!
endif
movwf OSCCAL   ; set oscillator calibration
else
bsf STATUS,RP0  ; register bank 1 (12F629/75)
call 0x3ff   ; get OSCCAL value
movwf OSCCAL   ; set oscillator calibration
        bcf STATUS, RP0  ; register bank 0
        endif
                     
ifdef __12C508
        clrwdt                    
        movlw OptionBits  
        OPTION                     
else
        clrwdt                    
bsf STATUS,RP0 ; register bank 1 (12F629/75)
        movlw OptionBits
        movwf OPTION_REG
bcf STATUS,RP0 ; register bank 0
        clrwdt
endif

; initialise I/O registers
        clrf GPIO  ; all outputs low
        movlw TrisBits
ifdef __12C508
        TRIS    GPIO  ; set I/O pin directions
else
bsf STATUS,RP0   ; register bank 1 (12F629/75)
        movwf TRISIO  ; set I/O pin directions
ifdef ANSEL
clrf ANSEL   ; disable analog inputs (12F675)
endif
bcf STATUS,RP0  ; register bank 0
movlw b'00000111'        
        movwf CMCON   ; Comparator off
endif
; CPU specific stuff done, now we can start the main program!
        goto Main  
                                      
;----------------------------------------------------------------------------
; GetPPM:             Get time to next PPM pulse
;----------------------------------------------------------------------------
;
; input: PPM signal has just gone high.
; output: PPMcount = Pulse Width * 6uS, next pulse has started
; error: PPMcount = XX and error code in W.
;
; Error Codes
;  0 = good channel
;  1 = pulse too short, too long, or next pulse too soon
;  2 = no next pulse (ie. no channel)
PRECHARGE = ((750-15)/6)  ; = 0.75mS
GetPPM:
  movlw PRECHARGE ; preset count for signal high length
  movwf PPMcount
  movlw (30/6)
  movwf Temp1
high_delay: NO_OP 2
  decf PPMcount ; wait 30uS to skip short glitches
  decfsz Temp1
  goto high_delay  
hiloop:
  skip_PPM_high  ; signal gone low ?
  goto pulselo
  nop   ; 6uS per loop
  decfsz PPMcount ; count down
  goto hiloop
  retlw 1  ; timed out, signal high
pulselo:
  movlw PRECHARGE-(180/6)
  subwf PPMcount,W
  skpnc   ; less than minimum pulse width ?
  retlw 1
  movlw   PRECHARGE-(700/6)
  subwf   PPMcount,W
  skpc   ; greater than maximum pulse width ?
  retlw 1
  movlw (30/6)
  movwf Temp1
low_delay: NO_OP 2
  decf PPMcount ; wait 30uS to skip short glitches
  decfsz Temp1
  goto low_delay
to750uS:
  skip_PPM_low  ; signal should stay low until 0.75mS
  retlw 1
  nop   ; 6uS per loop
  decfsz  PPMcount ; count down to zero @ 0.75mS
  goto    to750uS
  incf PPMcount ; count up, start at 1
to2280uS:
  skip_PPM_low  ; start of next channel pulse ?
  retlw 0  ; return OK
  nop   ; 6uS per loop
  incfsz  PPMcount ; count up to 256 @ 2.28mS
  goto to2280uS
  retlw 2  ; return timeout error @ 2.28mS  


;------------------------------------------------------------------------------
;                   Output PPM widths to channels 1-4
;------------------------------------------------------------------------------
Output:  
  movf PWM_1,W  ; get pulse length
  bsf GPIO,CH_1  ; start pulse
  call Servo_Delay ; delay 6uS*len
  bcf GPIO,CH_1  ; finish pulse
  movf PWM_2,W
  bsf GPIO,CH_2
  call Servo_Delay
  bcf GPIO,CH_2
  movf PWM_3,W
  bsf GPIO,CH_3
  call Servo_Delay
  bcf GPIO,CH_3
  movf PWM_4,W
  bsf GPIO,CH_4
  call Servo_Delay
  bcf GPIO,CH_4
  retlw 0

;------------------------------------------------------------------------------
;                     Delay Timer for Output Pulse
;------------------------------------------------------------------------------
;
; input: W=delay count, 1 to 255 = 0.75 to 2.28mS
;
Servo_Delay:
  movwf Temp2
  movlw (750-6)/6
  movwf Temp1
_ds1:  nop
  clrwdt
  nop
  decfsz Temp1  ; wait 750uS  
  goto _ds1
_ds2:  nop
  clrwdt
  nop
  decfsz Temp2  ; wait 0~1.53mS, total = 0.75~2.28mS
  goto _ds2  
  retlw 0
作者: 想飞的咸鱼    时间: 2007-7-14 22:45
;-------------------------------------------------------------------------------
;                    Millisecond Delay Timer
;-------------------------------------------------------------------------------
; Input: W = number of milliseconds to wait (max 256mS)
;
dx1k:  movwf Temp1
_dx1k1:  movlw (1000-5)/5
  movwf Temp2
_dx1k2:  clrwdt   ; avoid watchdog timeout
  nop
  decfsz Temp2  ; wait 1mS
  goto _dx1k2
  decfsz Temp1  
  goto _dx1k1
  retlw 0

;*******************************************************************************
;       Main
;*******************************************************************************  

Main:  btfsc Flags,WATCH ; did the watchdog timeout ?
         goto    Failsafe ; oops! try to keep going ...
  clrf Flags  ; clear all flags
  movlw 250  ; wait 500mS for Rx to stabilise
  call dx1k  ; (signal LED is on)
  movlw 250
  call dx1k
Start:  bsf GPIO,LED ; signal LED off
  movlw (1500-750)/6   
  movwf PMM_1  
  movwf PMM_2  ; all channel outputs at midpoint  
  movwf PMM_3  
  movwf PMM_4            
  movwf PPM_4  ; init channel 4 (for 3 channel TX)
  movlw GOODCOUNT ; set number of good frames required
  movwf GoodFrames ; before saving failsafe values.
  movlw HOLDCOUNT ; set number of bad frames allowed
  movwf HoldFrames ; before going to failsafe.
  movlw ARMCOUNT ; set number of low throttle frames
  movwf ArmFrames ; before arming throttle
  goto no_signal

Failsafe: movlw 1
  movwf HoldFrames ; stay in failsafe until signal returns  
  btfss Flags,GOT_FS ; do we have good failsafe values?
  goto no_signal
  movf FLS_1,W
  movwf PWM_1  
  movf FLS_2,W  ; get failsafe values
  movwf PWM_2           
  movf FLS_3,W
  movwf PWM_3  
  movf FLS_4,W
  movwf PWM_4
  call Output  ; output failsafe frame
  bcf Flags,ARMED ; keep throttle OFF
  movlw ARMCOUNT
  movwf ArmFrames ; reset throttle arming delay
no_signal: bsf GPIO,LED ; signal LED off
  
wait_sync: clrwdt   ; we're still sane, no reset please!
  clrf Temp1
  movlw 9  ; set 'gap detect' timeout to 23mS
  movwf Temp2
  
wait_gap: skip_PPM_high  ; wait for a gap ]
  goto time_gap ;    ]
  nop   ;   ]
  clrwdt   ;   ]
  nop   ;   ] 10uS per loop
  decf Temp1  ;   ]
  skpnz   ;   ]
  decfsz Temp2  ; timed out ?  ]
  goto wait_gap ;   ]
  goto badframe ; can't find sync gap!   

time_gap: clrf PPMcount ; reset gap timer  
in_gap:  decf Temp1  ;   }
  skpnz   ;   }
  decf Temp2  ; timed out ?  }
  skpnz   ;   }
  goto badframe ; can't find sync gap! } 10uS per loop
  skip_PPM_low  ; still in gap ? }
  goto wait_gap ;    }
  incfsz PPMcount ; gap > 2.56mS ? }
  goto in_gap  ; no, continue timing }
Get_Frame: movlw 128-(23000/256) ; set frame timeout to 23mS
  movwf TMR0
wait_1st: clrwdt
  btfsc TMR0,7  ; timer reached 23mS ?
  goto badframe
  skip_PPM_high  ; wait for start of first channel
  goto wait_1st
  bcf     Flags,GOT_4 ; channel 4 not received yet
  NO_OP 3
  call GetPPM  ; get 1st channel
  andlw 255
  skpz      ; process return code
  goto badframe
  movf PPMcount,W
  movwf DUMY_1
  call GetPPM  ; get 2nd channel
  andlw 255
  skpz      ; process return code
  goto badframe
  movf PPMcount,W
  movwf DUMY_1
  call GetPPM  ; get 3rd channel
  andlw 255
  skpz      ; process return code
  goto badframe
  movf PPMcount,W
  movwf DUMY_1
  call GetPPM  ; get 4th channel
  andlw 255
  skpz      ; process return code
  goto badframe
  movf PPMcount,W
  movwf DUMY_1

  call GetPPM  ; get 5th channel
  andlw 255
  skpz       ; process return code
  goto badframe
  movf PPMcount,W
  movwf PPM_1
  call GetPPM  ; get 6th channel
  andlw 255
  skpz     
  goto badframe
  movf PPMcount,W
  movwf PPM_2
  call GetPPM  ; get 7th channel
  andlw 255
  skpz     
  goto badframe
  movf PPMcount,W
  movwf PPM_3
  call GetPPM  ; get 8th channel
  andlw 255
  skpz     
  goto error4
  movf PPMcount,W
  movwf PPM_4
  bsf Flags,GOT_4
  goto update
  
error4:
  xorlw 2
  skpz     ; channel 4 missing ?
  goto badframe
  btfss Flags,GOT_FS ; got failsafe frame yet ?
  goto update   ; no, ignore missing channel 4  
  btfss Flags,DET_4  ; 4 channels detected ?
  goto update   ; no, ignore missing channel 4

badframe: clrwdt
  movlw 128-((23000-9000)/256); timer reached 9mS ?
  subwf TMR0,w
  skpc   ; wait 9mS to skip other channels
  goto badframe
  movlw ARMCOUNT ; reset throttle arming delay
  movwf ArmFrames
  decfsz HoldFrames ; too many bad frames ?
  goto hold
  goto Failsafe
hold:
  btfsc Flags,GOT_FS ; good frame available for hold ?
  call Output  ; yes, output last good frame
  goto no_signal ; no, just stay silent
; Got a good frame. Output the averaged pulse widths of this frame
; and the last frame.
;
update:
  movf PPM_1,W
  addwf PMM_1  ; PWM out = average(this+last)   
  rrf  PMM_1,w
  movwf PWM_1  
  movf PPM_2,W
  addwf PMM_2
  rrf  PMM_2,w
  movwf PWM_2
  movf PPM_3,W
  addwf PMM_3
  rrf  PMM_3,w
  movwf PWM_3
  movf PPM_4,W
  addwf PMM_4
  rrf  PMM_4,w
  movwf PWM_4
  btfss Flags,GOT_FS ; no output until failsafe captured
  goto output_done
  ifdef ARM_THROTTLE
  btfsc Flags,ARMED ; throttle armed ?
  goto do_output ; yes
  movlw (1300-750)/6   
  btfsc Flags,JR
  subwf PWM_1,w  ; throttle < 1.3mS ?
  btfss Flags,JR
  subwf PWM_3,w
  skpc
  goto low_throttle ; yes
  movlw ARMCOUNT
  movwf ArmFrames ; no, reset arming delay
  goto disarm
low_throttle:
  decfsz ArmFrames ; got enough arming frames ?
  goto disarm
  bsf  Flags,ARMED ; yes, arm throttle now
  goto do_output
disarm:
  movf FLS_3,w
  btfss Flags,JR
  movwf PWM_3  ; set throttle to failsafe value
  movf FLS_1,w
  btfsc Flags,JR
  movwf PWM_1  
  endif ; ARM_THROTTLE
do_output:
  call  Output  ; output good frame
output_done:
  movf PPM_1,W  ; receive input_1-4
  movwf PMM_1  ; put to memery_1-4
  movf PPM_2,W  ; remember all frame
  movwf PMM_2
  movf PPM_3,W
  movwf PMM_3
  movf PPM_4,W
  movwf PMM_4
  movlw HOLDCOUNT ; reset failsafe timeout
  movwf HoldFrames
  bcf GPIO,LED ; signal LED on
  btfsc Flags,GOT_FS ; already got failsafe frame ?
  goto frame_done ; yes
  clrwdt
  decfsz GoodFrames ; got enough good frames ?
  goto frame_done ; no
; Got enough good frames, now get failsafe values
  btfsc Flags,GOT_4 ; channel 4 detected ?
  bsf  Flags,DET_4
  movf PWM_1,W
  movwf FLS_1  
  movf PWM_2,W
  movwf FLS_2           
  movf PWM_3,W  ; copy good output to failsafe  
  movwf FLS_3  
  movf PWM_4,W
  movwf FLS_4
  bsf  Flags,GOT_FS ; failsafe frame captured
;  ifdef ARM_THROTTLE
;  ifdef DETECT_JR
;  movlw (1300-750)/6
;  subwf FLS_1,w  ; channel 1 < 1.3mS ?
;  skpc
;  goto    jr_detected
;  movlw (1700-750)/6
;  subwf FLS_1,w  ; channel 1 >= 1.7mS ?
;  skpc
;  goto futaba
;  movlw (1100-750)/6 ; failsafe low throttle!
;  movwf FLS_1
;
;jr_detected: bsf Flags,JR ; JR throttle detected
;  goto arm
;  endif ; DETECT_JR
;
;futaba:  movlw (1700-750)/6
;  subwf FLS_3,w  ; channel 3 >= 1.7mS ?
;  skpc
;  goto arm
;  movlw (1100-750)/6 ; failsafe low throttle!
;  movwf FLS_3
;
;arm:  bsf Flags,ARMED ; arm throttle now
;
;  endif ; ARM_THROTTLE
frame_done: goto wait_sync ; wait for next frame

;---------- Oscillator Calibration Subroutine (12F629/75 only) --------------
  ifdef __12F675
  org 0x3ff
  retlw 0x90 ; replace with oscal value for your PIC!
  endif
  END
作者: wihm    时间: 2007-7-14 22:48
:em04: :em20: :em20:
作者: 王立刚    时间: 2007-7-14 23:17
:em04: :em04:
作者: su7651    时间: 2007-7-14 23:21
:em04:
作者: austin33    时间: 2007-7-14 23:26
深奥!!!!!!!!!!!!!!!!!!!!!!!!11:em25:
作者: ziyoudj    时间: 2007-7-15 01:31
一点没明白
作者: yqyqingyv    时间: 2007-7-15 03:41
这是啥呢
作者: 狐狸    时间: 2007-7-15 13:26
这个解码程序已经有不少人做成功过,在RCGROUP上有不少讨论,算是比较经典的解码程序;
相近的还有六通道的;
TOP2005这一类的通用编程器有时候烧写PIC会出问题,俺用过TOP的,还有MAX的都会有很多的废片,还是老老实实的买了个240元的PIC专用编程器,呵呵,这一两年只有几片废的,还是自己搞错插槽废的;建议楼主到PIC16上看看;
如果是试招,还是先不要用PIC12C508,直接用12F675或12F509替代,即使不对,也可以重新烧写程序;
注意下面这一段:
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
烧写程序时熔丝配置要与此相同,不然会没法使用的;
作者: hha888    时间: 2007-7-15 13:45
:em22: :em22:  太深了???????????

这是C语言?   还是汇遍啊??????
作者: 狐狸    时间: 2007-7-15 13:55
这个是汇编的,刚才试着编译了一下,通不过,一大堆错误提示,是不是楼主拷贝出错了?:em22: :em22:
作者: 狐狸    时间: 2007-7-15 14:13
果然楼主拷贝错误,呵呵,找到原来拷的,一次编译通过;
作者: shixiaoqiang    时间: 2007-7-15 14:34
高手,看不懂,但还是要假装懂,嘿嘿:em15:
作者: Jaken    时间: 2007-7-15 15:01
好...好长.....:em17:
作者: 小新    时间: 2007-7-15 15:40
用M8比PIC508好些吧:loveliness:
作者: 狐狸    时间: 2007-7-15 16:35
打蚊子何必用高射炮,楼上?嗬嗬:em16: :em15:
作者: djb    时间: 2007-7-15 17:04
改成AVR的就好了,看不懂PIC的,请能改成AVR的汇编,或者把完整的贴上来,看能不能改成用M8或者M16解码多通道.
作者: 想飞的咸鱼    时间: 2007-7-15 18:29
[quote]原帖由 狐狸 于 2007-7-15 13:26 发表
注意下面这一段:
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
烧写程序时熔丝配置要与此相同,不然会没法使用的;


果然有玄机啊  我再试试  谢谢狐狸啊
作者: 想飞的咸鱼    时间: 2007-7-15 20:46
狐狸帮忙看看着配置对不对   还有给我一个邮箱地址吧我把HEX文件发给你试一试看看行不行



作者: gale    时间: 2007-7-15 22:27
晕,这样求助啊
作者: 狐狸    时间: 2007-7-16 10:09
没错,你这个烧写软件是哪个软件?最好是用PIC专用的编成器,其他的好像要出问题;
作者: pt-26    时间: 2007-7-16 10:44
:em26:
作者: raker    时间: 2007-7-16 11:16
标题: 感谢楼主
这样代码也可以直接贴出来,非常感谢!
作者: 想飞的咸鱼    时间: 2007-7-16 12:35
这个烧写软件是TOP2005编程器带的  你用的PIC专用编程器是在PIC16买的吗 是哪个型号能告诉我吗 避免再次买错:loveliness:
作者: 狐狸    时间: 2007-7-16 13:37
下面的是楼主贴出来的程序编译出来的HEX文件:
:020000040000FA
:02000000280ACC
:10001000520858084408450843083508300838088D
:100020002D082D08560831082E0833082D082D08F4
:10003000410852084D085408480852084F0854080F
:100040004408450854084508430854084A0852081B
:1000500007048307070525000400C70C020066009B
:10006000C80C0600840A7A0C2800050C3C00380AEB
:10007000E800FC02370A6607410A0000E8023B0A72
:1000800001085C0C880003060108060C88000307C1
:100090000108050C3C004C0AE800FC024B0A66060D
:1000A00001080000E8024F0AA802660600080000E6
:1000B000E803550A02080D0206056C0906040E0243
:1000C00026056C0926040F0246056C094604100239
:1000D00086056C09860400083D007C0C3C0000008D
:1000E00004000000FC026F0A000004000000FD0292
:1000F000740A00083C00C70C3D0004000000FD022B
:100100007D0AFC027B0A00080706990A6700FA0CC0
:100110007A09FA0C7A09A6057D0C31003200330009
:1001200034002C000A0C3900190C3A000A0C3B0070
:10013000A90A010C3A002707A90A15022D00160288
:100140002E0017022F00180230005B09A7040A0CCA
:100150003B00A60504007C00090C3D006607B80AB8
:10016000000004000000FC004306FD02AE0AED0A98
:100170006800FC004306FD004306ED0A6606AE0A71
:10018000E803B90A270C21000400E106ED0A66071E
:10019000C40A4704CB0A00003309FF0E4307ED0AE7
:1001A000080229003309FF0E4307ED0A08022A005E
:1001B0003309FF0E4307ED0A08022B003309FF0E37
:1001C0004307E60A08022C004705FA0A020F430714
:1001D000ED0A2707FA0A6707FA0A04004A0C8100A9
:1001E0000307ED0A0A0C3B00FA02F70A990A2706F0
:1001F0005B09A90A0902F10111032D000A02F201AB
:1002000012032E000B02F30113032F000C02F40162
:10021000140330002707230BA706220B5B0C87066D
:100220008D0087078F000307180B0A0C3B001C0B7F
:10023000FB021C0BA705220B170287072F001502D4
:1002400087062D005B09090231000A0232000B0209
:1002500033000C023400190C3A00A6042706510B97
:100260000400F902510B470667050D0235000E0226
:1002700036000F0237001002380027055B0C95008E
:100280000307480B9E0C950003074A0B3A0C3500F8
:100290008705500B9E0C97000307500B3A0C370054
:0402A000A705AA0AFA
:021FFE00EE0FE4
:00000001FF

注意烧写时熔丝的选择:
MCLRE_OFF&_CP_OFF&_WDT_ON&_IntRC_OSC
这个东西俺作红外线遥控时试过,挺不错的;
作者: 想飞的咸鱼    时间: 2007-7-16 14:50
:em00: 谢谢狐狸兄啊    我再试试你给的代码若不行就买个专用编程器 喜欢上这玩意也中毒啊:em17:




欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://bbs.5imx.com/) Powered by Discuz! X3.3