だいぶ前から取り組んでいた、受信機のプログラムですが、
何とかそれらしく動くプログラムになりました。
そんなに長いプログラムではないのですが、だいぶ苦戦しました
上手く動かなかった理由もちょっと良くわかっていないので、危ない物です。
(その後理由が判明して、対策を行いました)
センサのチェックも1回しかやっていませんので、まだまだ未完成ですが
(その後前回のデーターと比べて平均化しています、信号が安定しました)
ソフトループだけでやっていますので、10F系への移植も簡単だと思います。
(なんとか256ワードに収まったので10F200にも大丈夫だと思います)
スロットルが9段階、ラダーが17段階ですが、それらしく動きます。
PWM周期は、結構早くて、4KHzくらいになっているはずです。
フローチャートですが見えませんよね、右の表は、命令を自分なりに、種類別に分けてみた表です、これを見ながらこつこつと作りました。(暗~~


これまた大変恥ずかしながら、ソースです
メインループは、1ワードでもケチってやろうと書きましたので大変判りにくくなっています
PICマイコンで作るインドアプレーン教科書の92Pのフローチャートにやや似ていますが、詳細はだいぶ変っています。
; ; 赤外線受信機プログラム ; モーターは9段階 ラダーは17段階のPWM制御 ; ; 2007/11/20 T.kobara ; ; _____ ____ ; VDD+ 1[| '-' |]8 -GND ; ラダーLへ 2[| 12f629 |]7 ラダーRへ ; 並列出力 3[| |]6 並列出力 ; センサーイン 4[|__________|]5 モーターFETへ ; ; ; LIST P=12F629 INCLUDE P12F629.INC CB = _CPD_OFF ;データEEPROMもプログラム・メモリも CB &= _CP_OFF ;コード・プロテクトしない。 CB &= _BODEN_OFF ;ブラウンアウト・リセットを使わない。 CB &= _MCLRE_OFF ;MCLRリセットを使わない。 CB &= _PWRTE_ON ;パワーアップ・タイマを使う。 CB &= _WDT_ON ;ウォッチドッグ・タイマを使う。 CB &= _INTRC_OSC_NOCLKOUT ;内部発振器を使う。 __CONFIG CB C1 equ 20h ;カウンター C2 equ 21h ;カウンター上位 MF equ 22h ;前回センサレベルフラグ RC equ 23h ;ループ カウンタ CH equ 24h ;チャンネル カウンタ PWM equ 25h ;pwm カウンタ SM equ 26h ;スロットルメイン RM equ 27h ;ラダー R メイン LM equ 28h ;ラダー L メイン SS equ 29h ;スロットルサブ RS equ 2Ah ;ラダー R サブ LS equ 2Bh ;ラダー L サブ OUT equ 2Ch ;出力バッファ CH1 equ 2Dh ;ラダーデータ CH3 equ 2Eh ;スロットルデータ org 0 ;電源onスタート bsf STATUS,RP0 ;バンク 1 にする。 call 3FFh movwf OSCCAL ;内部発信校正値の書き込み movlw b'00001000' ;入出力ポートの設定GP3のみ入力 movwf TRISIO ;他は出力設定 bcf STATUS,RP0 ;バンク 0 にする。 movlw b'00000111' ;GP0~GP2までのコンパレータ解除 movwf CMCON movLw b'00001110' ;WDTプリスケーラ18ms×64=1.15s movwf OPTION_REG ;//////////////////////////////////////////////////////////// ;メインルーチン MAIN clrf GPIO ;出力ポートクリア clrf MF ;前回レベルフラグ 00 clrf RC ;ループ カウンタ 00 clrf CH ;チャンネルカウンタ 00 movlw d'8' movwf PWM ;pwm カウンタ 8 clrf SM ;スロットルメイン 00 clrf RM ;ラダー R メイン 00 clrf LM ;ラダー L メイン 00 clrf SS ;スロットルサブ 00 clrf RS ;ラダー R サブ 00 clrf LS ;ラダー L サブ 00 clrf OUT ;出力バッファ 00 clrf CH1 ;ラダーデータ 00 clrf CH3 ;スロットルデータ 00 MJ2 btfss GPIO,3 ;入力LOならループ goto LOOP movlw d'250' movwf C2 ;カウンタ250セット MJ1 btfss GPIO,3 ;入力LOならループ goto MJ2 nop nop nop ;10us×250回=2.5ms nop nop decfsz C2,F ;C2-1=0なら先頭ブランク発見 goto MJ1 goto LOOP ;LOOP IN ;//////////////////////////////////////////////////////////// MJ3 btfsc MF,0 ;前回レベルフラグ0か? goto MJ7 ;1なら立下りエッジ処理へ clrf MF ;MF←00 MJ4 clrwdt ;WDT クリア incf RC,F ;ループカウントUP ;出力処理 MJ10 decfsz PWM,F ;PWM0でないならMJ5へ goto MJ5 movf SM,W movwf SS ;0なら movf RM,W ;各サブにセット movwf RS movf LM,W movwf LS movlw d'8' movwf PWM ;PWM カウンタ 8 MJ6 clrf OUT rrf RS,W rlf OUT,F ;5 各bitのセット rrf RS,F rlf OUT,F ;4 rlf OUT,F ;3 rrf SS,F rlf OUT,F ;2 各bitのセット rrf LS,W rlf OUT,F ;1 rrf LS,F rlf OUT,F ;0 movf OUT,W movwf GPIO ;OUTデータをポートに出力 ;ループ入り口 LOOP btfss GPIO,3 ;入力 LO ならMJ3へ goto MJ3 ;LO の処理ルーチンへ bsf MF,0 ;MF←01 btfss RC,7 ;RC 128 以上ならMJ4へ goto MJ4 ;出力処理へ clrf CH ;チャンネルカウンタ クリア goto MJ10 ;出力処理ルーチンへ MJ5 nop nop nop ;時間あわせ nop nop goto MJ6 ;立下りエッジ処理 MJ7 btfsc CH,2 ;CHの2bit 1ならMJ80へ goto MJ80 btfss CH,0 ;CHの0bit 0ならMJ80へ goto MJ80 btfsc CH,1 ;CHの1bit 1ならMJ9へ goto MJ9 movf RC,W ;前回RCとの平均化 addwf CH1,F ; bcf STATUS,C ;(CH1+RC)÷2→CH1 rrf CH1,F ; movlw d'10' ; subwf CH1,W ;CH1-10=W andlw b'00111111' ;3Fhでマスク0~64 call GETLM ;PWMパターン取得 xorlw b'11111111' ;パターンの逆転 movwf RM ;パターン格納 movlw d'20' ; subwf CH1,W ;CH1-20=W andlw b'00111111' ;3Fhでマスク0~64 call GETLM ;PWMパターン取得 movwf LM ;パターン格納 MJ80 clrf RC ;ループカウンタ 00 clrf MF ;前回レベルフラグ00 incf CH,F ;CH+1→CH goto MJ10 MJ9 movf RC,W ;前回RCとの平均化 addwf CH3,F ; bcf STATUS,C ;(CH3+RC)÷2→CH3 rrf CH3,F ; movlw d'6' ; subwf CH3,W ;CH3-6=W andlw b'00111111' ;3Fhでマスク0~64 call GETSM ;PWMパターン取得 movwf SM ;パターン格納 goto MJ80 ;///////////////////////////////////////////////////////////// GETSM addwf PCL,F ;プログラムカウンタにWデータ加算 retlw b'00000000' ;0 retlw b'00000000' ;1 retlw b'00000000' ;2 retlw b'00000000' ;3 retlw b'00000000' ;4 retlw b'00000000' ;5 retlw b'00000000' ;6 retlw b'00000000' ;7 retlw b'00000000' ;8 retlw b'00000000' ;9 retlw b'00000000' ;10 retlw b'00000000' ;11 retlw b'00000000' ;12 retlw b'00000000' ;13 retlw b'00000000' ;14 retlw b'00000000' ;15 retlw b'00000000' ;16 retlw b'00000000' ;17 retlw b'00000000' ;18 retlw b'00000000' ;19 retlw b'00000000' ;20 retlw b'00000000' ;21 retlw b'00000000' ;22 retlw b'00000000' ;23 retlw b'00000000' ;24 retlw b'00000001' ;25 retlw b'00000001' ;26 retlw b'00000011' ;27 retlw b'00000011' ;28 retlw b'00000111' ;29 retlw b'00000111' ;30 retlw b'00001111' ;31 retlw b'00001111' ;32 retlw b'00011111' ;33 retlw b'00011111' ;34 retlw b'00111111' ;35 retlw b'00111111' ;36 retlw b'01111111' ;37 retlw b'01111111' ;38 retlw b'11111111' ;39 retlw b'11111111' ;40 retlw b'11111111' ;41 retlw b'11111111' ;42 retlw b'11111111' ;43 retlw b'11111111' ;44 retlw b'11111111' ;45 retlw b'11111111' ;46 retlw b'11111111' ;47 retlw b'11111111' ;48 retlw b'11111111' ;49 retlw b'11111111' ;50 retlw b'11111111' ;51 retlw b'11111111' ;52 retlw b'11111111' ;53 retlw b'11111111' ;54 retlw b'11111111' ;55 retlw b'11111111' ;56 retlw b'11111111' ;57 retlw b'11111111' ;58 retlw b'11111111' ;59 retlw b'11111111' ;60 retlw b'11111111' ;61 retlw b'11111111' ;62 retlw b'11111111' ;63 retlw b'11111111' ;64 retlw b'11111111' ;65 ;///////////////////////////////////////////////////////////// GETLM addwf PCL,F ;プログラムカウンタにWデータ加算 retlw b'00000000' ;0 retlw b'00000000' ;1 retlw b'00000000' ;2 retlw b'00000000' ;3 retlw b'00000000' ;4 retlw b'00000000' ;5 retlw b'00000000' ;6 retlw b'00000000' ;7 retlw b'00000000' ;8 retlw b'00000000' ;9 retlw b'00000000' ;10 retlw b'00000000' ;11 retlw b'00000000' ;12 retlw b'00000000' ;13 retlw b'00000000' ;14 retlw b'00000000' ;15 retlw b'00000000' ;16 retlw b'00000000' ;17 retlw b'00000000' ;18 retlw b'00000000' ;19 retlw b'00000000' ;20 retlw b'00000000' ;21 retlw b'00000000' ;22 retlw b'00000000' ;23 retlw b'00000000' ;24 retlw b'00000000' ;25 retlw b'00000000' ;26 retlw b'00000000' ;27 retlw b'00000000' ;28 retlw b'00000001' ;29 retlw b'00000011' ;30 retlw b'00000111' ;31 retlw b'00001111' ;32 retlw b'00011111' ;33 retlw b'00111111' ;34 retlw b'01111111' ;35 retlw b'11111111' ;36 retlw b'11111111' ;37 retlw b'11111111' ;38 retlw b'11111111' ;39 retlw b'11111111' ;40 retlw b'11111111' ;41 retlw b'11111111' ;42 retlw b'11111111' ;43 retlw b'11111111' ;44 retlw b'11111111' ;45 retlw b'11111111' ;46 retlw b'11111111' ;47 retlw b'11111111' ;48 retlw b'11111111' ;49 retlw b'11111111' ;50 retlw b'11111111' ;51 retlw b'11111111' ;52 retlw b'11111111' ;53 retlw b'11111111' ;54 retlw b'11111111' ;55 retlw b'11111111' ;56 retlw b'11111111' ;57 retlw b'11111111' ;58 retlw b'11111111' ;59 retlw b'11111111' ;60 retlw b'11111111' ;61 retlw b'11111111' ;62 retlw b'11111111' ;63 retlw b'11111111' ;64 retlw b'11111111' ;65 ;///////////////////////////////////////////////////////////// end
追記(fujinawaさんが言っていたスロットルの下の方で全速で回ると言う不具合を直しました)
センサの信号の前回との比較を行っています
テーブルを64用意して広い範囲のスロットル位置に対応しました。