**2021年5月 壊れた***
キャブレター不調トラブルの調査中に絶縁用の袋から出していたのを忘れてエンジン始動により高電圧回路を短絡させたようでATMEGA328P がいかれた............テストは終了。
純正CDIにて復調しているがデジタルCDIが振動等も少ないので32bitCDIを本格的にテストする事に!!
**2021年5月 壊れた***
キャブレター不調トラブルの調査中に絶縁用の袋から出していたのを忘れてエンジン始動により高電圧回路を短絡させたようでATMEGA328P がいかれた............テストは終了。
純正CDIにて復調しているがデジタルCDIが振動等も少ないので32bitCDIを本格的にテストする事に!!
AC-CDI試作1
*SRX-6(1JK)専用
*ネット上では多くの方がデジタルCDIについて書かれていますので参考にさせていただきました。
*製作はデジタルAC-CDI 負圧センサーによる3Dマップで検討し試作
*電気、プログラムも素人が製作した物です、参考になるかはわかりません。
*回路図とソースは添付していますがもしも自作する方は自己責任で 当方では一切の責任を負いません。
*純正CDIと比べるとケッチンの発生が多いようだ、キャブの調整がしっかりできていないと余計発生。
ピックアップをHiとLow間違えるとエンジンと人間にダメージがでる。
1:SRX-6 CDIの調査
ピックアップパルス HiとLowと2回ある BTDC Hi35.5° Low 12 °
AC充電のCDIである。
コンパレーター入力のオシロスコープ図
上がHi35.5° 下がLow 12 °
負圧センサー電圧4bitグラフ
2:製作仕様
1、1チップマイコンによるデジタル制御
2.負圧値による3Dマップ 方式
3、ピックアップは純正パルス仕様
4、ツーリング主体の設定
3:部品選択
1、1チップマイコン Arduino NANO(AVR ATMEGA328P 16MHz)
CPU周辺回路を自作するのは大変なのとATMEGA328Pを買う程度で購入できる為。
(アマゾン等で販売している格安品使用)
基板が大きくなるが純正と比べれば小型化は可能。
2、負圧センサー バイク、自動車用マップセンサーが良い。
仕様が公開されていないので今回はMIS-2500-015V (秋月電子)を選択 耐温度が低い、耐ガソリン性能は不明。
4:回路検討回路図
電源部 Arduino NANOは3端子レギュレーター内蔵ですがノイズに強いと思われるDC-DCコンバーターを使用。
パルス入力はコンデンサーにて分離し2.5Vにプルアップ後ダイオードクランプにて電圧を制限しコンパレーター入力に、カップリングコンデンサー、ダイオード等部品は、手持ちの物を適当に使用している。
放電用コンデンサー ネットでは、フイルムタイプの使用が一般的ですがセラミックコンデンサーです。
容量の大きな物が無いので並列使用 充電は全波清流
基板はeagleにて作図し穴あけが楽なフェノール基盤を自家エッチングにて製作。
5:プログラム
プログラムの開発はarduinoIDEを使う予定だった各処理のオーバーヘッドが重く処理時間が不足した為に
Atmel Studioに変更しC言語にてベースを製作しシュミレートした所、関数のオーバーヘッドが重い。
レジスターの退避処理が多いのが原因と思われる、使用変数がさほど多くは無いのですべてレジスターに割り当て退避処理をほぼ無くしてアッセンブラーにて製作。
プログラムは機能設定後Lowパルス割込み待ち(立下り)にて始動待ち
**立ち上がりに変更(ケッチン対策)**
始動後はHiパルスにてタイマースタートし回転数を計算 バキューム値はループ内で最大値を記憶しマップ選択
Hiパルスにてバキューム値はクリヤー,タイマーオバーフローの割込みにてエンストを判断し各データークリヤー開始位置に戻る。
各処理は関数化せずフローにそって製作(フラッシュの容量は十分ある)
点火マップは停止時のみUSB経由のCOM通信にて専用アプリで書込み編集、電源はUSBより供給しEEPROMに保存。
*始動時はキックスタートを容易にする為、点火タイミング 約BTDC10° 8回点火後通常運転に移行する。
Arduino NANO及びATMEGA328P等はネットに情報がたくさんあるのでここでは書きません。
割り算の処理はとても重い処理になるためビットシフトで処理しているので設定値が0.7°、AD値も8bitを4bitにシフトしている。
点火マップもそれほど細かく設定する必要が無いと思います。*2Dマップでも普通に動いているので
ツーリングに高回転域まで使用する事はほとんど無い為、6500rpm以上は即時点火としている。
試作基板 車体にはビニール袋に入れ工具入れのスペースに入れてテスト。
のちに裏面に高圧コンデンサーを追加し容量を倍にしている。
アセンブラーソース
;修正が反映されていない事がある為ソースの使用は自己責任で使用の事、当方は、責任を持ちません!
; AC_CDI.asm
;テスト運転中のプログラム
;ATmega328P 16MHz
;コンパイラー Atmel Studio 7.0
; Created: 2019/5/26
;バキューム圧レンジ 4bit
;高負荷 4以下 5,6 7,8 9 10 パーシャル11以上 5~10走行負荷範囲
;起動時MAPをEEPROMよりSRAMにコピーして作成
;マップ変更は停止時のみUSB接続にて変更
; **********************************
; R E G I S T E R S
; **********************************
;r0,r1 mul等計算使用
.def STATUP = r2 ;スタートUP
.def T1_stat = r3 ;TCCR1B 定数:0x3 (64分周)スタート
.def run = r4 ;回転中 1 0=初回
.def delay_T = r5 ;イグニッション Onパルス
.def tim1val_Lo = r6 ;回転数計算 T1
.def tim1val_Hi = r7
.def vacuumdat = r8 ;吸気圧最低値 BTDC_36 clr
.def rvacuumdat = r9 ;吸気圧AD
.def TIM1_COMPA_dat= r10 ;TIM1_COMPA
.def INT1_dat = r11 ;INT1_dat
.def angle1_Lo = r12 ;1度パルス
.def angle1_Hi = r13
.def delay_pulse_Lo = r14 ;遅延パルス
.def delay_pulse_Hi = r15
;.def = r16 ;計算等使用
;.def = r17 ;計算等使用
.def USART_LOW= r18
.def USART_HI= r19
.def div_tep_L = r20
.def div_tep_H = r21
.def Control_Flag = r22 ;フラッグ
.def vofset = r23 ;マップテーブルオフセット
.def MAPAD_Lo = r24 ;マップアドレス
.def MAPAD_Hi = r25
;.def EEPROM_AD_Lo = r26
;.def EEPROM_AD_Hi = r27
;.def INT0_dat = r28 INT0_dat
;.def = r29 ;TIM1_COMPA使用
;.def = r30 タイマー1モニター用
;.def = r31 タイマー1モニター用
; **********************************
; S R A M
; **********************************
;
.dseg
map_address: .BYTE 500 ;マップ変数領域宣言BYTE擬似命令
;TIM1_val: .BYTE 2 ;タイマー1変数領域宣言BYTE擬似命令
;vacuum__val: .BYTE 2 ;vacuum変数領域宣言BYTE擬似命令
;
; **********************************
; C O D E
; **********************************
;
.cseg
.org 0
; **********************************
; R E S E T & I N T - V E C T O R S
; **********************************
RJMP RESET ;各種リセット
nop
RJMP EXT_INT0 ;BTDC_12
nop
RJMP EXT_INT1 ;BTDC_36
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP TIM1_COMPA ;タイマ/カウンタ1比較A一致
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット RJMP TIM0_COMPA ;タイマ/カウンタ0比較A一致
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
RJMP RESET ;各種リセット
nop
;
; **********************************
;割込み処理
;タイマ/カウンタ1比較A一致
;300rpm停止時処理 17c
TIM1_COMPA:
;TIMSK1 =0 比較A割込み停止
CLR TIM1_COMPA_dat
STS TCCR1B , TIM1_COMPA_dat ;Timer1 停止
CLR STATUP
;TCNT1 = 0; //タイマー1をクリヤーしておくTCNT1L:TCNT1H
STS TCNT1H , TIM1_COMPA_dat
STS TCNT1L , TIM1_COMPA_dat
;tim1val(r6:r7) = 0;
MOV tim1val_Hi , TIM1_COMPA_dat
MOV tim1val_Lo , TIM1_COMPA_dat
;Control_Flag = 0 run = 0;//停止処理
MOV Control_Flag , TIM1_COMPA_dat
mov run, TIM1_COMPA_dat ;停止フラッグ
CBI PORTD,7 ;portD.7 Lo
CBI PORTB,5
RETI
;外部割り込み要求1
EXT_INT0: ;BTDC_12 立下り 約BTDC10割込み 始動時のみ割込み
SBRC run , 0
RJMP INT0_END ;連続回転中
SBI PORTD,7 ;TCNT1(TCNT1L:TCNT1H >= delay_pulse(r14:r15) portD.7 Hi
SBI PORTB,5
CLR r28 ;0
s_ignition_On: ;delay_T
INC r28 ;++
CPSE r28,delay_T ;delay_T = 255 On delay_T + 4 <> 1c 0xff=255usec
RJMP s_ignition_On ;
CLR r28
s_ignition_On2:
INC r28 ;++
CPSE r28,delay_T ;delay_T = 255 On delay_T + 4 <> 1c 0xff=255usec
RJMP s_ignition_On2 ;
CBI PORTD,7
CBI PORTB,5
SBRS STATUP , 3
RJMP STATUP_LOOP ;8回スキップ キックスタート処理
INC run ;run=1
RJMP INT0_END
STATUP_LOOP:
INC STATUP
INT0_END:
clr vacuumdat ;vacuumdat=0
RETI
EXT_INT1: ;BTDC_36
CLR INT1_dat
;tim1停止 tim1停止
STS TCCR1B , INT1_dat ;Timer1 停止
SBRC run , 0 ;run== 0 スキップ
RJMP Running
;TCNT1 = 0 Timer1クリヤー処理
sts 0x85, INT1_dat
sts 0x84,INT1_dat
;tim1スタートTCCR1B = 0b00000011
STS TCCR1B , T1_stat ;Timer1スタート
RJMP INT1_END
Running: ;連続回転中処理
lds tim1val_Lo, TCNT1L ;TCNT1L=0x84
lds tim1val_Hi, TCNT1H ;TCNT1H=0x85
;TCNT1 = 0
sts TCNT1H, INT1_dat
sts TCNT1L,INT1_dat
;tim1スタートTCCR1B = 0b00000011
STS TCCR1B , T1_stat ;Timer1スタート
/*
;SRAM タイマー値保存 アドレス0x300
LDI R31 , high(TIM1_val) ; Zレジスタ上位を設定
LDI R30 , low(TIM1_val); Zレジスタ下位を設定
st z+,tim1val_Lo ;モニター用
st z,tim1val_Hi ;モニター用
*/
LDI Control_Flag , 1 ;点火処理あり
INT1_END:
CLR INT1_dat
RETI
; **********************************割込み処理 END
;
RESET:
;Start:
ldi R16,low(RAMEND) ;スタック設定 SRAMの最後 out SPL, R16
ldi R17,high(RAMEND)
out SPH, R17
out SPL, R16
;setup レジスタークリヤー
clr r0
clr r1
clr r4
clr r22
;定数設定
ldi R16, 0x3
mov T1_stat, r16 ;r3
ldi R16, 0xff ;0xff=255
mov delay_T, r16 ;r5 SCR On=64usec
LDI USART_HI , high(329)
LDI USART_LOW , low(329) ;329
;シリアルスピード設定 57600 16MHz
ldi R16,LOW(16)
ldi R17,HIGH(16)
sts UBRR0H, R17
sts UBRR0L, R16
;UCSRnA =
;ldi R16, 0b00000110
;sts UCSR0A, R16
;UCSR0C = 0b00000110; //0xc2 パリなし ストップビット 1ビット データビット 8ビット
ldi R16, 0b00000110
sts UCSR0C, R16
;UCSR0B = (1<<RXEN0)|(1<<TXEN0);// 0xc1 bit3,4 送受信可
ldi R16, 0b00011000
sts UCSR0B, R16
;AD設定 (ADCH)8bitto読み出し用設定
;ADCSRB = 0b00000000; ;0x7b 連続変換
sts 0x7b, r1
;ADMUX = 0b01100111; ;0x7c ADVC、左詰、A0D7選択
ldi R16, 0b01100111
sts 0x7c, R16
;ADCSRA = 0b11100110; ;0x7a AD変換、変換開始、自動起動、変換ck=cp/64 250KHz
ldi R16, 0b11100110
sts ADCSRA, R16
;DIDR0 = 0b00111111; ;0x7e デジタル入力禁止
ldi R16,0b00111111 ;
sts 0x7E, R16
;ピンモード設定
;DDRD = 0b11110000; ;0x0a d0-d3=入力 0b00000000;
ldi R16, 0b11110000
out DDRD, R16
;PORTD = 0b00000000; ;0xb PORTD プルアップなし
ldi R16, 0b00001100 ;0xb PORTD 2,3 プルアップ
out PORTD, R16
;DDRB = 0b11111111; ;0x4 pb 出力out設定
ldi R16, 0b11111111
out DDRB, R16
;PORTB = 0b00000000; ;0x5
out PORTB, r0
;TIMER1初期化
;TCCR1A = 0
sts TCCR1A, r0
;TCCR1B =0b00000011(64分周)
;ldi R16, 0b00000011
sts TCCR1B, r0
;TCNT1 = 0
sts TCNT1H, r0
sts TCNT1L, r0
;OCR1A =エンジン停止確認 300rpm以下設定
ldi R16, 0x50 ;50000= 0xC359
ldi r17, 0xC3
sts OCR1AH, r17
sts OCR1AL, R16
;TIMSK1 0b00000010 タイマ/カウンタ1比較A割り込み許可
ldi R16, 0b00000010
sts TIMSK1, R16
;外部割込み設定
;int0設定 int1設定
;EIMSK 0b00000011 ;
ldi R16, 0b00000011
OUT 0x1D, R16
;int0設定 int1設定
;EICRA(0x69) = 0b00001010 INT0上昇単,INT1上昇単で発生。
ldi R16, 0b00001011
STS 0x69, R16
CLR r16 ;0
CLR r17 ;0
;EEPROMよりマップデーターSRAMにセット
CLR r26 ;0
CLR r27 ;0
LDI R31 , high(map_address) ; Zレジスタ上位を設定
LDI R30 , low(map_address); Zレジスタ下位を設定
SRAM_set:
RCALL EEPROM_R
ST Z+ , r16
ADIW r26,1
CP r26 , USART_LOW
CPC r27,USART_HI
BREQ SET_END
RJMP SRAM_set
SET_END:
CLR r16 ;0
CLR r30 ;0
CLR r31 ;0
sei ;割込許可
Run_Start:
SBRS run , 0 ;run==1スキップ
RJMP Run_Start_check
CLR r17
RJMP Run_main ;回転中
Run_Start_check:
LDS r17,UCSR0A
SBRS r17,RXC0 ;UCSR0A 未読データーありスキップ
RJMP Run_Start
RJMP rs_comand
Run_main: ;ループ先頭
;バキューム処理AD読出し
;変換完了していた時読み込み
LDS r16 , ADCSRA ;ADCSRA 0x7a
SBRS r16, ADIF ;ADIF
RJMP vacuum_END ;ADIF = 0
lds rvacuumdat, ADCH ;ADCH 0x79 AD読出
CP vacuumdat , rvacuumdat ;vacuumdat < rvacuumdat
BRSH vacuum_END ;vacuumdat > ジャンプ
MOV vacuumdat , rvacuumdat
/*
;vacuum値保存
LDI R31 , high(vacuum__val) ; Zレジスタ上位を設定
LDI R30 , low(vacuum__val); Zレジスタ下位を設定
st z+,vacuumdat ;モニター用
st z,r0 ;モニター用
*/
MOV vofset , vacuumdat ;vofset =vacuumdat
LSR vofset ;>> 1 1/16 4bitデーター変換
LSR vofset ;>> 2
LSR vofset ;>> 3
LSR vofset ;>> 4
;if(vofset >= 11)
LDI r16 , 11
cp vofset,r16
BRLO under_10 ;vofset < 11
LDI vofset,5
RJMP adc_end
under_10:
LDI r16 , 10
cp vofset,r16
BRLO under_9 ;vofset < 10
LDI vofset,4
RJMP adc_end
under_9:
LDI r16 , 9
cp vofset,r16
BRLO under_8 ;vofset < 9
LDI vofset,3
RJMP adc_end
under_8:
LDI r16 , 7
cp vofset,r16
BRLO under_7 ;vofset < 7
LDI vofset,2 ;
RJMP adc_end
under_7:
LDI r16 , 5
cp vofset,r16
BRLO under_5 ;vofset < 5
LDI vofset,1 ;
RJMP adc_end
under_5:
;if(vofset <= 4) vofset=0 高負荷
LDI vofset,0
adc_end:
lds r16, 0x7a ;ADIFクリヤー処理で読み込み完了
ori r16, 0x10
sts 0x7a ,r16
;ADC読み込み完
vacuum_END: ;Control_Flag == 1
SBRS Control_Flag , 0
RJMP rs232_check ;Control_Flag ! 1
;tim1val(r6,7) >= 2308(r16,17)(0x904) 6500rpm以下 分岐5c angle セット 6C
ldi r16,LOW(2307) ;0x04
ldi r17,HIGH(2307)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp64 ; >=2308 6400rpm以下の処理へ
RJMP direct_ignition ; <6500rpm以上の即時点火処理へ
;MAPアドレス
;6400rpm== 5c 分岐5c angle セット 6C
jp64:
ldi r17,HIGH(2381)
ldi r16,LOW(2381)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp63 ;>=2381 6300rpm以下の処理へ
ldi MAPAD_Lo,54
RJMP angle
;6300rpm== 11c
jp63:
ldi r17,HIGH(2420)
ldi r16,LOW(2420)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp62 ;>=2420 6200rpm以下の処理へ
ldi MAPAD_Lo,53
RJMP angle
;6200rpm==
jp62:
ldi r17,HIGH(2460)
ldi r16,LOW(2460)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp61 ;>=2460 6100rpm以下の処理へ
ldi MAPAD_Lo,52
RJMP angle
;6100rpm==
jp61:
ldi r17,HIGH(2500)
ldi r16,LOW(2500)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp60 ;>=2500 6000rpm以下の処理へ
ldi MAPAD_Lo,51
RJMP angle
;6000rpm==
jp60:
ldi r17,HIGH(2543)
ldi r16,LOW(2543)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp59 ;>=2543 5900rpm以下の処理へ
ldi MAPAD_Lo,50
RJMP angle
;5900rpm==
jp59:
ldi r17,HIGH(2587)
ldi r16,LOW(2587)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp58 ;>=2587 5800rpm以下の処理へ
ldi MAPAD_Lo,49
RJMP angle
;5800rpm==
jp58:
ldi r17,HIGH(2632)
ldi r16,LOW(2632)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp57 ;>=2632 5700rpm以下の処理へ
ldi MAPAD_Lo,48
RJMP angle
;5700rpm==
jp57:
ldi r17,HIGH(2679)
ldi r16,LOW(2679)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp56 ;>=2679 5600rpm以下の処理へ
ldi MAPAD_Lo,47
RJMP angle
;5600rpm==
jp56:
ldi r17,HIGH(2728)
ldi r16,LOW(2728)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp55 ;>=2728 5500rpm以下の処理へ
ldi MAPAD_Lo,46
RJMP angle
;5500rpm==
jp55:
ldi r17,HIGH(2778)
ldi r16,LOW(2778)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp54 ;>=2778 5400rpm以下の処理へ
ldi MAPAD_Lo,45
RJMP angle
;5400rpm==
jp54:
ldi r17,HIGH(2831)
ldi r16,LOW(2831)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp53 ;>=2831 5300rpm以下の処理へ
ldi MAPAD_Lo,44
RJMP angle
;5300rpm==
jp53:
ldi r17,HIGH(2884)
ldi r16,LOW(2884)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp52 ;>=2884 5200rpm以下の処理へ
ldi MAPAD_Lo,43
RJMP angle
;5200rpm==
jp52:
ldi r17,HIGH(2942)
ldi r16,LOW(2942)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp51 ;>=2942 5100rpm以下の処理へ
ldi MAPAD_Lo,42
RJMP angle
;5100rpm==
jp51:
ldi r17,HIGH(3000)
ldi r16,LOW(3000)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp50 ;>=3000 5000rpm以下の処理へ
ldi MAPAD_Lo,41
RJMP angle
;5000rpm==
jp50:
ldi r17,HIGH(3062)
ldi r16,LOW(3062)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp49 ;>=3062 4900rpm以下の処理へ
ldi MAPAD_Lo,40
RJMP angle
;4900rpm==
jp49:
ldi r17,HIGH(3126)
ldi r16,LOW(3126)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp48 ;>=3126 4800rpm以下の処理へ
ldi MAPAD_Lo,39
RJMP angle
;4800rpm==
jp48:
ldi r17,HIGH(3192)
ldi r16,LOW(3192)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp47 ;>=3192 4700rpm以下の処理へ
ldi MAPAD_Lo,38
RJMP angle
;4700rpm==
jp47:
ldi r17,HIGH(3261)
ldi r16,LOW(3261)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp46 ;>=3261 4600rpm以下の処理へ
ldi MAPAD_Lo,37
RJMP angle
;4600rpm==
jp46:
ldi r17,HIGH(3334)
ldi r16,LOW(3334)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp45 ;>=3334 4500rpm以下の処理へ
ldi MAPAD_Lo,36
RJMP angle
;4500rpm==
jp45:
ldi r17,HIGH(3410)
ldi r16,LOW(3410)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp44 ;>=3410 4400rpm以下の処理へ
ldi MAPAD_Lo,35
RJMP angle
;4400rpm==
jp44:
ldi r17,HIGH(3489)
ldi r16,LOW(3489)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp43 ;>=3489 4300rpm以下の処理へ
ldi MAPAD_Lo,34
RJMP angle
;4300rpm==
jp43:
ldi r17,HIGH(3572)
ldi r16,LOW(3572)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp42 ;>=3572 4200rpm以下の処理へ
ldi MAPAD_Lo,33
RJMP angle
;4200rpm==
jp42:
ldi r17,HIGH(3659)
ldi r16,LOW(3659)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp41 ;>=3659 4100rpm以下の処理へ
ldi MAPAD_Lo,32
RJMP angle
;4100rpm== 169c
jp41:
ldi r17,HIGH(3751)
ldi r16,LOW(3751)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp40 ;>=3751 5000rpm以下の処理へ
ldi MAPAD_Lo,31
RJMP angle
;4000rpm==
jp40:
ldi r17,HIGH(3487)
ldi r16,LOW(3487)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp39 ;>=3487 3900rpm以下の処理へ
ldi MAPAD_Lo,30
RJMP angle
;3900rpm==
jp39:
ldi r17,HIGH(3948)
ldi r16,LOW(3948)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp38 ;>=3948 3800rpm以下の処理へ
ldi MAPAD_Lo,29
RJMP angle
;3800rpm==
jp38:
ldi r17,HIGH(4055)
ldi r16,LOW(4055)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp37 ;>=4055 3700rpm以下の処理へ
ldi MAPAD_Lo,28
RJMP angle
;3700rpm== 197c
jp37:
ldi r17,HIGH(4167)
ldi r16,LOW(4167)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp36 ;>=4167 3600rpm以下の処理へ
ldi MAPAD_Lo,27
RJMP angle
;3600rpm==
jp36:
ldi r17,HIGH(4286)
ldi r16,LOW(4286)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp35 ;>=4286 3500rpm以下の処理へ
ldi MAPAD_Lo,26
RJMP angle
;3500rpm==
jp35:
ldi r17,HIGH(4412)
ldi r16,LOW(4412)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp34 ;>=4412 4400rpm以下の処理へ
ldi MAPAD_Lo,25
RJMP angle
;3400rpm==
jp34:
ldi r17,HIGH(4512)
ldi r16,LOW(4512)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp33 ;>=4512 3300rpm以下の処理へ
ldi MAPAD_Lo,24
RJMP angle
;3300rpm==
jp33:
ldi r17,HIGH(4688)
ldi r16,LOW(4688)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp32 ;>=4688 3200rpm以下の処理へ
ldi MAPAD_Lo,23
RJMP angle
;3200rpm==
jp32:
ldi r17,HIGH(4839)
ldi r16,LOW(4839)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp31 ;>=4839 3100rpm以下の処理へ
ldi MAPAD_Lo,22
RJMP angle
;3100rpm==
jp31:
ldi r17,HIGH(5000)
ldi r16,LOW(5000)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp30 ;>=5000 3000rpm以下の処理へ
ldi MAPAD_Lo,21
RJMP angle
;3000rpm==
jp30:
ldi r17,HIGH(5173)
ldi r16,LOW(5173)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp29 ;>=5173 2900rpm以下の処理へ
ldi MAPAD_Lo,20
RJMP angle
;2900rpm==
jp29:
ldi r17,HIGH(5358)
ldi r16,LOW(5358)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp28 ;>=5358 2800rpm以下の処理へ
ldi MAPAD_Lo,19
RJMP angle
;2800rpm==
jp28:
ldi r17,HIGH(5555)
ldi r16,LOW(5555)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp27 ;>=5555 2700rpm以下の処理へ
ldi MAPAD_Lo,18
RJMP angle
;2700rpm==
jp27:
ldi r17,HIGH(5770)
ldi r16,LOW(5770)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp26 ;>=5770 2600rpm以下の処理へ
ldi MAPAD_Lo,17
RJMP angle
;2600rpm==
jp26:
ldi r17,HIGH(6000)
ldi r16,LOW(6000)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp25 ;>=6000 2500rpm以下の処理へ
ldi MAPAD_Lo,16
RJMP angle
;2500rpm==
jp25:
ldi r17,HIGH(6250)
ldi r16,LOW(6250)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp24 ;>=6250 2400rpm以下の処理へ
ldi MAPAD_Lo,15
RJMP angle
;2400rpm==
jp24:
ldi r17,HIGH(6522)
ldi r16,LOW(6522)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp23 ;>=6522 2300rpm以下の処理へ
ldi MAPAD_Lo,14
RJMP angle
;2300rpm==
jp23:
ldi r17,HIGH(6819)
ldi r16,LOW(6819)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp22 ;>=6819 2200rpm以下の処理へ
ldi MAPAD_Lo,13
RJMP angle
;2200rpm==
jp22:
ldi r17,HIGH(7143)
ldi r16,LOW(7143)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp21 ;>=7143 2100rpm以下の処理へ
ldi MAPAD_Lo,12
RJMP angle
;2100rpm==
jp21:
ldi r17,HIGH(7500)
ldi r16,LOW(7500)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp20 ;>=7500 2000rpm以下の処理へ
ldi MAPAD_Lo,11
RJMP angle
;2000rpm==
jp20:
ldi r17,HIGH(7895)
ldi r16,LOW(7895)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp19 ;>=7895 1900rpm以下の処理へ
ldi MAPAD_Lo,10
RJMP angle
;1900rpm==
jp19:
ldi r17,HIGH(8334)
ldi r16,LOW(8334)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp18 ;>=8334 1800rpm以下の処理へ
ldi MAPAD_Lo,9
RJMP angle
;1800rpm==
jp18:
ldi r17,HIGH(8824)
ldi r16,LOW(8824)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp17 ;>=8824 1700rpm以下の処理へ
ldi MAPAD_Lo,8
RJMP angle
;1700rpm==
jp17:
ldi r17,HIGH(9376)
ldi r16,LOW(9376)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp16 ;>=9376 1600rpm以下の処理へ
ldi MAPAD_Lo,7
RJMP angle
;1600rpm==
jp16:
ldi r17,HIGH(10000)
ldi r16,LOW(10000)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp15 ;>=10000 1500rpm以下の処理へ
ldi MAPAD_Lo,6
RJMP angle
;1500rpm==
jp15:
ldi r17,HIGH(10715)
ldi r16,LOW(10715)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp14 ;>=10715 1400rpm以下の処理へ
ldi MAPAD_Lo,5
RJMP angle
;1400rpm==
jp14:
ldi r17,HIGH(11539)
ldi r16,LOW(11539)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp13 ;>=11539 1300rpm以下の処理へ
ldi MAPAD_Lo,4
RJMP angle
;1300rpm==
jp13:
ldi r17,HIGH(12500)
ldi r16,LOW(12500)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp12 ;>=12500 1200rpm以下の処理へ
ldi MAPAD_Lo,3
RJMP angle
;1200rpm==
jp12:
ldi r17,HIGH(13637)
ldi r16,LOW(13637)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp11 ;>=13637 1100rpm以下の処理へ
ldi MAPAD_Lo,2
RJMP angle
;1100rpm==
jp11:
ldi r17,HIGH(15000)
ldi r16,LOW(15000)
CP tim1val_Lo,r16
CPC tim1val_Hi,r17
BRSH jp10 ;>=15000 1000rpm以下の処理へ
ldi MAPAD_Lo,1
RJMP angle
;1000rpm==
jp10:
ldi MAPAD_Lo,0
;RJMP angle
;MAPアドレスEND
angle:
;MAPアドレス計算
;8*8 MAPAD_Lo:=MAPAD_Lo*6 + vofset
ldi r17,6
mul MAPAD_Lo, r17 ;R0:R1=8bit*8bit
MOVW MAPAD_Lo,r0
CLR r0
CLR r1
;MAPAD = MAPAD + vofset
add MAPAD_Lo, vofset
adc MAPAD_Hi, r1
;rpmva + vofset END
;MAP sram読出し
MOVW r30,MAPAD_Lo ;Zレジスター
;sram MAPアドレスセット
ldi r16,low(map_address)
ldi r17,high(map_address)
add r30, r16
adc R31, r17
ld delay_pulse_Lo,Z ;8bit MAPデーター読出し delay_pulse_Lo=r14
;MOV delay_pulse_Lo, r16 ;delay_pulse(r14:r15)Low ;8bit MAPデーター
;0.7°カウント計算 tim1val>>9* delay_pulse
;≒0.7°パルス計算
LSR tim1val_Hi ;1/2
ROR tim1val_Lo
LSR tim1val_Hi ;1/4
ROR tim1val_Lo
LSR tim1val_Hi ;1/8
ROR tim1val_Lo
LSR tim1val_Hi ;1/16
ROR tim1val_Lo
LSR tim1val_Hi ; 1/32
ROR tim1val_Lo
LSR tim1val_Hi ;1/64
ROR tim1val_Lo
LSR tim1val_Hi ;1/128
ROR tim1val_Lo
LSR tim1val_Hi ;1/256
ROR tim1val_Lo
LSR tim1val_Hi ;1/512 360/512=0.7031 ≒0.7°
ROR tim1val_Lo
;遅延カウント計算
mul delay_pulse_Lo, tim1val_Lo ;下位計算
MOV r16, r0 ;下位データー
MOV r17, r1 ;一時データー保存
mul delay_pulse_Lo, tim1val_Hi ;上位データー
add r17,r0 ;一時データー保存
mov delay_pulse_Lo,r16 ;データー保存 r14
mov delay_pulse_Hi,r17 ;データー保存 r15
clr r0
clr r1
;遅延パルスEND 27c
delay_ignition: ;TCNT1(TCNT1L:TCNT1H == delay_pulse(r14:r15)
lds r16 , TCNT1L
lds r17 , TCNT1H
cp r16 , delay_pulse_Lo
cpc r17 , delay_pulse_Hi
BRSH f_set ;TCNT1(TCNT1L:TCNT1H >= delay_pulse(r14:r15) までループ
RJMP delay_ignition
f_set:
SBI PORTD,7 ;TCNT1(TCNT1L:TCNT1H >= delay_pulse(r14:r15) portD.7 Hi
SBI PORTB,5
clr r16 ;r16=0
ignition_On: ;delay_T
INC r16 ;r16++ 1c
CPSE r16,delay_T ;delay_T = 255 On delay_T + 4 63.7usec
RJMP ignition_On
clr r16 ;r16=0
ignition_On1: ;delay_T
INC r16 ;r16++ 1c
CPSE r16,delay_T ;delay_T = 255 On delay_T + 4 63.7usec
RJMP ignition_On1
clr r16
CBI PORTD,7 ;portD.7 Lo
CBI PORTB,5
LDI Control_Flag , 0
RJMP rs232_check
direct_ignition: ;
SBI PORTD,7
SBI PORTB,5 ;
clr r16 ;r16=0
d_ignition_On: ;delay_T
INC r16 ;r16++
CPSE r16,delay_T ;delay_T = 255 On delay_T * 4
RJMP d_ignition_On
clr r16
d_ignition_On1: ;delay_T
INC r16 ;r16++
CPSE r16,delay_T ;delay_T = 255 On delay_T * 4
RJMP d_ignition_On1
clr r16
CBI PORTD,7 ;portD.7 Lo
CBI PORTB,5
LDI Control_Flag , 0 ;Control_Flag = 0
/*
monitor_out:
;0x300,tim1val_Lo 0x301,tim1val_Hi ;モニター用
;mapアドレス 0x302,0x303
; 0x302, 0x3031 ;モニター用
LDS r17,UCSR0A ;状態フラグ取得
SBRS r17 ,7
RJMP rs232_check ;受信データー無しジャンプ
LDS r16,UDR0 ;受信データ取得
CPI r16,0x6d ;=='m'
BRNE rs232_check ;<> 'm'
LDI R31 , high(TIM1_val) ; Zレジスタ上位を設定
LDI R30 , low(TIM1_val); Zレジスタ下位を設定
monitor_S1: ;tim1
LDS r17,UCSR0A ;送信緩衝部空きでスキップ
SBRS r17,UDRE0
RJMP monitor_S1 ;送信緩衝部空き待機 high(329)
LD r16,z+
LD r17,z
STS UDR0,r16 ;データ送信(送信開始)tim1
monitor_S2:
LDS r17,UCSR0A ;送信緩衝部空きでスキップ
SBRS r17,UDRE0
RJMP monitor_S2
STS UDR0,r17 ;データ送信(送信開始)tim1
;vacuum 8Bit
LDI R31 , high(vacuum__val) ; Zレジスタ上位を設定
LDI R30 , low(vacuum__val); Zレジスタ下位を設定
monitor_S3:
LDS r17,UCSR0A ;送信緩衝部空きでスキップ
SBRS r17,UDRE0
RJMP monitor_S3
ld r16,Z+ ;Lo
ld r17,Z
STS UDR0,R16
monitor_S4:
LDS r17,UCSR0A ;送信緩衝部空きでスキップ
SBRS r17,UDRE0
RJMP monitor_S4
STS UDR0,R17 ;8bit負圧ADC送信
clr r17
clr r16
;vacuumdat = 0;
*/
rs232_check: ;232処理 r4<>2
SBRC run,0
RJMP rs232_end ; run==1
LDS r17,UCSR0A
SBRS r17,RXC0 ;UCSR0A
RJMP rs232_end
rs_comand:
LDS r17,UCSR0A ;状態フラグ取得
RCALL USART_R ;受信データ
ANDI r17,(1<<FE0)|(1<<DOR0)|(1<<UPE0) ;受信異常検査
BREQ USART_Rx_V
RJMP rs232_end ;受信異常
USART_Rx_V:
CPI r16,0x52 ;=='R' 全読み出し
BRNE USART_R_S ;<> 'R'
CLR r26
CLR r27
Read_eeprom:
RCALL EEPROM_R ; r16 = eeprom(r26:r27)
RCALL USART_T ;読み出データー送信
CP r26 , USART_LOW
CPC r27,USART_HI
BREQ red_end ;不一致で分岐
ADIW r26,1
RJMP Read_eeprom
red_end:
LDI r16,0x45 ;'E'送信
RCALL USART_T
RJMP rs232_end
USART_R_S: ;接続確認 ok
CPI r16,0x53 ;=='S'
BRNE USART_R_W
LDI r16,0x4F ;'O'
RCALL USART_T
LDI r16,0x4B ;'K'
RCALL USART_T
RJMP rs232_end
USART_R_W: ;EEPROM書込み
CPI r16,0x57 ;=='W'
BRNE rs232_end
CLR r26
CLR r27
RCALL USART_T ;'W'送信
eep_write:
RCALL USART_R
RCALL EEPROM_W
CP r26 , USART_LOW
CPC r27 , USART_HI
BRNE next_R ;< 分岐 BRNE
end_r:
LDI r16,0x45 ;'E'送信
RCALL USART_T
RJMP Run_Start
next_R:
ADIW r26,1
;LDI r16,0x45 ;'E'送信 test
LDI r16,'S' ;'S'送信 0x53
RCALL USART_T
RJMP eep_write
rs232_end:
SBRS run , 0 ;if run!1
RJMP Run_Start ;run==0
RJMP Run_main ;ループエンド run==1
;送信関数
USART_T:
LDS r17,UCSR0A ;送信緩衝部空きでスキップ
SBRS r17,UDRE0
RJMP USART_T ;送信緩衝部空き待機
STS UDR0,r16 ;データ送信(送信開始)
RET ;呼び出し元へ復帰
;受信関数
USART_R:
LDS r17,UCSR0A ;状態フラグ取得
SBRS r17 ,7
RJMP USART_R
LDS R16,UDR0 ;受信データ取得
RET
;EEPROM読出し
EEPROM_R: SBIC EECR,EEPE ;EECR,EEPE =1 読み書き可能までwait
RJMP EEPROM_R
OUT EEARH,r27 ;アドレスセット
OUT EEARL,r26
SBI EECR,EERE ;EECR,EERE
in r16, EEDR
RET
;EEPROM書込み
EEPROM_W: SBIC EECR,EEPE ;EECR,EEPE =1 読み書き可能までwait
RJMP EEPROM_W
CBI EECR,EEPM0 ;対応プログラミング種別設定 消去書込み
CBI EECR,EEPM1
OUT EEARH,r27 ;アドレスセット
OUT EEARL,r26
OUT EEDR,R16
SBI EECR,EEMPE ;EEPROM主プログラム許可ビット設定
SBI EECR,EEPE
RET
; End of source code
*試験走行 約150km
アイドリング 1000rpm程度でも安定しグリッピングでも止まる事無くついてくる。
2500rpm位でも走行して加速も多少のノッキングを感じる程度で加速できる。
*問題点
8bitCPUでは計算速度に限界16bit又は32bitCPUで16bitタイマーが2個以上あると都合がよい。
セル付きと違いピックアップ信号がBTDC35.5度である為それ以上の進角は前回の回転数より割り出す」必要がある。
(キャブ補正は、以前にキャブをオーバーホールした時のキースター燃調キット使用)
1回目1500rpm~2500rpmにて息つきが時おり発生の為、ニードルを1段下げると少し収まる
2回目 コンデンサー容量を1.1uFより2.2uF変更(純正が2uFらしい)
アイドリングが高くなりアイドリングスクリューでも下がらない為1200rpmまで点火時期をを遅くする。(ワイヤーの調整後で元に戻す)
2500rpm前後にて息つきが激しくなりメインジェットを#118より#122に変更しニードルを3段
目ほぼ息つきは収まるがもう1段さげたほうが良いかも。
点火系を変更し強化すると燃調を濃いほうに修正する必要有るようだ。
3回目 ニードルを変更、1ランク細い物に変更し200kmほどテスト。
ほとんど不調は無くなった。標高の高い峠にて2500rpm付近がまだの様だが通常では良い。
5速2500rpm付近での巡行はできますが加速は少しノッキングぎみ、スロットルを思いきり開ければ
点火時期が遅くなるのでノッキングは出ません しかしエンジンには悪そうでしないほうが良い。
最終段階による燃費 282Km 10.43ℓ 27km/ℓ(通常のツーリング等の走行)
25km/ℓぐらいだったので良くなったか?走行の仕方で変わるので回数を重ねないと不明