Помогите с реализацией управление по I2C
- Войдите на сайт для отправки комментариев
Добрый день.
Не могу разобраться с управлением внешний устройств по I2C шине.
Прочитал несколько факов, разобрал кучу готовых примеров, но не могу понять как организовать работу контроллера так, чтобы он не дергал постоянно шину.
Имеем ардуино и внешнее устройство TDA7313 (звуковой процессор с селектором каналов и тп).
Ардуина управляется 1 кнопкой, по которой должна происходить смена режимов и соответственно совершаться посыл о смене режима в шину, вместе с посылом зажигается 1 из 2 светодиодов. Так же к мк подключено 2 потенциометра для управления громкостью и тембром.
(такое управление диктуется исходным устройством, в которое происходит встраивание)
Собственно мне не понятно можно ли сделать так, чтобы запись в шину происходила только при наступлении события (переключение режима или изменении сопротивления) - исходя из логики работы мк все что висит в loop-е крутится по кругу.
В разобранных примерах не было режимов, переключаемых одной кнопкой, устройства как правило либо простые (таймеры, датчики температуры и тп), либо управляются несколькими кнопками.
Переключение режимов я реализовал через switch-case, внутри кейсов управление светодиодами и еще парой пинов меняющих свое состояние. При такой реализации прописывая внутри кейсов передачу события в шину получаем постоянный засыл этого события.
Что-то типа такого (если я правильно понял проблему)?
if ((!digitalRead(KEY))&&(!Mode_changed)) // кнопка срабатывает по нулю { Mode=1; // установить нужный режим Mode_changed=true;} if (Mode_changed) { send_to_i2c(Mode); // послали что-то в девайс Mode_changed=false;}вот описание команды switch-case из фака:
switch (var) { case 1: //выполняется, когда var равно 1 break; case 2: //выполняется когда var равно 2 break; }значение var присваивается на этапе проверки нажата ли кнопка
дальше, по моей логике, при значении var=1 крутится в цикле первый кейс, но мне нужно чтобы в нем выполнилось действие только 1 раз. для этого ввожу дополнительную проверку состояние системы внутри кейсов и если условия удовлетворяют, то выполняется действие в кейсе и переменная меняется так, чтобы условие не выплонялось. но на практике не работает...
вот кусок кода с упрощением для наглядности
switch (mode) { case 1: digitalWrite(BLED,1); digitalWrite(RLED,0); if(input_set=1) { Serial.println(mode); input_set=2; } break; case 2: digitalWrite(BLED,0); digitalWrite(RLED,1); if(input_set=2) { Serial.println(mode); input_set=1; } break; }логика работы такова, что case 1 всегда выполняется при первом старте программы - те включенный синий светодиод = начальное состояние системы. вместо записи в серийный-порт ессесно посыл в шину
так, увидел косяк - в проверке условий внутри кейса присваивание стоит вместо ==
исправил, но теперь возникла проблема с неоднозначным срабатыванием кнопки, до ввода условий в кейсах светодиоды переключались однозначно, сейчас будто дребезг жуткий появился