Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 19.12.2022, 00:10  
Ostroukhovio
Частый гость
 
Регистрация: 19.12.2022
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
Ostroukhovio на пути к лучшему
По умолчанию Акселерометр LIS302DL и atmega16a

Народ добрый вечер.
Уже два дня колупаю связку atmega16a с lis302dltr. Хочу добиться чтобы аксель выдавал на своих выводах прерывания при двойном клике. На данный момент считывается только имя акселя 0х3b и на этом все. Так как устройство проектировалось под ультранизкое энергопотребление, то и линии i2c подтянуты к питанию через 51к.
Поделитесь кто-нибудь пожалуйста кодом правильной реализации i2c и настройки данного акселерометра.

Сделал очень урезанную инициализацию акселя:

Код:
	uint8_t CTRL_REG1 = 0x47;
	ACEL_Write(0x20, CTRL_REG1);

И прямую проверку на светодиодах читая регистр OUT_Z:

Код:
	if(ACEL_Read(0x2d)›127){ 
		fLED_Driver(1,3,1);
	}else{
		fLED_Driver(1,1,1);
	}

По логике, вращая плату, в какой-то момент должно происходите переключение светодиодов в одну сторону и соответственно обратно при обратном повороте. Но у меня судя по коду регистр всегда возвращает значение меньше 127.


Можно сделать вывод, если я не ошибаюсь, что даже запись регистра запуска CTRL_REG1 не происходит, раз аксель молчит.

Сейчас I2C реализовано вот так:

Код:
uint8_t ACEL_Write(uint8_t addr, uint8_t data){
	I2C_Start(I2C_device_w);
	I2C_Write(addr);
	I2C_Write(data);
	I2C_Stop();
}

uint8_t ACEL_Read(uint8_t addr){
	uint8_t InData;
	I2C_Start(I2C_device_w);
	I2C_Write(addr);
	I2C_Repeated_Start(I2C_device_r);
	InData = I2C_Read_Ack();
	//I2C_Read_Nack();
	I2C_Stop();
	return InData;
}

uint8_t I2C_Start(char write_address)/* I2C start function */
{
    uint8_t status;		/* Declare variable */
    TWCR=(1‹‹TWSTA)|(1‹‹TWEN)|(1‹‹TWINT); /* Enable TWI, generate START */
    while(!(TWCR&(1‹‹TWINT)));	/* Wait until TWI finish its current job */
    
    TWDR=write_address;		/* Write SLA+W in TWI data register */
    TWCR=(1‹‹TWEN)|(1‹‹TWINT);	/* Enable TWI & clear interrupt flag */
    while(!(TWCR&(1‹‹TWINT)));	/* Wait until TWI finish its current job */
}
uint8_t I2C_Repeated_Start(char read_address) /* I2C repeated start function */
{
    uint8_t status;		/* Declare variable */
    //TWCR=(1‹‹TWSTA)|(1‹‹TWEN)|(1‹‹TWINT);/* Enable TWI, generate start */
    //while(!(TWCR&(1‹‹TWINT)));	/* Wait until TWI finish its current job */
    			/* Return 0 for repeated start condition fail */
    TWDR=read_address;		/* Write SLA+R in TWI data register */
    TWCR=(1‹‹TWEN)|(1‹‹TWINT);	/* Enable TWI and clear interrupt flag */
    while(!(TWCR&(1‹‹TWINT)));	/* Wait until TWI finish its current job */
}
uint8_t I2C_Write(char data)	/* I2C write function */
{
    uint8_t status;		/* Declare variable */
    TWDR=data;			/* Copy data in TWI data register */
    TWCR=(1‹‹TWEN)|(1‹‹TWINT);	/* Enable TWI and clear interrupt flag */
    while(!(TWCR&(1‹‹TWINT)));	/* Wait until TWI finish its current job */
}
char I2C_Read_Ack(void)		/* I2C read ack function */
{
    TWCR=(1‹‹TWEN)|(1‹‹TWINT)|(1‹‹TWEA); /* Enable TWI, generation of ack */
    while(!(TWCR&(1‹‹TWINT)));	/* Wait until TWI finish its current job */
    return TWDR;			/* Return received data */
}
char I2C_Read_Nack(void)		/* I2C read nack function */
{
    TWCR=(1‹‹TWEN)|(1‹‹TWINT);	/* Enable TWI and clear interrupt flag */
    while(!(TWCR&(1‹‹TWINT)));	/* Wait until TWI finish its current job */
    return TWDR;		/* Return received data */
}
void I2C_Stop(void)			/* I2C stop function */
{
    TWCR=(1‹‹TWSTO)|(1‹‹TWINT)|(1‹‹TWEN);/* Enable TWI, generate stop */
    while(TWCR&(1‹‹TWSTO));	/* Wait until stop condition execution */
}
Реклама:

Последний раз редактировалось mike-y-k; 19.12.2022 в 00:52. Причина: оформление
Ostroukhovio вне форума  
Непрочитано 19.12.2022, 00:42  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,744
Сказал спасибо: 2,885
Сказали Спасибо 3,094 раз(а) в 2,092 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Акселерометр LIS302DL и atmega16a

Используйте тэг CODE (решётка) или PHP (следующий).
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 19.12.2022, 01:04  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,853 раз(а) в 2,924 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Акселерометр LIS302DL и atmega16a

Ostroukhovio, таки стоит посмотреть на происходящее на линиях I2C прибором - ЛА, осциллограф, сниффер.…
При отладке стоит подтягивающие резисторы поставить номиналом поменьше, проблема может и оттуда идти…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 19.12.2022, 01:32  
Ostroukhovio
Частый гость
 
