Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с MAX44009
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
kreker
Доброго дня.

Мне надо получить разовые показания освещённости с дачтика MAX44009.
Седлал всё, как описано тут.

Проблема в том, что прерывание происходит только один раз, после чего уровень на пине INT остаётся высоким постоянно (см. прикреплённые файлы i2c сессии логического анализатора и скриншоты).
И с описанием в статье не очень-то сходится: после изменения регистра конфигурации уровень на пине INT должен смениться пару раз, но этого не происходит.
Код
void setupMax44009(void)
{
  i2c_write(MAX44009_INTERRUPT_ENA_REG, 0x01); // Set ADDR: 0x01, VAL: [b7]...[b0] = 0000 0001, after RESET
  i2c_write(MAX44009_CONFIG_REG, 0xC7); // Set ADDR: 0x02, VAL: [b7]...[b0] = 1100 0111, after RESET
  i2c_write(MAX44009_THRESH_LOW_REG, 0xFF); // Set ADDR: 0x06, VAL: [b7]...[b0] = 1111 1111, after RESET
  i2c_write(MAX44009_THRESH_HIGH_REG, 0x00); // Set ADDR: 0x05, VAL: [b7]...[b0] = 0000 0000, after RESET
  i2c_write(MAX44009_THRESH_TIMER_REG, 0x00); // Set ADDR: 0x07, VAL: [b7]...[b0] = 0000 0000, after RESET
}

Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла

Нажмите для просмотра прикрепленного файла

Может кто подсказать, что сделано не так?
segment
После возникновения INT прерывания Вы выполняете чтение Interrupt Status Register?
x893
А разве не достаточно сделать ?

If the INTE bit is set to 1, then the INTS status bit is asserted if the light intensity exceeds either upper or lower threshold
limits (as specified by registers 0x05 and 0x06, respectively) for a period longer than that defined by the Threshold
Timer register (0x07). This bit resets to 0 after the host reads this register. See Table 2.
This bit is also reflected on the INT pin. When the INTS bit is set, the INT pin is asserted low, and when the INTS bit is
set to 0, the INT pin is pulled high by an external resistor.

Once this bit is set, it can be cleared either by reading the Interrupt Status register 0x00 or by writing a 0 to the Interrupt
Enable register 0x01.


и там же далее

When alerted by the INT pin going low, the master
reads the Interrupt Status register 0x00 to confirm
the source of interrupt was the IC. The master takes
appropriate action.
kreker
Цитата(Сега @ Apr 9 2016, 21:45) *
После возникновения INT прерывания Вы выполняете чтение Interrupt Status Register?

Да, это видно на последнем скриншоте.
Цитата(x893 @ Apr 9 2016, 21:53) *
А разве не достаточно сделать ?

Извиняюсь, сделать что?
Прерывания разрешены. Когда происходит прерывание, то в регистре 0х00 значение 1. При чтении он очищается, и уровень становится высоким. Но на этом всё, прерываний больше нет.
П.С. Записанные уровни целиком не вмещаются на скриншотах. Если надо более детально - скажите. Запись I2C сессии целиком - в архиве.
RabidRabbit
Вас не смущает вот это:
If the INTE bit is set to 1, then the INTS status bit is asserted if the light intensity exceeds either upper or lower threshold
limits (as specified by registers 0x05 and 0x06, respectively) for a period longer than that defined by the Threshold
Timer register (0x07)
. This bit resets to 0 after the host reads this register.

При том, что в Вашем коде:
i2c_write(MAX44009_THRESH_TIMER_REG, 0x00); // Set ADDR: 0x07, VAL: [b7]...[b0] = 0000 0000, after RESET

И при том, что в даташите:
POWER-ON RESET STATE для регистра Threshold Timer = 0xFF

И далее:
The value in this register sets the time used to control this delay. A value of 0x00 in this register (with INTE bit = 1 in the
Interrupt Enable register) configures the IC to assert the interrupt pin as soon as the light level exceeds either threshold
.
Time delay = (128xT7 + 64xT6 + 32xT5 + 16xT4 + 8xT3 + 4xT2 + 2xT1 + T0) x 100ms.

По-моему, чип всё делает в соответствии с документацией sm.gif
kreker
@RabidRabbit
Из статьи.
Step 2. Configure the part for an instantaneous and forced interrupt trigger at the end of conversion.
Write lower threshold high byte = 1111 1111.
Write higher threshold high byte = 0000 0000.
Write threshold timer = 0000 0000.

Цитата
По-моему, чип всё делает в соответствии с документацией.

А для не понимающих как это объясняет проблему с только одним прерыванием можно, пожалуйста, яснее?
Прерываний нет, потому что значение одно и тоже или что?
RabidRabbit
Я Вас неправильно понял, подумал, что постоянно выставлен сигнал прерывания.
В таком случае, я бы попробовал использовать автоматический режим, и придерживаться диаграммы со страницы 14 даташита.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.