общение с ds3132 по программному ic2

Тема в разделе "Arduino & Shields", создана пользователем Unikolai, 25 ноя 2016.

  1. rkit

    rkit Гуру

    Нет. Он принимает 7 бит.
    Чтобы установить режим чтения
     
  2. Unikolai

    Unikolai Гик

    Ну да, я и имел ввиду 7 бит)
    А к остальным моим комментариям комментариев не будет?
     
  3. Unikolai

    Unikolai Гик

    Ладно и так очень помогли) буду мучить буржуйский даташит)
     
  4. rkit

    rkit Гуру

    Я все уже объяснил, вроде.
     
  5. Unikolai

    Unikolai Гик

    Код (C++):
    boolean I2CWrite(byte b)//принимает биты с 0-7
    {
      byte i = 1 << 7;//не ясно что делаеть, ведь вроде как "<<" это смещение ведь
      boolean ack = 0;//изначально аск на нуле, то есть чтение не будет продолжаться?
      while (i)//пока что?
      {
      //I2CDelay();
      if (b & i) SDA_Hi(); else SDA_Lo(); опять таки, битовый оператор, что он делает с двумя байтами я понимаю, но как это может быть условием, я не понимаю, да и вообще, транная запись, разве не так должно быть if (b & i) {SDA_Hi();}(n/t/ фигурные скобки)
      I2CDelay();//это потом
      SCL_Hi();//просто устанавливаем пины low/high
      I2CDelay();//как понимаю эти паузы делаются для того, чтобы как раз таки получить вот
    эти вот перепады, чтобы при высоком sda и низком или высокм scl получать 1 или 0
      SCL_Lo();//просто устанавливаем пины low/high
      i >>= 1;//вообще не ясно
      }
      SDA_Hi();//просто устанавливаем пины low/high
      I2CDelay();
      SCL_Hi();//просто устанавливаем пины low/high
      // while(!SCL_In());
      if ( SDA_In() == 0 ) ack = 1;
      I2CDelay();
      SCL_Lo();//просто устанавливаем пины low/high
      SDA_Hi();//просто устанавливаем пины low/high
      return ack;//возвращаем правду или ложбь
    }
    вот тут есть вопросы)
     
  6. rkit

    rkit Гуру

    Зачем вам лезть в реализацию i2c? Даже читать не буду.
     
  7. Unikolai

    Unikolai Гик

    но я хочу понять)тьнька не поддерживает аппаратный ic2
     
  8. Unikolai

    Unikolai Гик

    Код (C++):
    void set_register(byte i, byte adress)
    {
      I2CStart();
      I2CWrite((DS3231_I2C_ADDRESS << 1));
      I2CWrite(adress);
      I2CWrite(i); // set seconds
      I2CStop ();

    }




    void setup()
    { Serial.begin(9600);
      I2CInit ();
      set_register(B00000000, 0x0E);
      set_registers(0, 0, 0, 0,0x7);
    }
    void loop()
    {
      static byte hs, ed, al, alm, alh;
      byte  key, second, minute, hour, dayOfWeek, dayOfMonth, month, g, year;
      static long tm, tio, tdo;
      tm = millis();
      if (tm - tdo > 500)
      { tdo = tm; hs++;
        readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
        Serial.print("sek-");
        Serial.println(second);
        Serial.print("min-");
        Serial.println(minute);
        Serial.print("hou-");
        Serial.println(hour);
        read_register(&g, 0x7);
        Serial.println(g);
        read_register(&g, 0x8);
        Serial.println(g);
        read_register(&g, 0x9);
        Serial.println(g);
        read_register(&g, 0x0A);
        Serial.println(g);
        read_register(&g, 0x0E);
        Serial.println(g,BIN);
      };
    }

    void set_registers(byte f, byte m, byte y, byte d,byte adress)
    {
      I2CStart();
      I2CWrite((DS3231_I2C_ADDRESS << 1));
      I2CWrite(adress);
      I2CWrite(decToBcd(f)); //
      I2CWrite(decToBcd(m)); //
      I2CWrite(decToBcd(y)); //
      I2CWrite(decToBcd(d)); //
      I2CStop ();

    }
    void read_register(byte *second, byte *adress)
    {
      I2CStart();
      I2CWrite((DS3231_I2C_ADDRESS << 1));
      I2CWrite(adress);
      I2CStop ();
      I2CStart();
      I2CWrite((DS3231_I2C_ADDRESS << 1) + 1);
      *second = bcdToDec(I2CRead(0));
      I2CStop ();
    }

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