mirror of
https://github.com/rvtr/ctr_mcu.git
synced 2025-10-31 13:51:10 -04:00
歩数計バグ修正
・毎時一歩目の時に累計のインクリメントを忘れていた ・内部で年の比較を誤っていた。2021年にバグが発覚するのを回避できた 充電ICの不具合(仕様)の回避 ・アダプタを抜いた瞬間に電池残量100%で充電完了 となってしまうのを回避。 SoCへ通知するステータスもケア済み git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@312 013db118-44a6-b54f-8bf7-843cb86687b1
This commit is contained in:
parent
c3e5d5f2d2
commit
f8af9cb246
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#define MCU_VER_MAJOR 0x01
|
#define MCU_VER_MAJOR 0x01
|
||||||
#define MCU_VER_MINOR 0x1B
|
#define MCU_VER_MINOR 0x1C
|
||||||
|
|
||||||
|
|
||||||
#define _firm_format_v3_
|
#define _firm_format_v3_
|
||||||
|
|||||||
BIN
trunk/hoge.bin
BIN
trunk/hoge.bin
Binary file not shown.
@ -97,8 +97,6 @@ unsigned char MIN;
|
|||||||
unsigned char SEC;
|
unsigned char SEC;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -70,6 +70,10 @@ u8 frame_sleep;
|
|||||||
st_LED_dim_status LED_dim_status_sleep;
|
st_LED_dim_status LED_dim_status_sleep;
|
||||||
|
|
||||||
|
|
||||||
|
// 充電中か否か
|
||||||
|
extern bit BT_IN_CHG_delayed_n;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ========================================================
|
// ========================================================
|
||||||
#define led_fade_to( now, goal ) now = fade_to( now, goal )
|
#define led_fade_to( now, goal ) now = fade_to( now, goal )
|
||||||
@ -382,7 +386,8 @@ static u8 led_pow_batt_low()
|
|||||||
// おしまい
|
// おしまい
|
||||||
}
|
}
|
||||||
|
|
||||||
if(( vreg_ctr[VREG_C_BT_REMAIN] > BATT_TH_EMPTY ) || !BT_IN_CHG_n )
|
if(( vreg_ctr[VREG_C_BT_REMAIN] > BATT_TH_EMPTY ) || !BT_IN_CHG_delayed_n )
|
||||||
|
// 電池残量が5%(~10%) または、それ未満でも充電中
|
||||||
{
|
{
|
||||||
// 赤点灯
|
// 赤点灯
|
||||||
led_fade_to( LED_duty_pow_blu, 0 );
|
led_fade_to( LED_duty_pow_blu, 0 );
|
||||||
|
|||||||
@ -201,7 +201,7 @@ void pedometer()
|
|||||||
|
|
||||||
static void hosu_increment_if_necessary()
|
static void hosu_increment_if_necessary()
|
||||||
{
|
{
|
||||||
u8 year_compd; // hour境界補正済み現在年。comp(ensation)
|
u8 year_compd; // hour境界補正済み現在年。comp(ensation -ed)
|
||||||
|
|
||||||
// 現在時刻取得
|
// 現在時刻取得
|
||||||
DI();
|
DI();
|
||||||
@ -225,7 +225,7 @@ static void hosu_increment_if_necessary()
|
|||||||
// 書き込みポインタの更新
|
// 書き込みポインタの更新
|
||||||
if( ! ( vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 && // 歩数計on後、最初の一歩までは前回からの経過時間を計算しない
|
if( ! ( vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 && // 歩数計on後、最初の一歩までは前回からの経過時間を計算しない
|
||||||
vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 &&
|
vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 &&
|
||||||
vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 )) //. 全ビットorでゼロ判定するのはデジタル回路屋の方言みたい
|
vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 )) //. 全ビットORでゼロ判定するのはデジタル回路屋の方言みたい
|
||||||
{
|
{
|
||||||
// 歩数計が止まっていた時間を考慮して必要なら進める
|
// 歩数計が止まっていた時間を考慮して必要なら進める
|
||||||
// 補正計算 元旦零時台で昨日扱いになった場合、大晦日の23時台に上書き
|
// 補正計算 元旦零時台で昨日扱いになった場合、大晦日の23時台に上書き
|
||||||
@ -249,25 +249,31 @@ static void hosu_increment_if_necessary()
|
|||||||
last_hour_fny = now_longhour;
|
last_hour_fny = now_longhour;
|
||||||
|
|
||||||
// 毎時ログ インクリメント
|
// 毎時ログ インクリメント
|
||||||
if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_NODATA ) // その時間帯最初のカウントの時
|
if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_MAX )
|
||||||
|
{
|
||||||
|
// 何もしないでおしまい
|
||||||
|
//. 小計の合計と累計があわなくなるのを避けるためだろうけど、どうなの?
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_NODATA ) // その時間帯最初のカウントの時
|
||||||
{ // これしないと1歩足りない
|
{ // これしないと1歩足りない
|
||||||
pool.vreg_c_ext.pedo_log[ p_record ] = 1;
|
pool.vreg_c_ext.pedo_log[ p_record ] = 1;
|
||||||
}
|
}
|
||||||
else if( pool.vreg_c_ext.pedo_log[ p_record ] != HOSU_MAX )
|
else
|
||||||
{
|
{
|
||||||
// 通常パス
|
// 通常パス
|
||||||
pool.vreg_c_ext.pedo_log[ p_record ] += 1;
|
pool.vreg_c_ext.pedo_log[ p_record ] += 1;
|
||||||
|
}
|
||||||
|
|
||||||
// 累積の更新 //
|
// 累積の更新 //
|
||||||
if( ++vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 ) //. いろいろ失敗した...
|
if( ++vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 ) // カンストチェック
|
||||||
|
{
|
||||||
|
if( ++vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 )
|
||||||
{
|
{
|
||||||
if( ++vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 )
|
if( ++vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 ){
|
||||||
{
|
vreg_ctr[ VREG_C_ACC_HOSU_L ] = 255; //. いろいろ失敗だったね...
|
||||||
if( ++vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 ){
|
vreg_ctr[ VREG_C_ACC_HOSU_M ] = 255;
|
||||||
vreg_ctr[ VREG_C_ACC_HOSU_L ] = 255; //. カンスト orz
|
vreg_ctr[ VREG_C_ACC_HOSU_H ] = 255;
|
||||||
vreg_ctr[ VREG_C_ACC_HOSU_M ] = 255;
|
|
||||||
vreg_ctr[ VREG_C_ACC_HOSU_H ] = 255;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -495,7 +501,7 @@ static unsigned long my_sqrt(unsigned long x)
|
|||||||
static u16 calc_hours_spend( u8 year )
|
static u16 calc_hours_spend( u8 year )
|
||||||
{
|
{
|
||||||
// 同じ年の内
|
// 同じ年の内
|
||||||
if( cal_log_latest.year_bcd == year )
|
if( bcdtob( cal_log_latest.year_bcd ) == year )
|
||||||
{
|
{
|
||||||
if( now_longhour > last_hour_fny )
|
if( now_longhour > last_hour_fny )
|
||||||
{
|
{
|
||||||
|
|||||||
69
trunk/pm.c
69
trunk/pm.c
@ -24,14 +24,14 @@ u8 raw_adc_temperature;
|
|||||||
BT_VENDER battery_manufacturer = BT_VENDER_NOT_CHECKED;
|
BT_VENDER battery_manufacturer = BT_VENDER_NOT_CHECKED;
|
||||||
st_bt_comp bt_comp; // バッテリパラメータ構造体
|
st_bt_comp bt_comp; // バッテリパラメータ構造体
|
||||||
u8 reg_shadow; // NTR PMIC レジスタミラー
|
u8 reg_shadow; // NTR PMIC レジスタミラー
|
||||||
bit bt_chg_ready; // バッテリパラメータ送信済。充電開始許可
|
bit bt_authorized; // バッテリパラメータ送信済。充電開始許可
|
||||||
u8 chg_led_override; // アダプタ差したとき、充電するしないに関わらずしばらく点灯させる
|
u8 chg_led_override; // アダプタ差したとき、充電するしないに関わらずしばらく点灯させる
|
||||||
|
|
||||||
u16 bt_volt16;
|
u16 bt_volt16;
|
||||||
|
|
||||||
bit ntr_pm_bt_low_old;
|
bit ntr_pm_bt_low_old;
|
||||||
bit BT_CHG_STAT_Change;
|
bit BT_CHG_STAT_Change;
|
||||||
|
bit BT_IN_CHG_delayed_n;
|
||||||
|
|
||||||
u8 pmic_version;
|
u8 pmic_version;
|
||||||
u8 mgic_version[2];
|
u8 mgic_version[2];
|
||||||
@ -128,7 +128,7 @@ void tsk_batt( )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WM0ではCHG_ENABLEピンは /WL_RST に配線されており、充電制御しない
|
// WM0ではCHG_ENABLEピンは /WL_RST に配線されており、充電制御しない
|
||||||
if( !temp_zone_charge_disable && bt_chg_ready && !PM_EXTDC_n )
|
if( !temp_zone_charge_disable && bt_authorized && !PM_EXTDC_n )
|
||||||
{
|
{
|
||||||
BT_CHG_ENABLE(); // 温度範囲OKで充電再開
|
BT_CHG_ENABLE(); // 温度範囲OKで充電再開
|
||||||
}
|
}
|
||||||
@ -139,27 +139,40 @@ void tsk_batt( )
|
|||||||
|
|
||||||
// 充電 //
|
// 充電 //
|
||||||
// →割り込み。
|
// →割り込み。
|
||||||
|
// CCICの不具合回避のため、/CHGのネゲートをちょっと丁寧に遅延させる
|
||||||
{
|
{
|
||||||
static u8 anti_chatter;
|
static u8 anti_chatter;
|
||||||
|
|
||||||
if( BT_IN_CHG_n ) // 充電*してない* (論理がわかりづらいな!)
|
if( !BT_IN_CHG_n )
|
||||||
{
|
{
|
||||||
anti_chatter = 0;
|
// さらにチャタリング除去
|
||||||
LED_CHARGE = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( anti_chatter < 2 ) // 電池無しでアダプタさして、電極をさわさわ
|
if( anti_chatter < 2 ) // 電池無しでアダプタさして、電極をさわさわ
|
||||||
{ // すると充電LEDががさがさするので
|
{ // すると充電LEDががさがさするので
|
||||||
anti_chatter++;
|
anti_chatter++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LED_CHARGE = 1;
|
BT_IN_CHG_delayed_n = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// "丁寧に遅延" todo:もっといい方法?
|
||||||
|
if( !BT_CHG_Ena_n && vreg_ctr[ VREG_C_BT_REMAIN ] < 60 )
|
||||||
|
{
|
||||||
|
BT_IN_CHG_delayed_n = 0; // 充電中と扱う。充電が終わっているはずがない
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BT_IN_CHG_delayed_n = 1;
|
||||||
|
anti_chatter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LED_CHARGE = ( ! BT_IN_CHG_delayed_n )? 1: 0; // LEDに反映
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// アダプタつないだ瞬間、満充電でも数秒わざと点灯させる。給電してることをわからせるため。
|
||||||
if( chg_led_override != 0 ){ // ↑から見ればわかるが、瞬間(数クロック)消える事がある。気がつく人いるかな…?
|
if( chg_led_override != 0 ){ // ↑から見ればわかるが、瞬間(数クロック)消える事がある。気がつく人いるかな…?
|
||||||
chg_led_override -= 1;
|
chg_led_override -= 1;
|
||||||
LED_CHARGE = 1;
|
LED_CHARGE = 1;
|
||||||
@ -256,7 +269,7 @@ void BT_chk()
|
|||||||
BT_model_detect();
|
BT_model_detect();
|
||||||
if( system_status.model != MODEL_JIKKI )
|
if( system_status.model != MODEL_JIKKI )
|
||||||
{
|
{
|
||||||
bt_chg_ready = false;
|
bt_authorized = false;
|
||||||
return;
|
return;
|
||||||
// おしまい
|
// おしまい
|
||||||
}
|
}
|
||||||
@ -274,7 +287,7 @@ void BT_chk()
|
|||||||
}
|
}
|
||||||
BT_mgic_init(); // 機種判定も行います
|
BT_mgic_init(); // 機種判定も行います
|
||||||
}
|
}
|
||||||
bt_chg_ready = true;
|
bt_authorized = true;
|
||||||
renge_task_immed_add( tski_BT_temp_update ); // 電池温度監視スタート
|
renge_task_immed_add( tski_BT_temp_update ); // 電池温度監視スタート
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -598,14 +611,14 @@ void BT_get_left(){
|
|||||||
{
|
{
|
||||||
// 実機 //
|
// 実機 //
|
||||||
u8 temp_v[2];
|
u8 temp_v[2];
|
||||||
u8 temp_force_fule_left;
|
u8 temp_force_fuel_left;
|
||||||
|
|
||||||
// 残量リード
|
// 残量リード
|
||||||
if( iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_SOC, 2, temp_fuel ) != ERR_SUCCESS )
|
if( iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_SOC, 2, temp_fuel ) != ERR_SUCCESS )
|
||||||
{
|
{
|
||||||
// 残量ICがNACK …バッテリはずれた
|
// 残量ICがNACK …バッテリはずれた
|
||||||
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_GASGAUGE_ERR;
|
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_GASGAUGE_ERR;
|
||||||
bt_chg_ready = false;
|
bt_authorized = false;
|
||||||
vreg_ctr[ VREG_C_BT_REMAIN ] = 0;
|
vreg_ctr[ VREG_C_BT_REMAIN ] = 0;
|
||||||
system_status.force_off = true;
|
system_status.force_off = true;
|
||||||
}
|
}
|
||||||
@ -638,27 +651,27 @@ void BT_get_left(){
|
|||||||
|
|
||||||
if( bt_volt16 > V_TH_30 )
|
if( bt_volt16 > V_TH_30 )
|
||||||
{
|
{
|
||||||
temp_force_fule_left = 100;
|
temp_force_fuel_left = 100;
|
||||||
hysteresis = 0;
|
hysteresis = 0;
|
||||||
}
|
}
|
||||||
else if( bt_volt16 - hysteresis > V_TH_LO )
|
else if( bt_volt16 - hysteresis > V_TH_LO )
|
||||||
{
|
{
|
||||||
temp_force_fule_left = 30;
|
temp_force_fuel_left = 30;
|
||||||
hysteresis = 0;
|
hysteresis = 0;
|
||||||
}
|
}
|
||||||
else if( bt_volt16 > V_TH_EMPTY )
|
else if( bt_volt16 > V_TH_EMPTY )
|
||||||
{
|
{
|
||||||
temp_force_fule_left = BATT_TH_LO; // ここから赤
|
temp_force_fuel_left = BATT_TH_LO; // ここから赤
|
||||||
hysteresis = 500;
|
hysteresis = 500;
|
||||||
}
|
}
|
||||||
else if( bt_volt16 > V_TH_ZERO )
|
else if( bt_volt16 > V_TH_ZERO )
|
||||||
{
|
{
|
||||||
temp_force_fule_left = BATT_TH_EMPTY;
|
temp_force_fuel_left = BATT_TH_EMPTY;
|
||||||
hysteresis = 500;
|
hysteresis = 500;
|
||||||
}
|
}
|
||||||
else if( bt_volt16 > V_TH_FORCE_OFF )
|
else if( bt_volt16 > V_TH_FORCE_OFF )
|
||||||
{
|
{
|
||||||
temp_force_fule_left = 0;
|
temp_force_fuel_left = 0;
|
||||||
hysteresis = 500;
|
hysteresis = 500;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -672,20 +685,20 @@ void BT_get_left(){
|
|||||||
// 充電許可(=アダプタも刺さってる)のに充電してない
|
// 充電許可(=アダプタも刺さってる)のに充電してない
|
||||||
// かつ、(少なくとも)素の電池残量が60%以上(CCICバグ回避)
|
// かつ、(少なくとも)素の電池残量が60%以上(CCICバグ回避)
|
||||||
// = 充電完了。電池がへたってくるとMGICが100%を返さない
|
// = 充電完了。電池がへたってくるとMGICが100%を返さない
|
||||||
if( !BT_CHG_Ena_n && BT_IN_CHG_n && vreg_ctr[ VREG_C_BT_REMAIN ] > 60 ){
|
if( !BT_CHG_Ena_n && BT_IN_CHG_delayed_n ){
|
||||||
vreg_ctr[ VREG_C_BT_REMAIN ] = 100;
|
vreg_ctr[ VREG_C_BT_REMAIN ] = 100;
|
||||||
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = 0;
|
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // 少ない方にキャップ
|
{ // 少ない方にキャップ
|
||||||
if( temp_force_fule_left > temp_fuel[0] )
|
if( temp_force_fuel_left > temp_fuel[0] )
|
||||||
{
|
{
|
||||||
vreg_ctr[ VREG_C_BT_REMAIN ] = temp_fuel[0];
|
vreg_ctr[ VREG_C_BT_REMAIN ] = temp_fuel[0];
|
||||||
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = temp_fuel[1];
|
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = temp_fuel[1];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
vreg_ctr[ VREG_C_BT_REMAIN ] = temp_force_fule_left;
|
vreg_ctr[ VREG_C_BT_REMAIN ] = temp_force_fuel_left;
|
||||||
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = 0;
|
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -161,7 +161,7 @@ task_status_immed tski_PM_LCD_off();
|
|||||||
task_status_immed tski_PM_BL_set();
|
task_status_immed tski_PM_BL_set();
|
||||||
|
|
||||||
|
|
||||||
#define PM_Chg_Stop() { BT_TEMP_P = 0; BT_CHG_DISABLE(); while( !BT_IN_CHG_n ){;}; LED_CHARGE = 0; bt_chg_ready = false; }
|
#define PM_Chg_Stop() { BT_TEMP_P = 0; BT_CHG_DISABLE(); LED_CHARGE = 0; bt_authorized = false; }
|
||||||
|
|
||||||
|
|
||||||
// これを呼ぶ前に、現在温度を教えておく必要があります。
|
// これを呼ぶ前に、現在温度を教えておく必要があります。
|
||||||
|
|||||||
@ -251,7 +251,7 @@ extern u8 raw_adc_temperature;
|
|||||||
|
|
||||||
extern u8 iic_burst_state;
|
extern u8 iic_burst_state;
|
||||||
extern bit temp_zone_charge_disable;
|
extern bit temp_zone_charge_disable;
|
||||||
extern bit bt_chg_ready;
|
extern bit bt_authorized;
|
||||||
|
|
||||||
|
|
||||||
/* ========================================================
|
/* ========================================================
|
||||||
@ -265,7 +265,7 @@ extern bit bt_chg_ready;
|
|||||||
5) <EFBFBD>V
|
5) <EFBFBD>V
|
||||||
6) ( rcomp & 0xFF )
|
6) ( rcomp & 0xFF )
|
||||||
7) raw_adc_temperature
|
7) raw_adc_temperature
|
||||||
8) ( !temp_zone_charge_disable | ( bt_chg_ready << 1 ) )
|
8) ( !temp_zone_charge_disable | ( bt_authorized << 1 ) )
|
||||||
9)
|
9)
|
||||||
======================================================== */
|
======================================================== */
|
||||||
u8 extinfo_read()
|
u8 extinfo_read()
|
||||||
@ -286,7 +286,7 @@ u8 extinfo_read()
|
|||||||
infos[4] = mgic_version[1];
|
infos[4] = mgic_version[1];
|
||||||
infos[5] = (u8)( _dbg_rcomp & 0xFF );
|
infos[5] = (u8)( _dbg_rcomp & 0xFF );
|
||||||
infos[6] = raw_adc_temperature;
|
infos[6] = raw_adc_temperature;
|
||||||
infos[7] = ( !temp_zone_charge_disable | ( bt_chg_ready << 1 ) );
|
infos[7] = ( !temp_zone_charge_disable | ( bt_authorized << 1 ) );
|
||||||
infos[8] = system_status.info_fullcolor;
|
infos[8] = system_status.info_fullcolor;
|
||||||
|
|
||||||
iic_burst_state++;
|
iic_burst_state++;
|
||||||
|
|||||||
@ -29,7 +29,7 @@ static void send_getup_to_soc();
|
|||||||
//=========================================================
|
//=========================================================
|
||||||
extern bit info_led_off;
|
extern bit info_led_off;
|
||||||
extern bit going_to_sleep;
|
extern bit going_to_sleep;
|
||||||
extern bit bt_chg_ready;
|
extern bit bt_authorized;
|
||||||
|
|
||||||
static u8 timeout_sleep;
|
static u8 timeout_sleep;
|
||||||
extern u8 chg_led_override;
|
extern u8 chg_led_override;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user