1. 修改Makefie
首先,修改放置驱动的目录里的Makefile(kernel/driver/misc),添置如下语句:
obj-$(CONFIG_SENSORS_MMA7660) += mma7660.o
2. 增加驱动文件
把驱动文件mma7660.c添加到kernel/driver/misc下。
3. 修改.config文件,把下面两行注释掉
# CONFIG_BOSCH_SENSOR=y
# CONFIG_BOSCH_BMA222=y
再增加下面这项
CONFIG_SENSORS_MMA7660=y
解决: G-sensor传感器 : BMA222E
需要修改文件 : 配合hwmsen_helper.c修改dts中gsensor方向。
路径:
dts: kernel/arch/arm64/boot/dts/[target].dts
hwmsen_helper.c:kernel/drivers/misc/mediatek/hwmon/hwmsen/hwmsen_helper.c
在hwmsen_helper.c中找到
以第一组为例:
{1,1,1}表示对应x,y,z对应的正方向;
{0,1,2}分别对应的机器的x,y,z坐标轴,0:x ;1:y;2:z。
dts中direction表示选择驱动中选第几组作为方向参数。
这里选的是{ { 1, -1, -1}, {0, 1, 2} } 。选第几组需要根据实际来定。
具体选择哪一个步骤:
首先选一组参数作为参考,烧入机器中,查看x,y,z是否错位,以及值是否正确。
若x,y,z错位,则调整{0,1,2}的位置;若x,y,z值不对,则修改对应x,y,z{1,-1,1}的正负
然后以此为参考,选择正确的一组作为参数。以上的排列组合并不完整,若没有需要的,则自己添加。
最后,需要G-sensor校准,实际情况下,x,y,z的值一般不会超过9.8。将机器初始位置摆正确,进入G-sensor校准即可。
#include <reg52.h>#include "inc/delay.h"
#include "inc/hc595.h"
#define uchar unsigned char
#define uint unsigned int
sbit PIN_ROTARY_A = P2^0 //引脚1接口
sbit PIN_ROTARY_B = P2^1 //引脚2接口
sbit PIN_ROTARY_C = P2^2 //按下的接口
sbit PIN_ROTARY_D = P2^3 //按下的接口
//uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}
/* 存储待发送的数据 */
/* 1->8的段码表 */
code unsigned char ucDis_Segmentcode[16] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}
/* 位码表 */
code unsigned char ucDis_Bitcode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}
uchar dis_XS[8] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d}
uchar count = 0
uchar flag
uchar Last_BMB_status
uchar Current_BMB_status
void display()
{
uchar i
dis_XS[0] = ucDis_Segmentcode[count/100]//百位
dis_XS[1] = ucDis_Segmentcode[count%100/10]//十位
dis_XS[2] = ucDis_Segmentcode[count%10]//个位
if(i <2)
{
i++
}
else
{
i = 0
}
// for (i = 0i <3i++ )
{
Send_Data(dis_XS[i], ucDis_Bitcode[i])
//PIN_ROTARY_D = 0
// Delay1ms(1)
}
}
//************************************************
void main()
{
TMOD=0x01//定时器0,工作方式1
TH0=0xD8
TL0=0xF0//给定时器装上初值,10ms中断一次
ET0=1//打开定时器中断
EA =1//打开总中断
TR0=1//启动定时器0
while(1)
{
//display()
Last_BMB_status=PIN_ROTARY_B
while(!PIN_ROTARY_A) //BMA为低电平时
{
Current_BMB_status = PIN_ROTARY_B
flag = 1//标志位置为1说明编码开关被旋转了
}
if(flag == 1)
{
flag = 0//时刻要注意这一点!给标志位清零
if((Last_BMB_status == 0)&&(Current_BMB_status == 1)) //BMB上升沿表示正转
{
count++
if(count == 255)
{
count = 0
}
}
if((Last_BMB_status == 1)&&(Current_BMB_status == 0)) //BMB下降沿表示反转
{
count--
if(count == 0)
{
count = 255
}
}
}
}
}
//***********************************************
void timer0() interrupt 1//定时器0的中断服务程序
{
TH0=0xF8 // TH0=0xD8
TL0=0xF0//再次装入初值
display()//每隔10ms显示一次
if(!PIN_ROTARY_C) //按下旋转编码开关则计数清零
{
count = 0
}
PIN_ROTARY_D = !PIN_ROTARY_D
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)