реклама на сайте
подробности

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> atmega32 + HMC5883 (по i2c), подключение компаса к мк
Kruftin
сообщение May 13 2012, 11:18
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



Добрый день!

Возникла проблема при подключении к мк атмега32 компаса HMC5883. Устанавливаю состояние старт, а вот затем посылаю адрес для записи, в ответ на который получаю состояние регистра статуса twi равное 0х20, что означает: данные переданы, получен Not ack. Вот такие дела. Причем коды состояния я получаю только лишь при работе на частоте 1 МГц, на 8Мгц не могу получить даже состояние старт.
Код прилагаю даже в двух вариантах. Также в архив положил даташит на компас.

Вот участок кода где я проверяю статус:
Код
void HMC5843(void)
{        
    //unsigned char xh, xl, yh, yl, zh, zl;
    long xo, yo, zo;
    
    i2cSendStart();
    i2cWaitForComplete();
    
    i2cWrite_Address(0x3C);    //write to HMC
    i2cWaitForComplete();
    status_er = i2cGetStatus();
    i2cWrite_Data(0x02);    //mode register
    i2cWaitForComplete();
    i2cWrite_Data(0x00);    //continuous measurement mode
    i2cWaitForComplete();
    //status_er = i2cGetStatus();
    //i2cCheckForMT_SLA();
    i2cSendStop();

Полезные ссылки:
1)http://www.seeedstudio.com/wiki/index.php?title=Twig_-_3-axis_Compass_v1.0b


Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  compass.rar ( 457.6 килобайт ) Кол-во скачиваний: 52
 
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 13 2012, 14:24
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



А где Вы устанавливаете скорость передачи?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Kruftin
сообщение May 13 2012, 18:01
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



В архиве компас есть полный код программы(для CVAVR), так вот там есть функция:
1-й вариант
CODE
void i2cSetBitrate(unsigned short bitrateKHz)
{
//unsigned char bitrate_div;
// set i2c bitrate
// SCL freq = F_CPU/(16+2*TWBR*4^TWPS))
//TWSR &= ~(1<<TWPS0); //set zero for TWPS = 1
//TWSR &= ~(1<<TWPS1);

//calculate bitrate division
//bitrate_div = ((F_CPU/4000l)/bitrateKHz);
//if(bitrate_div >= 16)
// bitrate_div = (bitrate_div-16)/2;
//TWBR = bitrate_div;
unsigned char bitrate_div;
// set i2c bitrate
// SCL freq = F_CPU/(16+2*TWBR))
//#ifdef TWPS0
// for processors with additional bitrate division (mega128)
// SCL freq = F_CPU/(16+2*TWBR*4^TWPS)
// set TWPS to zero
cbi(TWSR, TWPS0);
cbi(TWSR, TWPS1);
//#endif
// calculate bitrate division
bitrate_div = ((F_CPU/4000l)/bitrateKHz);
if(bitrate_div >= 16)
bitrate_div = (bitrate_div-16)/2;
outb(TWBR, bitrate_div);
}


2-й вариант
Код
TWBR=0x01;    // Bit rate
    TWSR=(0<<TWPS1)|(0<<TWPS0);    // Setting prescalar bits
    // SCL freq= F_CPU/(16+2(TWBR).4^TWPS)


А сама установка скорости в основной программе называется i2cInit():
CODE
void i2cInit(void)
{
// set i2c bit rate to 40KHz
i2cSetBitrate(100);
// enable TWI (two-wire interface)
//TWCR = 1<<TWEN; // Enable TWI
sbi(TWCR, TWEN);
}
void main(void)
{
i2cInit();
delay_ms(100);
USART_Init();
#asm("sei");

while(1)
{
HMC5843();
delay_ms(200); //at least 100ms interval between measurements
if (1){
USART_SendChar('p'); //отвечаем компу
USART_SendChar('r');
USART_SendChar('i');
USART_SendChar('v');
USART_SendChar('e');
USART_SendChar('t');
USART_SendChar(zl);
USART_SendChar(zh);
USART_SendChar(error);
USART_SendChar(status_er);
delay_ms(200);
}
}
}


Сообщение отредактировал IgorKossak - May 14 2012, 06:29
Причина редактирования: [codebox] для длинного кода
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 13 2012, 18:31
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Как всё сложно- то . Moжет проще TWBR=SYSCLK/(2*SCL_Freq)-8


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Kruftin
сообщение May 13 2012, 19:41
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



Можно и так. Но вот при частоте тактирования 1МГц я доходил до успешного выставления старта на линии. А при частоте 8МГц у мк атмега32 я даже старт не могу поставить, в статусе 0xF8 вылазит. Ну не знаю может поставить наименьшую скорость на i2c, или килогерц эдак 5-10 попробовать? Даже не знаю в чем дело. Старт прошел пусть только и на 1МГц, данные отправлены, а ответ not ack. Хотя в даташите на компас написано и 100 и 400 килогерц он поддерживает(ну т.е. 400КГц максимум). К компасу припаялся, кидаю на него питание 3.3 вольта(правда это минимум по даташиту), на линии SDA, SCL тоже через резисторы 10Ком напряжение идет 3.3 на выводах компаса.

Сообщение отредактировал Kruftin - May 13 2012, 19:45
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 13 2012, 21:30
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Kruftin @ May 13 2012, 23:41) *
К компасу припаялся, кидаю на него питание 3.3 вольта(правда это минимум по даташиту), на линии SDA, SCL тоже через резисторы 10Ком напряжение идет 3.3 на выводах компаса.

Т.е всё подключено согласно этой схеме
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Kruftin
сообщение May 14 2012, 08:48
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



Именно так.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 14 2012, 10:16
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Уменя складывается впечатление , что у Вас проблема с SCL , пока Вы работаете на 1 мгц Вы где-то на грани попадания в частотную полосу . Чуть выше и всё микросхема Вас не понимает. Можете посмотреть какие значения пишутся в регистр TWBR при 1 и 8 мгц и пересчитать на SCL?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Navovvol
сообщение May 14 2012, 11:08
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



с I2C не сталкивался, но пытаясь разобраться вот на что наткнулся:
Код
bitrate_div = ((F_CPU/4000l)/bitrateKHz);
if(bitrate_div >= 16)
bitrate_div = (bitrate_div-16)/2;
outb(TWBR, bitrate_div);

допустим F_CPU= 1 000 000 , тогда
1000000/4000=250, 250/100 = 2.5
bitrate_div=2
если F_CPU = 8 000 000, тогда
8000000/4000=2000, 2000/100 = 20
20 >=16 истина, тогда
20-16=4, 4/2= 2
bitrate_div =2.

Т.О. при любой частоте запишется число 2. Или я чего то не учел ?
Go to the top of the page
 
+Quote Post
Kruftin
сообщение May 14 2012, 11:46
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



Дак а почему тогда вариант номер 2 не катит?
Код
TWBR=0x01;    // Bit rate
    TWSR=(0<<TWPS1)|(0<<TWPS0);    // Setting prescalar bits
    // SCL freq= F_CPU/(16+2(TWBR).4^TWPS)


Первый вариант взят из примера для компаса HMC5843, он по моему с точки зрения кода ничем не отличается особо.
Ну мы устанавливаем частоту передачи на i2c, по даташиту на компас она может быть до 400КГц. Дак вот не все равно что я запишу в TWBR?
Пусть TWBR = 1, тогда Частота f_SCL = 1000000/(16 +2*1*4) = 41666Гц, ну и 41666<400000,
Пусть частота будет 8Мгц, тогда 41666*8 = 333328, что тоже меньше 400000.
Go to the top of the page
 
+Quote Post
Navovvol
сообщение May 14 2012, 12:07
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



нашел вот такое примечание в даташите, правда на мегу 128
"Прим.: TWBR должен быть равен не менее 10, если TWI работает в ведущем режиме. Если TWBR меньше 10, то ведущий может генерировать некорректное состояние на линиях SDA и SCL. Проблема возникает при работе в ведущем режиме при передаче условий СТАРТ+ПОДЧИН_АДР+ ЧТЕНИЕ/ЗАПИСЬ подчиненному."
Go to the top of the page
 
+Quote Post
Kruftin
сообщение May 14 2012, 14:39
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



В даташите на атмегу32 я такого не нашел. Не ну сейчас попробую поиграться с регистром TWBR.

Ну поигрался, как только не менял TWBR все равно получаю 0х20 вместо 0х18 и 0х30 вместо 0х28 при передаче номера регистра.
Я думаю линия SCL работает нормально по крайней мере на 1МГц, однако вот с компасом чето надо думать. Ведь я получаю на линии код, что данные переданы, а подтверждения нету. Ну и от компаса ниче не получаю в регистр данных TWDR вроде(в нем лишь то что я посылал последнее это 0х3D). Может питание побольше подать на компас(не на линии, а именно на компас)?Сейчас я подаю на него минимальное 3.3 Вольта(Vdd).

Сообщение отредактировал Kruftin - May 14 2012, 15:23
Go to the top of the page
 
+Quote Post
zombi
сообщение May 14 2012, 15:38
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(Kruftin @ May 14 2012, 17:39) *
Сейчас я подаю на него минимальное 3.3 Вольта(Vdd).

Судя по приложенному Вами DS, 3.3V это не минимальное а МАКСИМАЛЬНО необходимое значение АVDD.
А на DVDD вообще максимальное 2.0V.
Или я чегото не понимаю?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 14 2012, 17:49
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Нет я ошибся
Цитата
Судя по приложенному Вами DS, 3.3V это не минимальное а МАКСИМАЛЬНО необходимое значение АVDD.
А на DVDD вообще максимальное 2.0V.
Или я чего то не понимаю?


Там стабилизатор на его плате на 2.5 В и допускается схема включения как я привёл выше

Цитата
"Прим.: TWBR должен быть равен не менее 10, если TWI работает в ведущем режиме. Если TWBR меньше 10, то ведущий может генерировать некорректное состояние на линиях SDA и SCL. Проблема возникает при работе в ведущем режиме при передаче условий СТАРТ+ПОДЧИН_АДР+ ЧТЕНИЕ/ЗАПИСЬ подчиненному."


Совершенно верно. Поэтому ему надо оставить TWBR=1 и
Цитата
поиграться
прескалером. Хотя это тоже не вариант.

Код 08 после старта возвращается?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Kruftin
сообщение May 14 2012, 18:11
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



Ну питание на платку я могу подать до 5 Вольт. Так вот TWBR, то почему я должен в единичку поставить, если у меня контроллер то в ведущем режиме работает(master)? Ну я не думаю что у меня калькулятор меня обманывает, вроде частоту верно рассчитал.
http://www.seeedstudio.com/wiki/index.php?...s_Compass_v1.0b - тут написано про платку на которой компас

После старта код 0х08 возвращается при работе на 1МГц. А при работе на 8МГц 0xF8 возвращается, что и после старта, ну это косяк скорости.
Дак вот настроить бы хоть на 1МГц. Может питание поднять у компаса, хотя ведь он вроде как посылает not ack или это в линии по умолчанию?

Сообщение отредактировал Kruftin - May 14 2012, 18:49
Go to the top of the page
 
+Quote Post

6 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th July 2025 - 11:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01478 секунд с 7
ELECTRONIX ©2004-2016