Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
19.12.2022, 00:10
|
|
Частый гость
Регистрация: 19.12.2022
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Акселерометр 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.
Причина: оформление
|
|
|
|
19.12.2022, 00:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,985
Сказал спасибо: 3,007
Сказали Спасибо 3,182 раз(а) в 2,160 сообщении(ях)
|
Re: Акселерометр LIS302DL и atmega16a
Используйте тэг CODE (решётка) или PHP (следующий).
__________________
Экзорцист 40-го уровня.
|
|
|
|
19.12.2022, 01:04
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,254
Сказал спасибо: 11,168
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Акселерометр LIS302DL и atmega16a
Ostroukhovio, таки стоит посмотреть на происходящее на линиях I2C прибором - ЛА, осциллограф, сниффер.…
При отладке стоит подтягивающие резисторы поставить номиналом поменьше, проблема может и оттуда идти…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
19.12.2022, 01:32
|
|
Частый гость
Регистрация: 19.12.2022
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Акселерометр LIS302DL и atmega16a
Беда в том что меньшие номиналы в режиме сна устройства будут просто так кушать ток) а Подачу питания в подтяжки на время работы шины через pnp я по запарке не заложил.
|
|
|
|
19.12.2022, 02:42
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,254
Сказал спасибо: 11,168
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
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.
|
|
|
|
19.12.2022, 07:09
|
|
Частый гость
Регистрация: 19.12.2022
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Акселерометр LIS302DL и atmega16a
Докладываю)
VDD - 3.3v от LDO,
CS - подтяжка 10к на VDD,
SDO - подключен к GND.
А что аксель можно перевести тоже в некое выключеное состояние и чтобы он при этом генерил прерывания?
PS: Очень большое опасение по непропаю акселя, но как я понимаю раз он отдает свое имя по i2c, то как минимум интерфейс и адрес ему на схемном уровне заданы верно?
Последний раз редактировалось Ostroukhovio; 19.12.2022 в 07:41.
|
|
|
|
19.12.2022, 07:46
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,254
Сказал спасибо: 11,168
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Акселерометр LIS302DL и atmega16a
Ostroukhovio, посмотрите на описание контакта VDD_IO для начала, потом проверьте состояние SDA и SCK контактов при отсутствии передачи данных…
Ну и напряжение на контакте CS при этом стоит проверить
Давно возился с этим чипом, сейчас нет под рукой проверить.
Хотя, если у Вас задача отслеживать именно положение в пространстве, а не перемещение - гироскоп как-то удобнее. Акселерометр занят измерением ускрений перемещения…
Посмотрел в записках сумасшедшего - чтение проводилось для всех регистров по прерыванию…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
19.12.2022, 08:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,982
Сказал спасибо: 0
Сказали Спасибо 4,941 раз(а) в 2,370 сообщении(ях)
|
Re: Акселерометр LIS302DL и atmega16a
Сообщение от Ostroukhovio
|
меньшие номиналы в режиме сна устройства будут просто так кушать ток
|
I2C - шина без подтяжек и лог.0 формируется только при активном обмене. куда будет стекать ток с подтяжек при отсутствии обмена данными? утечки - мизер, а увеличение номиналов ведет к снижению скорости и ошибкам. кстати, можете снизить скорость до 30-50кГц и проверить практически
|
|
|
|
19.12.2022, 08:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,985
Сказал спасибо: 3,007
Сказали Спасибо 3,182 раз(а) в 2,160 сообщении(ях)
|
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.
|
|
|
|
19.12.2022, 10:39
|
|
Частый гость
Регистрация: 19.12.2022
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
В данный момент как раз на 50кгц шина настроена.
Кстати, помимо включения самого модуля i2c, требуется доп конфигурация ног?
Подпаял к линиям i2c в параллель по 4.7к, фронты по осциллографу на линиях выровнял. С частотой шины игрался от 18 до 100кГц, результат тот же.
Следовательно МК так и не пишет в аксель
Последний раз редактировалось mike-y-k; 20.12.2022 в 17:19.
Причина: 6.6
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:55.
|
|