OpenEdv-开源电子网

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

Mega16A 读取MPU06050全部都是257 求解决办法

[复制链接]

27

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2014-4-18
在线时间
94 小时
发表于 2014-4-18 18:27:08 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]/* * _1602.c * * Created: 2014/4/18 16:12:06 * Author: Mfweb */ #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> unsigned char table0[]="I love you"; unsigned char table1[]="0123456789"; /************************************************************************/ /*以下为陀螺仪定义 */ /************************************************************************/ #define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz) #define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz) #define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) #define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) #define ACCEL_XOUT_H 0x3B #define ACCEL_XOUT_L 0x3C #define ACCEL_YOUT_H 0x3D #define ACCEL_YOUT_L 0x3E #define ACCEL_ZOUT_H 0x3F #define ACCEL_ZOUT_L 0x40 #define TEMP_OUT_H 0x41 #define TEMP_OUT_L 0x42 #define GYRO_XOUT_H 0x43 #define GYRO_XOUT_L 0x44 #define GYRO_YOUT_H 0x45 #define GYRO_YOUT_L 0x46 #define GYRO_ZOUT_H 0x47 #define GYRO_ZOUT_L 0x48 #define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用) #define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读) #define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取 /*******************/ //以下为TWI状态定义 //MT:主传输 //MR:主接收 //DATA:数据 //SLA:地址 //ACK:有应答 //NOACK:无应答 /*******************/ #define START 0x80 #define RE_START 0x10 #define MT_SLA_ACK 0x18 #define MT_SLA_NOACK 0x20 #define MT_DATA_ACK 0x28 #define MT_DATA_NOACK 0x30 #define MR_SLA_ACK 0x40 #define MR_SLA_NOACK 0x48 #define MR_DATA_ACK 0x50 #define MR_DATA_NOACK 0x58 #define RD_DEVICE_ADDR 0xD1//读取的器件地址 需修改 前四位器件固定,后三位看连线,最后一位读写指令位 #define WD_DEVICE_ADDR 0xD0//写入的器件地址 /*******************/ /*******************/ //以下为TWI读写操作 /*******************/ #define Satrt() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动IIC #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //停止IIC #define Wait() {while(!(TWCR&(1<<TWINT)));} //等待中断发生 #define TestAck() (TWSR & 0xf8)//观察返回状态 #define SetAck() (TWCR|=(1<<TWEA))//做出ACK应答 #define SetNoAck (TWCR&=~(1<<TWEA))//做出NoAck应答 #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}//写数据到TWDR /*******************/ char X_Z_J[10]="0000000000",Y_Z_J[10]="0000000000",Z_Z_J[10]="0000000000",X_J_J[10]="0000000000",Y_J_J[10]="0000000000",Z_J_J[10]="0000000000"; void twi_init(void) { TWBR=0x20;//比特率发生器分频因子 TWCR=0x04;//使能神马的 TWSR=0x00;//1分频 } //IIC写入 wdata:写入的数据 waddr:写入的地址 unsigned char IIC_Write(unsigned char waddr,unsigned wdata) { Satrt();//开始信号 Wait(); if (TestAck()!=START) return 1; Write8Bit(WD_DEVICE_ADDR);//写器件地址 Wait(); if (TestAck()!=MT_SLA_ACK) return 1; Write8Bit(waddr);//写写入地址 Wait(); if (TestAck()!=MT_DATA_ACK) return 1; Write8Bit(wdata);//写数据 Wait(); if (TestAck()!=MT_DATA_ACK) return 1; Stop();//停止信号 return 0; } unsigned int IIC_Read(unsigned waddr) { unsigned int temp; Satrt();//开始信号 Wait(); if (TestAck()!=START) return 1; Write8Bit(WD_DEVICE_ADDR);//写器件地址 Wait(); if (TestAck()!=MT_SLA_ACK) return 1; Write8Bit(waddr);//写读取地址 Wait(); if (TestAck()!=MT_DATA_ACK) return 1; Satrt();//重新开始信号 Wait(); if (TestAck()!=RE_START) return 1; Write8Bit(RD_DEVICE_ADDR);//写读取器件地址 Wait(); if (TestAck()!=MR_SLA_ACK) return 1; Twi();//总线重启 Wait(); if (TestAck()!=MR_DATA_ACK) return 1; temp=TWDR; Stop(); return temp; } void init_() { DDRA=0xff; PORTA=0x00; DDRB=0xff; PORTB=0x00; DDRC|=(1<<7); PORTC|=(1<<7); DDRD|=(1<<7); PORTD|=(1<<7); } void lcd_writecom(unsigned char com) { PORTD&=~(1<<7); PORTA=com; _delay_ms(5); PORTC|=(1<<7); _delay_ms(5); PORTC&=~(1<<7); } void lcd_writedata(unsigned char data) { PORTD|=(1<<7); PORTA=data; _delay_ms(5); PORTC|=(1<<7); _delay_ms(5); PORTC&=~(1<<7); } void lcd_init() { PORTB&=~(1<<0); PORTB&=~(1<<1); PORTC&=~(1<<7);//使能 lcd_writecom(0x38); lcd_writecom(0x0c); lcd_writecom(0x06); lcd_writecom(0x01); } void mp6050_init() { IIC_Write(PWR_MGMT_1, 0x00); //解除休眠状态 IIC_Write(SMPLRT_DIV, 0x07); IIC_Write(CONFIG, 0x06); IIC_Write(GYRO_CONFIG, 0x18); IIC_Write(ACCEL_CONFIG, 0x01); } int Get1Data(unsigned char REG_Address) { char H,L; H=IIC_Read(REG_Address); L=IIC_Read(REG_Address+1); return (H<<8)+L; //合成数据 } void inttochar(int a,char* p) { itoa(a,p,10); } void Get6050(void) { inttochar(Get1Data(ACCEL_XOUT_H),X_J_J); inttochar(Get1Data(ACCEL_YOUT_H),Y_J_J); inttochar(Get1Data(ACCEL_ZOUT_H),Z_J_J); inttochar(Get1Data(GYRO_XOUT_H),X_Z_J); inttochar(Get1Data(GYRO_YOUT_H),Y_Z_J); inttochar(Get1Data(GYRO_ZOUT_H),Z_Z_J); } void display(void) { unsigned int i; lcd_writecom(0x80); for (i=0;i<7;i++) { lcd_writedata(X_J_J); _delay_ms(5); } lcd_writedata("-"); _delay_ms(5); for (i=0;i<7;i++) { lcd_writedata(Y_Z_J); _delay_ms(5); } lcd_writedata("-"); _delay_ms(5); lcd_writecom(0x80+0x40); for (i=0;i<7;i++) { lcd_writedata(X_Z_J); _delay_ms(5); } lcd_writedata("-"); _delay_ms(5); for (i=0;i<7;i++) { lcd_writedata(Y_Z_J); _delay_ms(5); } lcd_writedata("-"); _delay_ms(5); } int main(void) { unsigned int num; _delay_ms(1000); init_(); lcd_init(); twi_init(); mp6050_init(); _delay_ms(1000); while(1) { Get6050(); display(); _delay_ms(200); lcd_writecom(0x02); } }[/mw_shl_code]
 
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-18 20:08:46 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-10 05:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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