Atmega8 + Mpu-6050 LCD1602A

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср апр 09, 2014 13:53:14
Откуда: Владивосток

Сообщение edj90 »

Всем доброго времени, столкнулся с такой проблемой, купил гироскоп и акселерометр (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 <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);

}
}
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Реклама
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср апр 09, 2014 13:53:14
Откуда: Владивосток

Сообщение edj90 »

И так разобрался с температурой:
Создаем переменную A (допустим 0b11111111) для записи туда СТАРШИХ значений,
B (допустим 0b00000011) для МЛАДШИХ, затем переменную D (2 байта, не больше!!!).
Затем воссоединяем D=(A<<8)|B; в скобках получится так (0b11111111 00000000), то есть пропихнем глубже, затем побитное и (|)
В итоге D=0b11111111 00000011
Затем еще одна переменная с плавающей точкой F, и по такой формуле переводим в градусы. F=D\340+36.53
Вот так.

Для гироскопа и акселерометра "склеиваем" также значения и делим на значение в таблице (пункт 4.20) смотря как настроена чувствительность. У меня появились какие значения, которые более менее адекватно начали реагировать на шевеления MPUшки.
Ломаю голову дальше....
Когда дойдет до ума, так и перестану задавать глупые вопросы!!!
Реклама
Ответить

Вернуться в «Периферия»