Часы реального времени на мк x1226 e348

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Максим B, 28 июн 2015.

  1. Максим B

    Максим B Гуру

    Всем привет. Работал ли кто-нибудь с такими часами?? Может уже есть готовая библиотека?
     
  2. Максим B

    Максим B Гуру

  3. Максим B

    Максим B Гуру

    Нашел исходник

    Код (Text):

    //device isl1208 address 0x6F
    #include <Wire.h>
    #include <avr/interrupt.h>
    byte seconds, hours, minutes, date, months, years, statusReg;

    void setup () {
      pinMode(5, INPUT);
      digitalWrite(5,HIGH);
      attachInterrupt(0, alarmTriggered, FALLING);
      interrupts();
      delay(50);
      Serial.begin(9600);
      Wire.begin();

      Wire.beginTransmission(0x6F);
      Wire.write(0x07); //status register
      Wire.write(0x90);  //
      Wire.endTransmission();

      readStatusReg(statusReg);
      Serial.print(statusReg,HEX); //should be 144/0x90
      Serial.println("h - status register");

    /*
      //alarm setup
      Wire.beginTransmission(0x6F);
      Wire.write(0x08); //alarm register
      Wire.write(0xD0);
      Wire.endTransmission();
      Wire.beginTransmission(0x6F);
      Wire.write(0x0c); //seconds alarm register
      Wire.write(0xB0); //secs
      Wire.endTransmission();
      */
     
      /*
    // set time
       Wire.beginTransmission(0x6F);
       Wire.write(0x00); //seconds register
       Wire.write(decToBcd(30)); //secs
       Wire.write(decToBcd(41)); //min
       Wire.write(0xA3); //hour
       Wire.write(decToBcd(03)); //date
       Wire.write(decToBcd(8)); //month
       Wire.write(decToBcd(13)); //year
       Wire.endTransmission();
       Wire.beginTransmission(0x6f);
       Wire.write(0x07); //status reg addr
       Wire.endTransmission();
       Wire.requestFrom(0x6f,1); // now get the byte of data...
       byte statusReg=Wire.read();
       Serial.println(statusReg);
       */
    }

    void loop () {
      Wire.beginTransmission(0x6f);
      Wire.write(0x00); //status reg addr
      Wire.endTransmission();
      Wire.requestFrom(0x6f,6); // now get the byte of data...
      seconds=Wire.read();
      minutes=Wire.read();
      hours=Wire.read();
      date=Wire.read();
      months=Wire.read();
      years=Wire.read();

      hours=hours & B01111111; // remove mil time bit
      Serial.print(bcdToDec(hours));
      Serial.print(':');
      Serial.print(bcdToDec(minutes));
      Serial.print('.');
      Serial.print(bcdToDec(seconds));
      Serial.print(' ');
      Serial.print(bcdToDec(months));
      Serial.print('/');
      Serial.print(bcdToDec(date));
      Serial.print('/');
      Serial.println(bcdToDec(years));
      delay(1000);

    }

    byte readStatusReg(byte val){

      Wire.beginTransmission(0x6f);
      Wire.write(0x07); // read status reg to clr bits
      Wire.endTransmission();
      Wire.requestFrom(0x6f,1); // now get the byte of data...
      statusReg=Wire.read();
      return(statusReg);

    }


    byte bcdToDec(byte val)
    {
      return ( (val/16*10) + (val%16) );
    }

    byte decToBcd(byte val)
    {
      return ( (val/10*16) + (val%10) );
    }

    void alarmTriggered()
    {
      Serial.println("** ALARM WENT OFF! **");

    }
     
    Но он для isl1208, как его передалть под мои часики - различаются только adress map
     
  4. Максим B

    Максим B Гуру

    Меняю бит Stat register - у меня по DS должен быть 3F - но в serial.print выливаются хаотичные данные. Может не все так сложно с этими часиками??? Уже разные коды перепробовал - не получается запустить их (((
     
  5. Максим B

    Максим B Гуру

    Переделал код под Datasheet
    Код (Text):

    #include <Wire.h>
    #include <avr/interrupt.h>
    byte seconds, hours, minutes, date, months, years, statusReg;
    byte a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16
    ,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32
    ,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a51
    ,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63;

    void setup()
    {
      Serial.print(9600);
      Wire.begin();
     
     
      Wire.beginTransmission(0x6F);
      Wire.write(0x003F);  //Status Register
      Wire.write(0x0080);
      Wire.endTransmission();
     
      readStatusReg(statusReg);
      Serial.print(statusReg, HEX);
      Serial.println("h- status register");
     
     
      // set time
       Wire.beginTransmission(0x6F);
       Wire.write(0x0030); //seconds register
       Wire.write(decToBcd(30)); //secs
       Wire.write(0x0031);
       Wire.write(decToBcd(41)); //min
       Wire.write(0x0032); //hour
       Wire.endTransmission();
       Wire.beginTransmission(0x6f);
       Wire.write(0x003F); //status reg addr
       Wire.endTransmission();
       Wire.requestFrom(0x6f,1); // now get the byte of data...
       byte statusReg=Wire.read();
       Serial.println(statusReg);
       
       
    }

    void loop()
    {
      Wire.beginTransmission(0x6F);
      Wire.write(0x0030);  //Status Register
      Wire.endTransmission();
      Wire.requestFrom(0x6f,64);
     
      a0    =Wire.read();
    a1  =Wire.read();     //считываем байты
    a2  =Wire.read();
    a3  =Wire.read();
    a4  =Wire.read();
    a5  =Wire.read();
    a6  =Wire.read();
    a7  =Wire.read();
    a8  =Wire.read();
    a9  =Wire.read();
    a10 =Wire.read();
    a11 =Wire.read();
    a12 =Wire.read();
    a13 =Wire.read();
    a14 =Wire.read();
    a15 =Wire.read();
    a16 =Wire.read();
    a17 =Wire.read();
    a18 =Wire.read();
    a19 =Wire.read();
    a20 =Wire.read();
    a21 =Wire.read();
    a22 =Wire.read();
    a23 =Wire.read();
    a24 =Wire.read();
    a25 =Wire.read();
    a26 =Wire.read();
    a27 =Wire.read();
    a28 =Wire.read();
    a29 =Wire.read();
    a30 =Wire.read();
    a31 =Wire.read();
    a32 =Wire.read();
    a33 =Wire.read();
    a34 =Wire.read();
    a35 =Wire.read();
    a36 =Wire.read();
    a37 =Wire.read();
    a38 =Wire.read();
    a39 =Wire.read();
    a40 =Wire.read();
    a41 =Wire.read();
    a42 =Wire.read();
    a43 =Wire.read();
    a44 =Wire.read();
    a45 =Wire.read();
    a46 =Wire.read();
    a47 =Wire.read();
    seconds =Wire.read();
    minutes =Wire.read();
    hours   =Wire.read();
    a51 =Wire.read();
    a52 =Wire.read();
    a53 =Wire.read();
    a54 =Wire.read();
    a55 =Wire.read();
    a56 =Wire.read();
    a57 =Wire.read();
    a58 =Wire.read();
    a59 =Wire.read();
    a60 =Wire.read();
    a61 =Wire.read();
    a62 =Wire.read();
    a63 =Wire.read();

    hours=hours & B01111111;

    Serial.print(bcdToDec(hours));
    Serial.print(':');
    Serial.print(bcdToDec(minutes));
    Serial.print('.');
    Serial.print(bcdToDec(seconds));
    Serial.print(' ');
    delay(1000);  
    }

    byte readStatusReg(byte val){

      Wire.beginTransmission(0x6f);
      Wire.write(0x003F); // read status reg to clr bits
      Wire.endTransmission();
      Wire.requestFrom(0x6f,64); // now get the byte of data...
      statusReg=Wire.read();
      return(statusReg);

    }

    byte bcdToDec(byte val)
    {
      return ( (val/16*10) + (val%16) );
    }

    byte decToBcd(byte val)
    {
      return ( (val/10*16) + (val%10) );
    }
     
    В serial.print пусто ((( Что не так в коде???
     

    Вложения:

    • datasheet.pdf
      Размер файла:
      877,8 КБ
      Просмотров:
      599
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    WEL и RWEL не забываете перед записью ставить?
     
  7. Максим B

    Максим B Гуру

    Уже даже такой код написали - все ранво получаем значения не внятные - хотелось просто даже прочитать значения из памяти . Информации вообще по данным часам нет, кроме как на сайте в даташите - что ж за часы такие (((((((((
    Код (Text):

    #include <Wire.h>
    #include <avr/interrupt.h>
    byte seconds, hours, minutes, date, months, years, statusReg;

    byte a0,a1,a2,a3,a4,a5,a6,a7,a8,i;
    byte a[64];


    void setup () {
     
      Serial.begin(9600);
      Wire.begin();
     
      Wire.beginTransmission(0x6F);
      Wire.write(0xde);
    //  Wire.write(0x00);
      Wire.write(0x3f); //Int Register
      Wire.write(0x02);
      Wire.endTransmission();
     
       Wire.beginTransmission(0x6F);
      Wire.write(0xde);
     // Wire.write(0x00);
      Wire.write(0x3f); //Int Register
      Wire.write(0x06);
      Wire.endTransmission();
     
      Wire.beginTransmission(0x6F);
      Wire.write(0xde);
    //  Wire.write(0x00);
      Wire.write(0x11); //Int Register
      Wire.write(0x08);
      Wire.endTransmission();
     
      delay(10);
     
       Wire.beginTransmission(0x6F);
      Wire.write(0xde);
      Wire.write(0x00);
     Wire.write(0x3f); //Int Register
      Wire.write(0x00);
      Wire.endTransmission();
    }


    void loop () {
       
      Wire.beginTransmission(0x6F);
      Wire.write(0xae);
    //  Wire.write(0x00);
      Wire.write(0x00);
      Wire.write(0x00);
      Wire.write(55);  
      Wire.endTransmission();
     
     
        Wire.beginTransmission(0x6F);
      Wire.write(0xaf);
    //  Wire.write(0x00);
      Wire.write(0x00);
      Wire.write(0x00);
    //  Wire.write(55);  

     Serial.println(Wire.read());
      Serial.println("------");
     
    //  Wire.requestFrom(0x6f,1); // now get the byte of data...


      for (i=0; i<=8; i++){
      a[i]=Wire.read();
        Serial.print(a[i]);
        Serial.print(",");
      }
     
     Wire.endTransmission();        
     // Serial.println(statusReg);
     Serial.println("------");
      delay(1000);
     
     }
     
     byte readStatusReg(byte val){

      Wire.beginTransmission(0x6f);
      Wire.write(0x3f); // read status reg to clr bits
      Wire.endTransmission();
      Wire.requestFrom(0x6f,1); // now get the byte of data...
      statusReg=Wire.read();
      return(statusReg);

    }

     
     
  8. Максим B

    Максим B Гуру

    Вот еще один код - вязл от сюда .. переделал немного - в Serila.print - значения 0,255 - что не так ?
    https://www.ccsinfo.com/forum/viewtopic.php?t=994

    Код (Text):

    #include <Wire.h>
    #include <avr/interrupt.h>

    #define CLKBASE 0x30 //Clock base address
    #define _SEC 0x30//Sec
    #define _MIN 0x31//Min
    #define _HR 0x32 //Hour
    #define _DAY 0x33//Date
    #define _MTH 0x34//Month
    #define _YR 0x35 //Year
    #define _DOW 0x36 //Day of week
    #define _Y2K 0x37 //19 or 20
    #define _SR 0x3F //Status

    byte hr,a[64];
    char data, addr;

    void setup() {
      Serial.begin(9600);
      Wire.begin();
    }

    void loop(){
     

       write_rtc(_HR, a[11]);


    while(1){
       hr=read_rtc(_HR);
       Serial.print(a[0]);
       Serial.print(hr);}
       
       delay(1000);
    }


    char read_rtc(int addr){
     
      Wire.beginTransmission(0x6f);
      Wire.write(0xDF);
      Wire.write(0);
      Wire.write(addr);
      Wire.beginTransmission(0x6f);
      data=Wire.read();
      Wire.endTransmission();
      return(data);
    }

    void wr_rtc(int addr, char data){
      Wire.beginTransmission(0x6f);
      Wire.write(0xDE);
      Wire.write(0);
      Wire.write(addr);
      Wire.write(data);
      Wire.endTransmission();

    }

    void write_rtc(int addr, char data)
    {
    wr_rtc(_SR,02); //Set WEL (Write Enable Latch)
    wr_rtc(_SR,06); //Set both RWEL (Reg WEL) & WEL
    wr_rtc(addr,data); //Write byte to rtc
    wr_rtc(_SR,0); //Disable write
    }

     
     
  9. Megakoteyka

    Megakoteyka Оракул Модератор

    Даташит - самое главное. Вся нужная информация там есть, нужно просто внимательно прочитать и разобраться. Я с этим контроллером не работал, ничего определенного сказать не могу.
     
  10. Максим B

    Максим B Гуру

    Его единственное отличие от всех - это наличие eeprom. Регистры RTC начинаются не как у всех с 0x00, а с 0x30 , вроде даже читаю биты- но все пусто ((
     
  11. Megakoteyka

    Megakoteyka Оракул Модератор

    Не факт, что единственное. А подключаете правильно? Подтяжку не забыли?
     
  12. Максим B

    Максим B Гуру

    Сканером i2c узнал адрес устройства - сделал предположение, что работает. Подтяжка есть на модуле.
     
  13. Megakoteyka

    Megakoteyka Оракул Модератор

    Ну тогда остается только курить даташит и пробовать, пробовать....
     
  14. Максим B

    Максим B Гуру

    Учасов вообще бывают какие-нибудь lock - фьюзы, нут ипа только для чтения и все
     
  15. Максим B

    Максим B Гуру

    В интернете полно исходников от DS1307, 3221 и других. Почему такие часы не пользуют вот интересно?
     
  16. Megakoteyka

    Megakoteyka Оракул Модератор

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