Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

Акселерометр LIS302DL и atmega16a

Непрочитано 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.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,459
Сказал спасибо: 3,227
Сказали Спасибо 3,513 раз(а) в 2,394 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Акселерометр LIS302DL и atmega16a

Используйте тэг CODE (решётка) или PHP (следующий).
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 19.12.2022, 01:04  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,292
Сказал спасибо: 11,863
Сказали Спасибо 4,162 раз(а) в 3,180 сообщении(ях)
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
Адрес: Москва СЗАО/МО
Сообщений: 12,292
Сказал спасибо: 11,863
Сказали Спасибо 4,162 раз(а) в 3,180 сообщении(ях)
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
Адрес: Москва СЗАО/МО
Сообщений: 12,292
Сказал спасибо: 11,863
Сказали Спасибо 4,162 раз(а) в 3,180 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Акселерометр LIS302DL и atmega16a

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

Сообщение от Ostroukhovio Посмотреть сообщение
меньшие номиналы в режиме сна устройства будут просто так кушать ток
I2C - шина без подтяжек и лог.0 формируется только при активном обмене. куда будет стекать ток с подтяжек при отсутствии обмена данными? утечки - мизер, а увеличение номиналов ведет к снижению скорости и ошибкам. кстати, можете снизить скорость до 30-50кГц и проверить практически
jump вне форума  
Непрочитано 19.12.2022, 08:42  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,459
Сказал спасибо: 3,227
Сказали Спасибо 3,513 раз(а) в 2,394 сообщении(ях)
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, время: 20:54.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.