Помогите с реализацией управление по I2C

bj_tracer
Offline
Зарегистрирован: 25.10.2013

Добрый день.

Не могу разобраться с управлением внешний устройств по I2C шине.

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

Имеем ардуино и внешнее устройство TDA7313 (звуковой процессор с селектором каналов и тп).

Ардуина управляется 1 кнопкой, по которой должна происходить смена режимов и соответственно совершаться посыл о смене режима в шину, вместе с посылом зажигается 1 из 2 светодиодов. Так же к мк подключено 2 потенциометра для управления громкостью и тембром.

(такое управление диктуется исходным устройством, в которое происходит встраивание)

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

В разобранных примерах не было режимов, переключаемых одной кнопкой, устройства как правило либо простые (таймеры, датчики температуры и тп), либо управляются несколькими кнопками.

 

Переключение режимов я реализовал через switch-case, внутри кейсов управление светодиодами и еще парой пинов меняющих свое состояние. При такой реализации прописывая внутри кейсов передачу события в шину получаем постоянный засыл этого события.

vdk
Offline
Зарегистрирован: 14.04.2013

Что-то типа такого (если я правильно понял проблему)?

if ((!digitalRead(KEY))&&(!Mode_changed)) // кнопка срабатывает по нулю
  {
  Mode=1; // установить нужный режим
  Mode_changed=true;} 
if (Mode_changed) 
  {
  send_to_i2c(Mode); // послали что-то в девайс
  Mode_changed=false;} 

 

bj_tracer
Offline
Зарегистрирован: 25.10.2013

вот описание команды 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 всегда выполняется при первом старте программы - те включенный синий светодиод = начальное состояние системы. вместо записи в серийный-порт ессесно посыл в шину

bj_tracer
Offline
Зарегистрирован: 25.10.2013

так, увидел косяк - в проверке условий внутри кейса присваивание стоит вместо ==

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