Пример #1
0
void MMA845x_init(void)
{   
    uint8_t ver = 0;

    MMA485x_IO_init();
    MMA845x_writebyte(CTRL_REG1, ASLP_RATE_20MS + DATA_RATE_5MS);   
    delay_us(20);
    MMA845x_writebyte(XYZ_DATA_CFG_REG, FULL_SCALE_2G); //2G
    delay_us(20);
    MMA845x_writebyte(CTRL_REG1, ACTIVE_MASK);          //激活状态
    delay_us(20);

    ver = MMA845x_readbyte(WHO_AM_I_REG);

    if(ver == MMA8451Q_ID)
    {
        //
    }
}
Пример #2
0
void MMA845x_read(void)
{
    int8_t tmp = 0;
    
    if(cal_flag == 1)
    {
        //允许采集
        if(cal_step == 0)
        {
            cal_step = 1;
            tmp = MMA845x_readbyte(OUT_X_MSB_REG);

            if(x_s == 0)
            {
                //第一次采集
                x_s = 1;
                xmax = tmp;
                xmin = tmp;
            }

            if(tmp >= 0)
            {
                //临时值为正数时,和最大与最小值比较
                if(xmax >= 0)
                {
                    //正数时,最大值比较替换
                    if(tmp > xmax)
                    {
                        xmax = tmp;
                    }
                }
                else
                {
                    //负数时,直接替换
                    xmax = tmp;
                }

                if(xmin >= 0)
                {
                    //正数的时候,较小值比较替换
                    if(tmp < xmin)
                    {
                        xmin = tmp;
                    }
                }
                else
                {   
                    //负数的时候,直接放弃
                }
            }
            else
            {
                //临时值为负数时,进行最大值,最小值比较
                if(xmax >= 0)
                {
                    //为正数时直接放弃
                }
                else
                {
                    //为负数的时候,选择较大
                    if((-tmp) < (-xmax))
                    {
                        xmax = tmp;
                    }
                }

                if(xmin >= 0)
                {
                    //为正数,直接替换
                    xmin = tmp;
                }
                else
                {
                    //为负数时候,比较较小值
                    if((-tmp) > (-xmin))
                    {
                        xmin = tmp;
                    }
                }
            }
        }
        else if(cal_step == 1)
        {
            cal_step = 2;
            tmp = MMA845x_readbyte(OUT_Y_MSB_REG);

            if(y_s == 0)
            {
                //第一次采集
                y_s = 1;
                ymax = tmp;
                ymin = tmp;
            }
            
            if(tmp >= 0)
            {
                //临时值为正数时,和最大与最小值比较
                if(ymax >= 0)
                {
                    //正数时,最大值比较替换
                    if(tmp > ymax)
                    {
                        ymax = tmp;
                    }
                }
                else
                {
                    //负数时,直接替换
                    ymax = tmp;
                }
            
                if(ymin >= 0)
                {
                    //正数的时候,较小值比较替换
                    if(tmp < ymin)
                    {
                        ymin = tmp;
                    }
                }
                else
                {   
                    //负数的时候,直接放弃
                }
            }
            else
            {
                //临时值为负数时,进行最大值,最小值比较
                if(ymax >= 0)
                {
                    //为正数时直接放弃
                }
                else
                {
                    //为负数的时候,选择较大
                    if((-tmp) < (-ymax))
                    {
                        ymax = tmp;
                    }
                }
            
                if(ymin >= 0)
                {
                    //为正数,直接替换
                    ymin = tmp;
                }
                else
                {
                    //为负数时候,比较较小值
                    if((-tmp) > (-ymin))
                    {
                        ymin = tmp;
                    }
                }
            }
        }
        else if(cal_step == 2)
        {
            cal_step = 0;
            tmp = MMA845x_readbyte(OUT_Z_MSB_REG);

            if(z_s == 0)
            {
                //第一次采集
                z_s = 1;
                zmax = tmp;
                zmin = tmp;
            }
            
            if(tmp >= 0)
            {
                //临时值为正数时,和最大与最小值比较
                if(zmax >= 0)
                {
                    //正数时,最大值比较替换
                    if(tmp > zmax)
                    {
                        zmax = tmp;
                    }
                }
                else
                {
                    //负数时,直接替换
                    zmax = tmp;
                }
            
                if(zmin >= 0)
                {
                    //正数的时候,较小值比较替换
                    if(tmp < zmin)
                    {
                        zmin = tmp;
                    }
                }
                else
                {   
                    //负数的时候,直接放弃
                }
            }
            else
            {
                //临时值为负数时,进行最大值,最小值比较
                if(zmax >= 0)
                {
                    //为正数时直接放弃
                }
                else
                {
                    //为负数的时候,选择较大
                    if((-tmp) < (-zmax))
                    {
                        zmax = tmp;
                    }
                }
            
                if(zmin >= 0)
                {
                    //为正数,直接替换
                    zmin = tmp;
                }
                else
                {
                    //为负数时候,比较较小值
                    if((-tmp) > (-zmin))
                    {
                        zmin = tmp;
                    }
                }
            }
        }
    }
}
Пример #3
0
void component_key_alarm()
{
	const uint8 DATA_SIZE = sizeof(HMC5883L_data) + sizeof(RTC_Clock) + sizeof(MMA8451_data);
	char szTrace[piece_size];
	HMC5883L_data data_5883;
	RTC_Clock clock;
	Sensor data_8451;
	uint8 nIndex = 0;
    uint32 nVotage = 0;
	
	LED_Light(led_blue, true);
	sprintf(szTrace, "key = alarm, led = blue");
	post_trace(szTrace);
	
	for(nIndex = 0; nIndex < 60; ++nIndex) {
		HMC5883L_ReadXYZ(&data_5883);
		sprintf(szTrace, "hmc5883 x = %d, y = %d, z = %d", data_5883.x, data_5883.y, data_5883.z);
		post_trace(szTrace);
		
		clock = GetTime();			
		sprintf(szTrace, "sd2058: 20%02d:%02d:%02d %02d:%02d:%02d", clock.year, clock.month, clock.day, clock.hour, clock.minute, clock.second);
		post_trace(szTrace);
		
        if((MMA845x_readbyte(MMA845x_STATUS_00) & 0x08) != 0) { //三个轴数据更新	
            MMA845x_readData(&data_8451);
            if(data_8451.x == -1 && data_8451.y == -1 && data_8451.z == -1) {
                post_trace("MMA8451: read error data");
            } else {
                sprintf(szTrace, "MMA8451: x = %d, y = %d, z = %d", data_8451.x, data_8451.y, data_8451.z);
                post_trace(szTrace);
            }
        } else {
            post_trace("MMA8451: read error");
        }
        
        nVotage = ADC_Read();
        sprintf(szTrace, "votage = %d", nVotage);
		post_trace(szTrace);
		}
	
	memcpy(szTrace, &data_5883, sizeof(HMC5883L_data));
	memcpy(szTrace + sizeof(HMC5883L_data), &clock, sizeof(RTC_Clock));
	memcpy(szTrace + sizeof(HMC5883L_data) + sizeof(RTC_Clock), &data_8451, sizeof(MMA8451_data));
	write_file("temp", szTrace, DATA_SIZE);
	post_trace("save sensor data in file named \"temp\" in tf card");	
	
	{
		InfoBase base_info = { 0 };
		InfoState state_info = { 0 };
		
		if(get_base_info(&base_info)) {
			sprintf(szTrace, "base info, sid = %s, imei = %s", base_info.sid, base_info.imei);
			post_trace(szTrace);
		}
		
		if(get_state_info(&state_info)) {
			sprintf(szTrace, "state info, charging: %s, quantity: %d, sim card: %s, signal: %d, lac: %s, cell: %s, lng: %s, lat: %s", 
			(is_charging(&state_info) ? "yes" : "no"), get_quantity(&state_info), 
			(is_sim_card_exist(&state_info) ? (is_sim_card_valid(&state_info) ? "normal" : "error") : "lost"), get_signal(&state_info),
			state_info.lac, state_info.cell, state_info.lng, state_info.lat);
			post_trace(szTrace);
		}
	}
	post_trace("alarm completed");
	
	LED_Light(led_blue, false);
}