|
|
  |
atmega32 + HMC5883 (по i2c), подключение компаса к мк |
|
|
|
May 13 2012, 11:18
|

Частый гость
 
Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
May 13 2012, 18:01
|

Частый гость
 
Группа: Участник
Сообщений: 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] для длинного кода
|
|
|
|
|
May 14 2012, 11:08
|
Частый гость
 
Группа: Участник
Сообщений: 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. Или я чего то не учел ?
|
|
|
|
|
May 14 2012, 11:46
|

Частый гость
 
Группа: Участник
Сообщений: 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.
|
|
|
|
|
May 14 2012, 15:38
|

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

|
Цитата(Kruftin @ May 14 2012, 17:39)  Сейчас я подаю на него минимальное 3.3 Вольта(Vdd). Судя по приложенному Вами DS, 3.3V это не минимальное а МАКСИМАЛЬНО необходимое значение АVDD. А на DVDD вообще максимальное 2.0V. Или я чегото не понимаю?
|
|
|
|
|
May 14 2012, 17:49
|

Профессионал
    
Группа: Свой
Сообщений: 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 после старта возвращается?
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
May 14 2012, 18:11
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|