Нашел исходник Код (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
Меняю бит Stat register - у меня по DS должен быть 3F - но в serial.print выливаются хаотичные данные. Может не все так сложно с этими часиками??? Уже разные коды перепробовал - не получается запустить их (((
Переделал код под 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 пусто ((( Что не так в коде???
Уже даже такой код написали - все ранво получаем значения не внятные - хотелось просто даже прочитать значения из памяти . Информации вообще по данным часам нет, кроме как на сайте в даташите - что ж за часы такие ((((((((( Код (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); }
Вот еще один код - вязл от сюда .. переделал немного - в 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 }
Даташит - самое главное. Вся нужная информация там есть, нужно просто внимательно прочитать и разобраться. Я с этим контроллером не работал, ничего определенного сказать не могу.
Его единственное отличие от всех - это наличие eeprom. Регистры RTC начинаются не как у всех с 0x00, а с 0x30 , вроде даже читаю биты- но все пусто ((