OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4792|回复: 4

关于MMA7660加速度传感器程序进入死循环的问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-5-12 12:14:22 | 显示全部楼层 |阅读模式
5金钱
我用的是原子哥给的MMA7660程序,希望在OLED上面显示7660的x,y,z的值和18b20的温度值,可是加上下面程序中红色背景的程序后OLED上面就不显示主程序中while中的程序,我仿真了一下觉得是进入了蓝色背景中temp=MMA7660_RD_Reg(dir);
}while(temp&(1<<6));//需要再次读取 的死循环 ,我是个菜鸟,希望大神们帮帮我,挺急的
#include "sys.h" 
#include "usart.h"
#include "delay.h" 
#include "mma7660.h"    
#include "oled.h" 
#include "ds18b20.h"

//写MMA7660寄存器 
void MMA7660_WR_Reg(u8 addr,u8 val)  

IIC_Start();     
IIC_Send_Byte(MMA_WRITE);     //发送写器件指令  
IIC_Wait_Ack();    
IIC_Send_Byte(addr);   //发送寄存器地址 
IIC_Wait_Ack();       
IIC_Send_Byte(val);     //发送值     
IIC_Wait_Ack();          
IIC_Stop(); //产生一个停止条件    

//读MMA7660寄存器 
u8 MMA7660_RD_Reg(u8 addr)

u8 temp=0;   
IIC_Start();     
IIC_Send_Byte(MMA_WRITE); //发送写器件指令  
temp=IIC_Wait_Ack();    
IIC_Send_Byte(addr);   //发送寄存器地址 
temp=IIC_Wait_Ack();       
IIC_Start();     //重新启动 
IIC_Send_Byte(MMA_READ); //发送读器件指令  
temp=IIC_Wait_Ack();    
temp=IIC_Read_Byte(0); //读取一个字节,不继续再读,发送NAK        
IIC_Stop(); //产生一个停止条件     
return temp; //返回读到的值 

//dir:0,X;1,Y;2,Z 
//返回值:+31~-32; 
signed char MMA7660_XYZ_RD(u8 dir) 

u8 i,j; 
u8 temp; 
signed char res; 
signed char val[10]; 
for(i=0;i<10;i++)//读取 

do 


temp=MMA7660_RD_Reg(dir);
 
}while(temp&(1<<6));//需要再次读取  
res=temp&0x1f;//得到真正的数值 
if(temp&(1<<5))val=res-31;//反方向 
else val=res;//正方向 

for(i=0;i<9;i++)//排序 

for(j=i+1;j<10;j++) 

if(val>val[j])//升序排列 

res=val
val=val[j]; 
val[j]=res; 


}   
res=0; 
for(i=3;i<7;i++)res+=val;     
return res/4;//取平均值 
}
void MMA7660_Init(void) 
{    
IIC_Init();
MMA7660_WR_Reg(MMA_MODE,0X00); //配置寄存器的时候,必须进入standby模式 
MMA7660_WR_Reg(MMA_SPCNT,0X00);  
MMA7660_WR_Reg(MMA_INTSU,0X00); //不设置中断 
MMA7660_WR_Reg(MMA_PDET,0X75);  // 
MMA7660_WR_Reg(MMA_SR,0X00);  
MMA7660_WR_Reg(MMA_PD,0X17);  
MMA7660_WR_Reg(MMA_MODE,0X01); //配置寄存器的时候,必须进入standby模式     
}  
//显示x,y,z的值
int main(void) 

short temp;
signed char x,y,z; 
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化
uart_init(72,9600);  //串口初始化   
OLED_Init(); //初始化液晶  
DS18B20_Init();
MMA7660_Init();

OLED_ShowString(0,0,"designed by ZC");  
OLED_ShowString(0,16,"x=   y=   z=");  
  OLED_ShowString(0,48,"n=");     
OLED_Refresh_Gram(); 

while(1) 
{     
OLED_Refresh_Gram();

temp=DS18B20_Get_Temp();
OLED_ShowString(0,32,"Temp is:");//显示温度
OLED_ShowNum(65,32,temp/10,2,16);
OLED_ShowString(80,32,".");
OLED_ShowNum(90,32,temp%10,1,16);
OLED_ShowString(100,32,"C"); 

x=MMA7660_XYZ_RD(MMA_XOUT); 
y=MMA7660_XYZ_RD(MMA_YOUT); 
z=MMA7660_XYZ_RD(MMA_ZOUT);      
  OLED_ShowNum(15,16,x,2,16);
OLED_ShowNum(56,16,y,2,16);
OLED_ShowNum(100,16,z,2,16);

delay_ms(300); 



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-12 12:21:12 | 显示全部楼层
1、抓取IIC时序分析
2、jtag仿真
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-6-4
在线时间
0 小时
发表于 2015-6-4 10:03:19 | 显示全部楼层

可以把代码发给我么 ?亲

回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-8-29
在线时间
0 小时
发表于 2015-7-5 15:39:19 | 显示全部楼层
我有库函数的程序,但我学的是寄存器的。我驱动MMA7660也是头疼
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-8-29
在线时间
0 小时
发表于 2015-7-5 15:45:19 | 显示全部楼层
MMA_XOUT
MMA_YOUT
MMA_ZOUT    找不到这三个的原值是多少
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 14:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表