歩数計修正(途中)
電源シーケンス修正
inita時に電源が切れないようにする(PWMを止められたらすぐに勝手にBLを消す)
off時32kHzを止めるのを忘れていた

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@34 013db118-44a6-b54f-8bf7-843cb86687b1
This commit is contained in:
fujita_ryohei 2009-12-04 08:18:29 +00:00
parent b6a9f86b9f
commit 1baefd91bb
12 changed files with 561 additions and 579 deletions

View File

@ -54,6 +54,8 @@ u16* hyst_pedometer;
// ======================================================== // ========================================================
task_interval tsk_soft_int( ); task_interval tsk_soft_int( );
static void pedo_increment();
@ -88,14 +90,13 @@ task_status_immed tsk_cbk_accero( )
// 歩数計 ///////////////////////////////////////////// // 歩数計 /////////////////////////////////////////////
// offでなければ、電源off中でも計測 // offでなければ、電源off中でも計測
// if( ( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_HOSU ) != 0x00 ) // if( ( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_HOSU ) != 0x00 )
if( 1 )
{ {
static s16 th_H = 0x3500; // 閾値。暫定。動的変更とかしたい… static s16 th_H = 0x3500; // 閾値。暫定。動的変更とかしたい…ので変数
static s16 th_L = 0x2A00; static s16 th_L = 0x2A00;
static u16 acc_norm[3]; // 加速度の大きさのヒストリ。数字が大きい方が古い static u16 acc_norm[3]; // 加速度の大きさのヒストリ。数字が大きい方が古い
static u8 direction; // (0)極大を待つか (1)極小を待つか static u16 interval_hh; // 山-山間の時間。短過ぎたらはじく。
static u16 interval; // 山と谷の間の時間。短すぎても長すぎてもはじく。 static u16 time_l; // 前回の極小からの経過時間
static u16 interval_hh; // 山-山間の時間。短過ぎたらはじく。
u16 sx16 = abs( (u16)vreg_ctr[VREG_C_ACC_XH] * 256 + vreg_ctr[VREG_C_ACC_XL] ); u16 sx16 = abs( (u16)vreg_ctr[VREG_C_ACC_XH] * 256 + vreg_ctr[VREG_C_ACC_XL] );
u16 sy16 = abs( (u16)vreg_ctr[VREG_C_ACC_YH] * 256 + vreg_ctr[VREG_C_ACC_YL] ); u16 sy16 = abs( (u16)vreg_ctr[VREG_C_ACC_YH] * 256 + vreg_ctr[VREG_C_ACC_YL] );
@ -108,48 +109,96 @@ task_status_immed tsk_cbk_accero( )
(long)sy16 * ( sy16 / 2 ) + (long)sy16 * ( sy16 / 2 ) +
(long)sz16 * ( sz16 / 2 ) ); (long)sz16 * ( sz16 / 2 ) );
if( direction == 0 ) // 前回は谷 if( acc_norm[2] <= acc_norm[1] && acc_norm[1] > acc_norm[0]
&& acc_norm[0] > th_H )
// 極大で、閾値を超えていた
{ {
if( acc_norm[2] <= acc_norm[1] && acc_norm[1] > acc_norm[0] if(( 250 < interval_hh ) && ( interval_hh < 2000 ))
&& acc_norm[0] > th_H ) // 極大で、閾値を超えていた // 前回の極大からの間隔がほどよい
{ {
direction = 1; // 極小を待つ if( time_l < interval_hh )
interval = 0; // 極小までの時間を計る // 谷を挟んでいる
{
// 一歩増えました
pedo_increment();
}
} }
interval_hh = 0;
} }
else else
{ {
if( acc_norm[2] >= acc_norm[1] && acc_norm[1] < acc_norm[0] interval_hh += ( interval_hh != 65535 ) ? 1: 0; // 飽和加算って楽に書けたらいいのに
&& acc_norm[0] < th_L ) }
{
direction = 0; // (2) 直近の極小からの時間
if( 2 < interval && interval < 20 ) // 早すぎず、遅すぎず if( acc_norm[2] >= acc_norm[1] && acc_norm[1] < acc_norm[0]
{ && acc_norm[0] < th_L )
// 一歩加算。 いろいろ失敗した {
if( ++vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 ) time_l += 1;
{ }
if( ++vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 ) else
{ {
++vreg_ctr[ VREG_C_ACC_HOSU_H ]; time_l = 0;
}
}
if( ++*hyst_pedometer == 0 )
{
*hyst_pedometer = 65535;
}
}
interval = 0;
}
interval += 1;
} }
} }
return ( ERR_SUCCESS ); return ( ERR_SUCCESS );
} }
/*=========================================================
 
  
 
========================================================*/
static void pedo_increment()
{
static u8 last_hour; // 履歴の最新は何時?
static u8 last_day;
static u8 last_month;
static u8 last_year;
static u8 p_record;
// 累積の更新 //
// いろいろ失敗した...
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_H ] == 0 ){
vreg_ctr[ VREG_C_ACC_HOSU_L ] = 255; // カンスト orz
vreg_ctr[ VREG_C_ACC_HOSU_M ] = 255;
vreg_ctr[ VREG_C_ACC_HOSU_H ] = 255;
}
}
}
// 毎時履歴の更新
DI();
RWAIT = 1;
while( !RWST ){;}
if(( last_hour != HOUR ) || ( last_day != DAY ) || ( last_month != MONTH ) || ( last_year != YEAR ))
{
last_hour = HOUR;
last_day = DAY;
last_month = MONTH;
last_year = YEAR;
p_record += 1;
*(hyst_pedometer + p_record) = 0;
}
RWAIT = 0;
EI();
*(hyst_pedometer + p_record) += 1;
if( *( hyst_pedometer + p_record ) == 65535 ) // 65535はマジックナンバーで
{
*hyst_pedometer = 65534;
}
}
/*========================================================= /*=========================================================
     
@ -228,7 +277,6 @@ task_status_immed acc_hosu_set( )
// 完全停止 // 完全停止
str_send_buf[0] = str_send_buf[0] =
( ACC_BITS_PM_PDN << ACC_bP_PM0 | 0 << ACC_bP_DR0 | ACC_BITS_ALL_AXIS_ON ); ( ACC_BITS_PM_PDN << ACC_bP_PM0 | 0 << ACC_bP_DR0 | ACC_BITS_ALL_AXIS_ON );
hyst_pedometer = (u16*)pool; // 止めるとヒストリが無効になります(暫定)
} }
else else
{ {

View File

@ -4,8 +4,14 @@
#include "jhl_defs.h" #include "jhl_defs.h"
task_status_immed tsk_cbk_accero( );
///////////////////////////////////////////////////////////
extern u16* hyst_pedometer;
///////////////////////////////////////////////////////////
task_status_immed tsk_cbk_accero( );
task_status_immed acc_hosu_set( ); task_status_immed acc_hosu_set( );
#endif #endif

View File

@ -6,7 +6,7 @@
#define MCU_VER_MAJOR 0x00; #define MCU_VER_MAJOR 0x00;
#define MCU_VER_MINOR 0x0B; #define MCU_VER_MINOR 0x0C;
#define _OVERCLOCK_ #define _OVERCLOCK_

View File

@ -68,6 +68,8 @@ void main_loop( void )
renge_init( ); renge_init( );
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
hyst_pedometer = (u16*)pool;
EI( ); EI( );
RTCIMK = 0; /* 割り込み(アラーム&インターバル)許可 */ RTCIMK = 0; /* 割り込み(アラーム&インターバル)許可 */

View File

@ -52,8 +52,6 @@ u8 command_bl_set;
static void PM_get_batt_left(); static void PM_get_batt_left();
/******************************************************//** /******************************************************//**
PMIC達の初期化 PMIC達の初期化
\n \n
@ -236,8 +234,9 @@ task_status_immed PM_bt_temp_update( )
err PM_LCD_on( ) err PM_LCD_on( )
{ {
// PM_TEG_LCD_dis( 0 ); // 何もしない // PM_TEG_LCD_dis( 0 ); // 何もしない
wait_ms( DELAY_PM_TSS_50B_AND_VCOM ); wait_ms( DELAY_PM_5V_TO_TCOM );
wait_ms( DELAY_PM_VCOM_TO_BL ); wait_ms( DELAY_PM_TCOM_TO_VCS );
wait_ms( DELAY_PM_VCS_TO_BL );
vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW; vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW;
set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON ); set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON );
return ( PM_chk_LDSW( ) ); return ( PM_chk_LDSW( ) );
@ -278,7 +277,6 @@ err PM_BL_set( u8 dat )
} }
// Write // Write
if( blset != 0x00 ){ if( blset != 0x00 ){
wait_ms( 10 ); wait_ms( 10 );
} }
@ -362,7 +360,7 @@ err PM_LCD_on( )
PM_VDDLCD_on( ); PM_VDDLCD_on( );
wait_ms( DELAY_PM_TSS_50B_AND_VCOM ); wait_ms( DELAY_PM_TSS_50B_AND_TCOM );
PM_TCOM_on( ); PM_TCOM_on( );
@ -553,7 +551,6 @@ err PM_sys_pow_on( )
PM_reset_neg( ); PM_reset_neg( );
RESET2_neg; RESET2_neg;
FCRAM_RST_neg; FCRAM_RST_neg;
return ( ERR_SUCCESS );
#else #else
// TWL PMIC // TWL PMIC
@ -590,8 +587,9 @@ err PM_sys_pow_on( )
return ( ERR_ERR ); return ( ERR_ERR );
} }
return ( ERR_SUCCESS );
#endif #endif
return ( ERR_SUCCESS );
} }
@ -603,8 +601,8 @@ err PM_sys_pow_on( )
err PM_sys_pow_off( ) err PM_sys_pow_off( )
{ {
#ifdef _PMIC_CTR_ #ifdef _PMIC_CTR_
PM_BL_set( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_OFF ); // PM_BL_set( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_OFF );
PM_LCD_off( ); // TCOM,VCS OFF も消してきます。 // PM_LCD_off( ); // TCOM,VCS OFF も消してきます。
PM_reset_ast( ); PM_reset_ast( );
RESET2_ast; RESET2_ast;
@ -717,7 +715,7 @@ void tsk_batt( )
#endif #endif
} }
#ifdef _MODEL_WM0_ #ifdef _MODEL_WM0_
BT_CHG_EN_n = 0; // /WL_RSTなのです BT_CHG_EN_n = 0; // /WL_RSTです...
#endif #endif
// 充電 // // 充電 //
@ -869,9 +867,7 @@ static void PM_get_batt_left(){
// PMIC-NTRに電池残量を教えてあげる // PMIC-NTRに電池残量を教えてあげる
iic_mcu_write_a_byte( IIC_SLA_CODEC, iic_mcu_write_a_byte( IIC_SLA_CODEC,
CODEC_REG_BT, CODEC_REG_BT,
( vreg_ctr[ VREG_C_BT_REMAIN ] < 5 ) ); // 1で電池切れ ( vreg_ctr[ VREG_C_BT_REMAIN ] < 5 )? 1 : 0 ); // 1で電池切れ
} }

View File

@ -70,9 +70,9 @@ enum BT_GAUGE_REG_ADRS
#define DELAY_PM_TW_PWUP 16 #define DELAY_PM_TW_PWUP 16
#define DELAY_PM_TSS_50B_AND_VCOM ( 5 + 17 ) #define DELAY_PM_TSS_50B_AND_TCOM 17
#define DELAY_PM_5V_TO_VCOM 17 #define DELAY_PM_5V_TO_TCOM 17
#define DELAY_PM_TCOM_TO_VCS 17 #define DELAY_PM_TCOM_TO_VCS 3
#define DELAY_PM_VCS_TO_BL ( 17 + 5 ) #define DELAY_PM_VCS_TO_BL ( 17 + 5 )
#define DELAY_PM_LCD_OFF ( 50 + 1 ) #define DELAY_PM_LCD_OFF ( 50 + 1 )

View File

@ -12,6 +12,7 @@ void rtc_unlock( );
// ------------------------------------ // ------------------------------------
#define RTC_32k_on() { RCLOE0 = 1; } #define RTC_32k_on() { RCLOE0 = 1; }
#define RTC_32k_off() { RCLOE0 = 0; }
// ------------------------------------ // ------------------------------------

View File

@ -16,7 +16,7 @@
//========================================================= //=========================================================
#define INTERVAL_TSK_SW 16 #define INTERVAL_TSK_SW 16
#define CLICK_THRESHOLD 3 #define CLICK_THRESHOLD 2
#define HOLD_THREASHOLD (u8)( 600 / INTERVAL_TSK_SW ) #define HOLD_THREASHOLD (u8)( 600 / INTERVAL_TSK_SW )

View File

@ -188,6 +188,7 @@ void tsk_sys( )
IIC_ctr_Stop( ); IIC_ctr_Stop( );
IIC_twl_Stop( ); IIC_twl_Stop( );
iic_mcu_stop( ); iic_mcu_stop( );
RTC_32k_off();
vreg_ctr[VREG_C_IRQ0] = 0; vreg_ctr[VREG_C_IRQ0] = 0;
vreg_ctr[VREG_C_IRQ1] = 0; vreg_ctr[VREG_C_IRQ1] = 0;
@ -300,6 +301,8 @@ static void chk_emergencyExit(){
else else
{ {
// デバッガなりがリセットをかけた // デバッガなりがリセットをかけた
iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, 0 );
vreg_ctr[VREG_C_STATUS] = ( vreg_ctr[VREG_C_STATUS] & 0b10011111 );
vreg_ctr[VREG_C_COMMAND0] |= REG_BIT_RESET1_REQ; vreg_ctr[VREG_C_COMMAND0] |= REG_BIT_RESET1_REQ;
renge_task_immed_add( do_command ); renge_task_immed_add( do_command );
} }

File diff suppressed because it is too large Load Diff

View File

@ -7,12 +7,12 @@ FrameCY=1043
OpenFile1=task_misc.c,0,220,220,1464,977,0,1,0,0 OpenFile1=task_misc.c,0,220,220,1464,977,0,1,0,0
OpenFile2=task_sys.c,0,308,308,1552,1065,0,256,0,0 OpenFile2=task_sys.c,0,308,308,1552,1065,0,256,0,0
OpenFile3=renge\renge.c,0,330,330,1574,1087,0,172,0,0 OpenFile3=renge\renge.c,0,330,330,1574,1087,0,172,0,0
OpenFile4=pm.c,0,286,286,1530,1043,27,542,30,0 OpenFile4=loader.c,0,154,154,1398,911,0,264,0,0
OpenFile5=loader.c,0,154,154,1398,911,0,264,0,0 OpenFile5=task_debug.c,0,324,114,1568,871,25,13,57,0
OpenFile6=task_debug.c,0,324,114,1568,871,25,13,57,0 OpenFile6=ProjectWindow
OpenFile7=ProjectWindow
PrjPos=0,2,754,3,253 PrjPos=0,2,754,3,253
OpenFile8=config.h,0,264,264,1508,1021,0,20,0,0 OpenFile7=config.h,0,264,264,1508,1021,2,19,21,0
OpenFile8=pm.c,0,411,311,1655,1068,0,781,0,0
OpenFile9=OutputWindow OpenFile9=OutputWindow
OutputPos=0,48,992,426,1226 OutputPos=0,48,992,426,1226
ActivePRJ=yav_mcu_bsr.prj ActivePRJ=yav_mcu_bsr.prj

View File

@ -11,7 +11,7 @@ T=4b0e133a
7=rtc.h 7=rtc.h
8=reboot.h 8=reboot.h
[pm.c] [pm.c]
T=4b131a22 T=4b1868e0
1=incs.h 1=incs.h
2=adc.h 2=adc.h
3=led.h 3=led.h
@ -94,7 +94,7 @@ T=4b03c375
T=4afd21cb T=4afd21cb
1=incs_loader.h 1=incs_loader.h
[sw.c] [sw.c]
T=4b04cee4 T=4b187240
1=incs.h 1=incs.h
2=i2c_twl.h 2=i2c_twl.h
3=i2c_ctr.h 3=i2c_ctr.h
@ -103,7 +103,7 @@ T=4b04cee4
6=pm.h 6=pm.h
7=rtc.h 7=rtc.h
[task_debug.c] [task_debug.c]
T=4b13151d T=4b14e842
1=incs.h 1=incs.h
2=renge\renge.h 2=renge\renge.h
3=pm.h 3=pm.h
@ -115,7 +115,7 @@ T=4b0b8f86
3=pm.h 3=pm.h
4=accero.h 4=accero.h
[task_sys.c] [task_sys.c]
T=4b0cf543 T=4b161be1
1=incs.h 1=incs.h
2=i2c_twl.h 2=i2c_twl.h
3=i2c_ctr.h 3=i2c_ctr.h
@ -141,7 +141,7 @@ T=4b023fdb
T=4b0d0086 T=4b0d0086
1=config.h 1=config.h
[config.h] [config.h]
T=4b131da1 T=4b189379
[bsr_system.h] [bsr_system.h]
T=4afd21ca T=4afd21ca
[renge\renge.h] [renge\renge.h]
@ -170,9 +170,9 @@ T=4afd21cb
[i2c_ctr.h] [i2c_ctr.h]
T=4afd21cb T=4afd21cb
[pm.h] [pm.h]
T=4b0b8f87 T=4b1637ee
[rtc.h] [rtc.h]
T=4afd21cb T=4b161be1
[adc.h] [adc.h]
T=4afd21cb T=4afd21cb
1=jhl_defs.h 1=jhl_defs.h