?? sys_main.c
字號:
/****************************************************************************************************************
** IIII NN NN VV VV EEEEEE NN NN TTTTTTTT RRRRRR OOOOO NN NN IIII CCCCCC **
** II NN N NN VV VV EE NN N NN TT RR RR OO OO NN N NN II CC **
** II NN N NN VV VV EEEEEE NN N NN TT RRRRRR OO OO NN N NN II CCC **
** II NN N NN VV VV EE NN N NN TT RR RR OO OO NN N NN II CC **
** IIII NN NN VVV EEEEEE NN NN TT RR RR OOOOO NN NN IIII CCCCCC **
****************************************************************************************************************/
#include "includes.h"
unsigned short get_Meter_ID(void);
const EVENT_PROC_PTR _sys_evt_proc[]=
{
_on_seconds,
_on_key_down,
_on_key_press,
};
#define MAX_DETECTION_VOLTAGE 10 //2.2V + 10 = 3.2V
unsigned char AD_conv_phase = 0;
unsigned char AD_conv_times = 0;
unsigned long AD_conv_result[AD_MAX_CHANNEL] = {0};
unsigned char report_status = 0;
unsigned short meter_id = 0;
unsigned char battery_voltage = 0;
unsigned char system_switch = 1;
unsigned char check_dog_timer_flag = 0;
unsigned char start_check_dog_flag = 0;
__directmap const METER_ID_INFO _id_info = {0x0f00};
unsigned char Convert2ProgramMode(void)
{
unsigned char i = 0;
do{
PFS = 0;
PFCMD = 0xA5;
FLPMC = 0x01;
FLPMC = 0xFE;
FLPMC = 0x01;
if(i++ > 5)
return 1;
}while(PFS & 0x01);
return 0;
}
unsigned char Convert2UserMode(void)
{
unsigned char i = 0;
do{
PFS = 0;
PFCMD = 0xA5;
FLPMC = 0x00;
FLPMC = 0xFF;
FLPMC = 0x00;
if(i++ > 5)
return 1;
}while(PFS & 0x01);
return 0;
}
unsigned char flash_erase_block(unsigned short addr)
{
unsigned char i = 0;
do{
FLCMD = 0x03;
FLAPH = addr >> 8;
FLAPL = 0x00;
FLAPHC = addr >> 8;
FLAPLC = 0x00;
PFS = 0;
HALT();
if(i++ > 5)
return 1;
}while(PFS & 0x06);
return 0;
}
unsigned char flash_program_byte(unsigned short addr, unsigned char value)
{
FLCMD = 0x05;
FLAPH = addr >> 8;
FLAPL = addr & 0xff;
FLW = value;
PFS = 0;
HALT();
if(PFS & 0x06)
return 1;
return 0;
}
unsigned char verify_meter_id()
{
unsigned short new_id, i = 0, errno = 1;
meter_id = 0xFFFF;
if(!ID_10X)
{
if(_id_info.rom_meter_id_status == METER_ID_STATUS_WORD)
{
meter_id = _id_info.rom_meter_id_value;
return 0;
}
}
if(Convert2ProgramMode())
return 1;
new_id = get_Meter_ID();
if(new_id == 0xffff)
new_id = 0x2143;
while(1)
{
if(flash_program_byte( (unsigned short)(&(_id_info.rom_meter_id_status))+1, 0xFE))
goto fl_err_proc;
if(flash_program_byte( (unsigned short)(&(_id_info.rom_meter_id_status)), 0xCA))
goto fl_err_proc;
if(flash_program_byte( (unsigned short)(&(_id_info.rom_meter_id_value))+1, new_id>>8))
goto fl_err_proc;
if(flash_program_byte( (unsigned short)(&(_id_info.rom_meter_id_value)), new_id))
goto fl_err_proc;
errno = 0;
break;
fl_err_proc:
if(flash_erase_block((unsigned short)(&(_id_info.rom_meter_id_status))))
{
break;
}
else
{
if(i++ > 5)
break;
continue;
}
}
Convert2UserMode();
if(errno)
return 1;
meter_id = _id_info.rom_meter_id_value;
return 0;
}
void test_LCDB(void)
{
LCD_LIGHT_ON();
_delay(8000);
LCD_LIGHT_OFF();
}
unsigned short get_Meter_ID(void)
{
unsigned short meterID = 0, *ram_start_addr = 0xfe80;
unsigned char i;
for(i = 0; i < 64; i++)
{
meterID += *ram_start_addr;
ram_start_addr++;
}
return meterID;
}
void get_Battery_Voltage(void)
{
unsigned short int_flag = 0, j;
unsigned short test_voltage = (RF_TIME_CALIBR + 3);
unsigned char intStatus = PMK1,test_flag = 1;
PMK1 = 1;
P12.1 = 1;
#ifndef RF_MCU_DELAY
RFXX_WRT_CMD(0xD000);
#endif
RFXX_WRT_CMD(test_voltage);
RFXX_WRT_CMD(0xC007);
j = 0;
//LED = 0;
while(test_flag)
{
if(j++ > 500)
{
if((test_voltage & 0x1f) < MAX_DETECTION_VOLTAGE)
{
test_voltage++;
RFXX_WRT_CMD(test_voltage);
_clr_wdt();
_delay(100);
j = 0;
}
else
break;
}
while(!RF_IRQ)
{
int_flag = RFXX_WRT_CMD(0xcc00);
_clr_wdt();
if(int_flag & 0x04)
{
test_flag = 0;
break;
}
}
_clr_wdt();
}
RFXX_WRT_CMD(RF_TIME_CALIBR);
//RFXX_WRT_CMD(0xC220);
RFXX_WRT_CMD(RF_TIME_SET);
battery_voltage = test_voltage & 0x1f;
//LED = 1;
//RFXX_WRT_CMD(0xFE00);
//RF_init();
#if 0
RFXX_WRT_CMD(0xC001);
RFXX_WRT_CMD(0xC2A0);
RFXX_WRT_CMD(0xE219);
RFXX_WRT_CMD(0xC003);
#endif
PMK1 = intStatus;
#ifndef RF_MCU_DELAY
RFXX_WRT_CMD(0xD040);
#endif
P12.1 = 0;
}
/* mcu power up or reboot
*/
void _mcu_init(void)
{
unsigned char temp_stabset, temp_stabwait;
_disable_interrupt();
//Cpu clock and Fxp are Fx/2
PCC = 0;
PPCC = 0;
PMC2=0x0F; //AD input mode
PM2 = 0xFf;
ADM = 0x10; //2.8~4V: 15us
PM3=P3DIR_VAL;
P3=P3OUT_VAL;
//PU3 = BIT0;
PM4= BIT3; //P4DIR_VAL;
P4=P4OUT_VAL;
//PU4 = BIT1|BIT3|BIT5;
PM12=P12DIR_VAL;
P12=P12OUT_VAL;
P13.0 = 0;
LSRSTOP = 0;
WDTM = 0x67;
}
void _device_init(void)
{
unsigned char i;
_disable_interrupt();
if(verify_meter_id())
{
while(1)
{
LED = 0;
_delay(2000);
_clr_wdt();
LED = 1;
_delay(2000);
}
}
_clr_wdt();
RF_init();
get_Battery_Voltage();
memset(AD_conv_result, 0, AD_MAX_CHANNEL*sizeof(unsigned long));
AD_conv_phase = AD_MAX_CHANNEL;
_sys_time.seconds = 0;
_clr_wdt();
//enable H1 Timer to clear watchdog period
TMHMD1 = 0x50;
CMP01 = 234; //125ms //234
_enable_interrupt();
}
void init_check_watch_dog_time()
{
//unsigned char old_dog_value, new_dog_value;
TMC00 = 0;
CRC00 = 0xffff;
PRM00 = 0x02; // 8MHz/256
start_check_dog_flag = 1;
//check_dog_timer_flag = 1;
}
int main(void)
{
unsigned char pos;
_sys_evt_word_t int_event_mask;
_mcu_init();
_device_init();
init_check_watch_dog_time();
PMK0 = 0;
//PMK1 = 0;
TMMKH1 = 0;
TMHE1 = 1; //start watch timer
test_evt:
int_event_mask = 1;
for(pos=0; pos<SYS_EVENT_MAX; pos++)
{
if(int_event_mask & SYS_EVT_VAR)
{
SYS_EVT_PROC(pos);
_sys_evt_del(int_event_mask);
_clr_wdt();
goto test_evt;
}
if((SYS_EVT_VAR & SYS_EVENT_MASK) == 0) {
break;
}
int_event_mask <<= 1;
}
_clr_wdt();
if((AD_conv_phase < AD_MAX_CHANNEL) || _key_flag || check_dog_timer_flag)
{
HALT();
}
else
{
STOP();
}
goto test_evt;
return 0;
}
void AD_start()
{
//P12.3 = 1;
ADCE = 1;
AD_conv_phase = 0;
AD_conv_times = 0;
ADS = AD_conv_phase;
NOP();
NOP();
ADCS = 1; //Start convert
ADMK = 0; //Enable interrupt
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -