Всем доброго времени, столкнулся с такой проблемой, купил гироскоп и акселерометр (Gy-521) на чипе MPU-6050, и ЛСД1602.
Быстро все это дело собрал на макетке. Давай разбираться с регистрами, 2 дня мучал поисковики и форумы. в итоге нашел код прям для меня написанный. Честно скопировав его в компилятор (СVavr), прошил и на дисплее ерунда, значение GZH 255, GZL плавуещее от 90 до 140! На SDL и SDA вешал резюки и 1к и 4.7К и без них на работу не влияло, переводил питание меги и гироскопа на 3,3В, дисплей 5В безрезультатно. На WHO_AM_I отвечает 0х68.
#include <i2c.h>
#include <alcd.h>
#include <string.h>
#include <stdio.h>
#include <delay.h>
char a, b;
char lcd_buffer1[33];
char lcd_buffer2[33];
void main(void)
{
PORTB=0x00; DDRB=0x00;
PORTC=0x00; DDRC=0x00;
PORTD=0x00; DDRD=0x00;
i2c_init();
lcd_init(16);
i2c_start(); i2c_write(0xD0); i2c_write(0x6B); i2c_write(0x00); // PWR_MGMT_1
i2c_start(); i2c_write(0xD0); i2c_write(0x6C); i2c_write(0xC0);// PWR_MGMT_2: LP_WAKE_CTRL=40Hz
i2c_start(); i2c_write(0xD0); i2c_write(0x1A); i2c_write(0x01);//CONFIG: DLPF=1
i2c_start(); i2c_write(0xD0); i2c_write(0x1B); i2c_write(0x08);// GYRO_CONFIG: FS_SEL= 500* \s
i2c_start(); i2c_write(0xD0); i2c_write(0x1C); i2c_write(0x18);// ACCEL_CONFIG : AFS_SEL = 16g
i2c_stop();
while (1)
{
i2c_start(); //Кидаем команду "Cтарт" на шину I2C
i2c_write(0xD0); //Записываем адрес гироскопа в режиме записи.
i2c_write(0x47); //Указываем адрес регистра GYRO_ZOUT_H
i2c_start(); //Кидаем команду "Cтарт" на шину I2C
i2c_write(0xD1); //Записываем адрес гироскопа в режиме чтения.
a=i2c_read(0); //Читаем число из устройства с нулевым адресом и присваиваем переменной "а".
i2c_stop(); //Останавливаем шину.
i2c_start(); //Кидаем команду "Cтарт" на шину I2C
i2c_write(0xD0); //Записываем адрес гироскопа в режиме записи.
i2c_write(0x48); //Указываем адрес регистра GYRO_ZOUT_L
i2c_start(); //Кидаем команду "Cтарт" на шину I2C
i2c_write(0xD1); //Записываем адрес гироскопа в режиме чтения.
b=i2c_read(0); //Читаем число из устройства с нулевым адресом и присваиваем переменной "а".
i2c_stop(); //Останавливаем шину.
sprintf(lcd_buffer1,"GZH %x",a );
sprintf(lcd_buffer2,"GZL %x",b );
lcd_clear(); // Чистим дисплей
lcd_gotoxy(0,0); // Ставим курсор в начало первой строки
lcd_puts(lcd_buffer1); // Выводим значение первого буфера.
lcd_gotoxy(0,1); // Ставим курсор в начало второй строки
lcd_puts(lcd_buffer2); // Выводим значение второго буфера.
delay_ms(1000);
}
}
Быстро все это дело собрал на макетке. Давай разбираться с регистрами, 2 дня мучал поисковики и форумы. в итоге нашел код прям для меня написанный. Честно скопировав его в компилятор (СVavr), прошил и на дисплее ерунда, значение GZH 255, GZL плавуещее от 90 до 140! На SDL и SDA вешал резюки и 1к и 4.7К и без них на работу не влияло, переводил питание меги и гироскопа на 3,3В, дисплей 5В безрезультатно. На WHO_AM_I отвечает 0х68.
Спойлер
#include <mega8.h>#include <i2c.h>
#include <alcd.h>
#include <string.h>
#include <stdio.h>
#include <delay.h>
char a, b;
char lcd_buffer1[33];
char lcd_buffer2[33];
void main(void)
{
PORTB=0x00; DDRB=0x00;
PORTC=0x00; DDRC=0x00;
PORTD=0x00; DDRD=0x00;
i2c_init();
lcd_init(16);
i2c_start(); i2c_write(0xD0); i2c_write(0x6B); i2c_write(0x00); // PWR_MGMT_1
i2c_start(); i2c_write(0xD0); i2c_write(0x6C); i2c_write(0xC0);// PWR_MGMT_2: LP_WAKE_CTRL=40Hz
i2c_start(); i2c_write(0xD0); i2c_write(0x1A); i2c_write(0x01);//CONFIG: DLPF=1
i2c_start(); i2c_write(0xD0); i2c_write(0x1B); i2c_write(0x08);// GYRO_CONFIG: FS_SEL= 500* \s
i2c_start(); i2c_write(0xD0); i2c_write(0x1C); i2c_write(0x18);// ACCEL_CONFIG : AFS_SEL = 16g
i2c_stop();
while (1)
{
i2c_start(); //Кидаем команду "Cтарт" на шину I2C
i2c_write(0xD0); //Записываем адрес гироскопа в режиме записи.
i2c_write(0x47); //Указываем адрес регистра GYRO_ZOUT_H
i2c_start(); //Кидаем команду "Cтарт" на шину I2C
i2c_write(0xD1); //Записываем адрес гироскопа в режиме чтения.
a=i2c_read(0); //Читаем число из устройства с нулевым адресом и присваиваем переменной "а".
i2c_stop(); //Останавливаем шину.
i2c_start(); //Кидаем команду "Cтарт" на шину I2C
i2c_write(0xD0); //Записываем адрес гироскопа в режиме записи.
i2c_write(0x48); //Указываем адрес регистра GYRO_ZOUT_L
i2c_start(); //Кидаем команду "Cтарт" на шину I2C
i2c_write(0xD1); //Записываем адрес гироскопа в режиме чтения.
b=i2c_read(0); //Читаем число из устройства с нулевым адресом и присваиваем переменной "а".
i2c_stop(); //Останавливаем шину.
sprintf(lcd_buffer1,"GZH %x",a );
sprintf(lcd_buffer2,"GZL %x",b );
lcd_clear(); // Чистим дисплей
lcd_gotoxy(0,0); // Ставим курсор в начало первой строки
lcd_puts(lcd_buffer1); // Выводим значение первого буфера.
lcd_gotoxy(0,1); // Ставим курсор в начало второй строки
lcd_puts(lcd_buffer2); // Выводим значение второго буфера.
delay_ms(1000);
}
}
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