Регистрация: 19.12.2022
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
Ostroukhovio на пути к лучшему
По умолчанию Re: Акселерометр LIS302DL и atmega16a

Беда в том что меньшие номиналы в режиме сна устройства будут просто так кушать ток) а Подачу питания в подтяжки на время работы шины через pnp я по запарке не заложил.
Ostroukhovio вне форума  
Непрочитано 19.12.2022, 02:42  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,853 раз(а) в 2,924 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Акселерометр LIS302DL и atmega16a

Ostroukhovio, у Вас пока идет разработка и отладка кода - на это время уменьшите номинал pullup резисторов для уточнения причин неработоспособности…
Собственно их потребление спокойно снижается установкой Z состояния портов и отключением акселерометра или переводом его интерфейса в Z состояние - в этом случае току некуда течь…
Ну и проще всего проверить обмен данных уже вышеописанными средствами - нужно убедиться в наличии обмена, характеристиках фронтов с уровнями, содержимом данных и правильностью квитирования (S/P/A/N)

PS A какие уровни на 1, 7, 12 контактах LSI302DL?
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 19.12.2022 в 02:56.
mike-y-k вне форума  
Непрочитано 19.12.2022, 07:09  
Ostroukhovio
Частый гость
 
Регистрация: 19.12.2022
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
Ostroukhovio на пути к лучшему
По умолчанию Re: Акселерометр LIS302DL и atmega16a

Докладываю)
VDD - 3.3v от LDO,
CS - подтяжка 10к на VDD,
SDO - подключен к GND.

А что аксель можно перевести тоже в некое выключеное состояние и чтобы он при этом генерил прерывания?

PS: Очень большое опасение по непропаю акселя, но как я понимаю раз он отдает свое имя по i2c, то как минимум интерфейс и адрес ему на схемном уровне заданы верно?

Последний раз редактировалось Ostroukhovio; 19.12.2022 в 07:41.
Ostroukhovio вне форума  
Непрочитано 19.12.2022, 07:46  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,853 раз(а) в 2,924 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Акселерометр LIS302DL и atmega16a

Ostroukhovio, посмотрите на описание контакта VDD_IO для начала, потом проверьте состояние SDA и SCK контактов при отсутствии передачи данных…
Ну и напряжение на контакте CS при этом стоит проверить
Давно возился с этим чипом, сейчас нет под рукой проверить.
Хотя, если у Вас задача отслеживать именно положение в пространстве, а не перемещение - гироскоп как-то удобнее. Акселерометр занят измерением ускрений перемещения…
Посмотрел в записках сумасшедшего - чтение проводилось для всех регистров по прерыванию…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 19.12.2022, 08:23  
jump
Почётный гражданин KAZUS.RU
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,981
Сказал спасибо: 0
Сказали Спасибо 4,939 раз(а) в 2,369 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: Акселерометр LIS302DL и atmega16a

Сообщение от Ostroukhovio Посмотреть сообщение
меньшие номиналы в режиме сна устройства будут просто так кушать ток
I2C - шина без подтяжек и лог.0 формируется только при активном обмене. куда будет стекать ток с подтяжек при отсутствии обмена данными? утечки - мизер, а увеличение номиналов ведет к снижению скорости и ошибкам. кстати, можете снизить скорость до 30-50кГц и проверить практически
jump вне форума  
Непрочитано 19.12.2022, 08:42  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,744
Сказал спасибо: 2,885
Сказали Спасибо 3,094 раз(а) в 2,092 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Акселерометр LIS302DL и atmega16a

ЕМНИП, финальное (оно же первое, в данном случае) чтение из I2C ведущий должен завершить NACK'ом. Что-то уже испробовано... попробуйте и так:
Код:
uint8_t ACEL_Read(uint8_t addr){
	uint8_t InData;
	I2C_Start(I2C_device_w);
	I2C_Write(addr);
	I2C_Repeated_Start(I2C_device_r);
	InData = I2C_Read_Nack();
	I2C_Stop();
	return InData;
}

P.S. Кстати, алгоритм линеен и не учитывает, например, отсутствие ACK от ведомого после "***_Start(I2C_device_*)".
__________________
Экзорцист 40-го уровня.

Последний раз редактировалось ForcePoint; 19.12.2022 в 08:45.
ForcePoint вне форума  
Непрочитано 19.12.2022, 10:39  
Ostroukhovio
Частый гость
 
Регистрация: 19.12.2022
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
Ostroukhovio на пути к лучшему
По умолчанию

В данный момент как раз на 50кгц шина настроена.
Кстати, помимо включения самого модуля i2c, требуется доп конфигурация ног?

Подпаял к линиям i2c в параллель по 4.7к, фронты по осциллографу на линиях выровнял. С частотой шины игрался от 18 до 100кГц, результат тот же.
Следовательно МК так и не пишет в аксель

Последний раз редактировалось mike-y-k; 20.12.2022 в 17:19. Причина: 6.6
Ostroukhovio вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
uart Акселерометр и atmega8 WindoЗavr Микроконтроллеры, АЦП, память и т.д 23 10.02.2015 08:16
Акселерометр MMA7455 I2C не дает ACK Lexi Микроконтроллеры, АЦП, память и т.д 10 25.11.2013 18:51
Акселерометр MMA7455 немогу соединиться по I2C Maxim39 Микроконтроллеры, АЦП, память и т.д 1 26.01.2012 07:27
Посоветуйте акселерометр Plantis Микроконтроллеры, АЦП, память и т.д 6 14.07.2010 00:58
Микроконтроллер и Акселерометр - что посоветуете? expolit Электроника - это просто 4 18.01.2010 19:17


Часовой пояс GMT +4, время: 05:09.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot