mirror of
https://github.com/rvtr/ctr_mcu.git
synced 2025-06-19 17:15:31 -04:00

いつの間にか使われ方が変わって長手意を表していない変数などを一部名前変更 一部エラーコードで0を返しなどしてた。ERR_SUCCESSなどを返すように修正 ADCのノイズフィルタを改良 ヒステリシス+四捨五入を追加 Volテーブルを更新。最大音量を-10dbに TWLからの音量設定を無視→反映、スライダの設定と後着優先になるように修正 Volのポーリング書き込み廃止、CODECリセット時のために強制セットコマンド追加(command.4) そのつもりがなかったので修正量が割とあった。 Vol書き込み時、ベリファイ、一度だけリトライするようにした。発生頻度からすれば良かろう。評価中 バッテリー補正パラメータ更新 I2C_mにライトコマンドがきた直後に次の通信が来ると対応出来ずにバスが衝突(ウェイトコンディション理解してくれないから...)してしまっていた。 結果:一瞬BL消えや突然の電源断 一時的にスレーブアドレスを変えてNAKを返し、リトライしてもらうことにした。評価中。 電池残量ゼロ時のパターンをとりあえず高速点滅をプリセットにした。 交換した電池が0や、完全放電などでMCUがリセットされてSoCからパターンをもらってない場合にLEDが青赤とも消灯になりユーザーが心配するため お知らせLEDのフルカラー化の両対応コードが間違えていてめちゃめちゃになっていたのを修正 お知らせLEDフルカラー判定を誤ることがあった。マージンを増やした。 白箱を実機と誤判定していた。(FPGAの準備がまだ)判定方法を変更 本体設定や無線スイッチでWiFiを切ったときはフェードなしに。すぱっと変化した方がかっこいい 電源OFFにするとき、3DとWiFiはすぱっと消す。電源とお知らせはフェード(以前のまま) スリープ期間が極短いとSoC.SLP_OのH期間を取り逃す事があった。 症状:スリープに入ると電源断以外受け付けなくなる I2Cで予告してもらう。 歩数計のログポインタ進めるタイミング、秒レジスタ追加。 割り込み禁止区間の調整 電池残量ICとの通信・通信後のケアなど修正 電池残量0での強制電源断復活 .bin,.hexをリポジトリに追加 git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@198 013db118-44a6-b54f-8bf7-843cb86687b1
315 lines
7.6 KiB
C
315 lines
7.6 KiB
C
#pragma SFR
|
||
#pragma NOP
|
||
#pragma HALT
|
||
#pragma STOP
|
||
|
||
#include "incs.h"
|
||
#include "renge\renge.h"
|
||
#include "pm.h"
|
||
|
||
#include "accero.h"
|
||
#include "adc.h"
|
||
#include "i2c_mcu.h"
|
||
#include "led.h"
|
||
|
||
|
||
#ifdef _MCU_BSR_
|
||
#define ACKD ACKD1
|
||
#define ACKE ACKE1
|
||
#define COI COI1
|
||
#define IICAEN IICA1EN
|
||
#define IICRSV IICRSV1
|
||
#define IICA IICA1
|
||
#define IICAIF IICAIF1
|
||
#define IICAMK IICAMK1
|
||
#define IICAPR0 IICAPR11
|
||
#define IICAPR1 IICAPR01
|
||
#define IICCTL0 IICCTL10
|
||
#define IICE IICE1
|
||
#define IICF IICF1
|
||
#define IICS IICS1
|
||
#define IICWH IICWH1
|
||
#define IICWL IICWL1
|
||
#define LREL LREL1
|
||
#define SPD SPD1
|
||
#define SPIE SPIE1
|
||
#define STCEN STCEN1
|
||
#define STD STD1
|
||
#define SVA SVA1
|
||
#define WREL WREL1
|
||
#define WTIM WTIM1
|
||
#define TRC TRC1
|
||
#define SMC SMC1
|
||
#define DFC DFC1
|
||
#endif
|
||
|
||
|
||
|
||
// ========================================================
|
||
bit twl_ver_read;
|
||
bit twl_ntr_mode;
|
||
bit going_to_sleep;
|
||
|
||
// ========================================================
|
||
#define INTERVAL_TSK_MISC_STAT 4
|
||
|
||
|
||
|
||
|
||
/* ========================================================
|
||
ステータスレジスタなど
|
||
======================================================== */
|
||
void tsk_misc( )
|
||
{
|
||
/*
|
||
static u8 interval_task_misc = 0;
|
||
|
||
if( interval_task_misc_stat != 0 )
|
||
{
|
||
interval_task_misc_stat -= 1;
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
interval_task_misc_stat = ( INTERVAL_TSK_MISC_STAT / SYS_INTERVAL_TICK );
|
||
}
|
||
*/
|
||
|
||
//#ifdef _MCU_KE3_
|
||
// KE3では必須です。
|
||
/* ========================================================
|
||
加速度センサ割り込みピンがオリジナルマイコンには無いので
|
||
ポーリングする。
|
||
歩数計用
|
||
BSRマイコンはaccero.cで割り込みルーチンからタスク登録します。
|
||
======================================================== */
|
||
// 割り込みの取りこぼし?
|
||
if( ( vreg_ctr[VREG_C_ACC_CONFIG] & 0x03 ) != 0x00 )
|
||
{
|
||
if( ACC_VALID == 1 )
|
||
{
|
||
if( renge_task_immed_add( tsk_cbk_accero ) == ERR_SUCCESS ){
|
||
NOP();
|
||
}
|
||
}
|
||
}
|
||
//#endif
|
||
|
||
if( system_status.pwr_state == ON )
|
||
{
|
||
/* ========================================================
|
||
PM互換レジスタへの書き込み
|
||
ポーリングしかしてない。割り込み?
|
||
======================================================== */
|
||
if( !PM_IRQ_n ){
|
||
renge_task_immed_add( ntr_pmic_comm );
|
||
NOP();
|
||
}
|
||
|
||
/* ========================================================
|
||
TWLランチャーが起動したことをCTRが知りたいらしい
|
||
======================================================== */
|
||
if( twl_ver_read )
|
||
{
|
||
twl_ver_read = 0;
|
||
set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ );
|
||
}
|
||
}
|
||
|
||
// TUNE_LED ///////////////////////////////////
|
||
{
|
||
if( system_status.pwr_state != ON )
|
||
{
|
||
LED_duty_3d = 0;
|
||
}
|
||
else
|
||
{
|
||
if( vreg_ctr[VREG_C_LED_TUNE] == LED_TUNE_ILM_OFF )
|
||
{
|
||
if( LED_duty_3d != 0 )
|
||
{
|
||
LED_duty_3d -= 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( LED_duty_3d != vreg_ctr[VREG_C_LED_BRIGHT] )
|
||
{
|
||
if( LED_duty_3d < vreg_ctr[VREG_C_LED_BRIGHT] )
|
||
{
|
||
LED_duty_3d += 1;
|
||
}
|
||
else
|
||
{
|
||
LED_duty_3d -= 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
/* ========================================================
|
||
逐一起動タスク
|
||
======================================================== */
|
||
|
||
/* ========================================================
|
||
COMMANDレジスタへの書き込み
|
||
0なら呼ばれません。ケア不要
|
||
======================================================== */
|
||
task_status_immed do_command0( )
|
||
{
|
||
// command0 本体電源など
|
||
|
||
if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_GOING_TO_SLEEP )
|
||
{
|
||
going_to_sleep = 1;
|
||
}
|
||
|
||
if( ( vreg_ctr[VREG_C_COMMAND0] & ( REG_BIT_OFF_REQ | REG_BIT_RESET1_REQ | REG_BIT_FCRAM_RESET_REQ | REG_BIT_RESET2_REQ )) != 0x00 )
|
||
{
|
||
if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_OFF_REQ )
|
||
{
|
||
system_status.pwr_state = OFF_TRIG;
|
||
}
|
||
else
|
||
{
|
||
if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_RESET1_REQ )
|
||
{
|
||
PM_reset_ast( );
|
||
RESET2_ast;
|
||
FCRAM_RST_ast;
|
||
}
|
||
if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_FCRAM_RESET_REQ )
|
||
{
|
||
FCRAM_RST_ast;
|
||
}
|
||
else if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_RESET2_REQ )
|
||
{
|
||
RESET2_ast;
|
||
if( twl_ntr_mode )
|
||
{
|
||
FCRAM_RST_ast;
|
||
}
|
||
vreg_twl[ REG_TWL_INT_ADRS_MODE ] &= ~0x03;
|
||
}
|
||
wait_ms( 5 );
|
||
FCRAM_RST_neg;
|
||
PM_reset_neg();
|
||
RESET2_neg;
|
||
|
||
twl_ntr_mode = 0;
|
||
// 起動時以外はリセット不要
|
||
/*
|
||
// CODEC 不定レジスタ初期化
|
||
wait_ms( 100 );
|
||
{
|
||
u8 codec_reg_init[3] = { 0,0,0 };
|
||
iic_mcu_write( IIC_SLA_CODEC, CODEC_REG_PM, 3, codec_reg_init );
|
||
}
|
||
*/
|
||
}
|
||
}
|
||
|
||
vreg_ctr[VREG_C_COMMAND0] = 0;
|
||
return ( ERR_FINISED );
|
||
}
|
||
|
||
|
||
|
||
/* ========================================================
|
||
互換向け、TWLアプリへの割り込み
|
||
仮想レジスタの書き込み時に行います。
|
||
======================================================== */
|
||
// task_status_immed do_command1( )
|
||
|
||
|
||
|
||
u16 _dbg_rcomp;
|
||
extern u8 raw_adc_temperature;
|
||
|
||
|
||
extern u8 iic_burst_state;
|
||
extern bit temp_zone_charge_enable;
|
||
extern bit bt_chg_ready;
|
||
|
||
/* ========================================================
|
||
デバッグ用にいろいろ読んできます。
|
||
返値はデータそのもの
|
||
======================================================== */
|
||
task_status_immed tski_mcu_info_read()
|
||
{
|
||
|
||
if( SPD )
|
||
{
|
||
goto end;
|
||
}
|
||
|
||
if( STD )
|
||
{
|
||
SPIE = 1;
|
||
WDT_Restart( );
|
||
}
|
||
|
||
if( IICAIF == 0 )
|
||
{
|
||
return( ERR_CONTINUE );
|
||
}
|
||
else
|
||
{
|
||
IICAIF = 0;
|
||
}
|
||
|
||
switch( iic_burst_state++ ){
|
||
case( 0 ): // 本体種類識別
|
||
IICA = (u8)system_status.model;
|
||
break;
|
||
|
||
case( 1 ): // IICがなにかエラーでも知らない。00かFFならエラーの可能性が高い
|
||
IICA = iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VER );
|
||
break;
|
||
|
||
case( 2 ): // 電池メーカーの識別
|
||
IICA = battery_manufacturer;
|
||
break;
|
||
|
||
case( 3 ): // ガスゲージバージョン
|
||
IICA = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_VERSION );
|
||
break;
|
||
|
||
case( 4 ): // LSB
|
||
IICA = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_VERSION + 1 );
|
||
break;
|
||
|
||
case( 5 ):
|
||
IICA = (u8)( _dbg_rcomp & 0xFF );
|
||
break;
|
||
|
||
case( 6 ):
|
||
IICA = raw_adc_temperature;
|
||
break;
|
||
|
||
case( 7 ):
|
||
IICA = ( temp_zone_charge_enable | ( bt_chg_ready << 1 ) );
|
||
break;
|
||
|
||
default:
|
||
goto end;
|
||
}
|
||
WDT_Restart( );
|
||
return( ERR_CONTINUE );
|
||
|
||
end:
|
||
LREL = 1;
|
||
SPIE = 0;
|
||
IICAMK = 0;
|
||
iic_burst_state = 0;
|
||
return( ERR_FINISED );
|
||
}
|
||
|