Проблемы с DS 1307
- Войдите на сайт для отправки комментариев
Пт, 25/05/2012 - 21:35
Привет всем. Ситуация: я построил часы на Вакуумно-люминесцентном индикаторе ИВЛ1-7/5. И возникли проблемы с выводом на них времени. Как это выглядит. Отображается время но через некоторое время на долю секунды проскакивает другие числа. Иногда загораются нули и так и остаются. Проблемы с выводом исключены. С кодом тоже вроде их нет. А такое происходит. Я уже всё попробовал. Код я пишу для часов почти один и тот же но такого не наблюдал. Ощущение такое что когда посылаешь запрос на ds 1307 в ответ приходят нули либо мусор. Стоят подтягивающие резисторы. Думал они плохие (старые) выпаял но нечего не поменялось.
#include "Wire.h" ///////////////////////////////////////////////////////////////////// #include <EEPROM.h> #define DS1307_I2C_ADDRESS 0x68 byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } void setDateDs1307(byte second,byte minute,byte hour) { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(0); Wire.send(decToBcd(second)); Wire.send(decToBcd(minute)); Wire.send(decToBcd(hour)); Wire.endTransmission(); } void getDateDs1307(byte *second,byte *minute,byte *hour) { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(0); delay(2); Wire.endTransmission(); delay(2); Wire.requestFrom(DS1307_I2C_ADDRESS, 3); *second = bcdToDec(Wire.receive() & 0x7f); *minute = bcdToDec(Wire.receive()); *hour = bcdToDec(Wire.receive() & 0x3f); // Need to change this if 12 hour am/pm } /////////////////////////////////////////////////////////////// int latchPin = 12; int clockPin = 13; int dataPin = 10; int razrad4=17; int razrad3=16; int razrad2=14; int razrad1=15; int Tochka_N=2; int Tochka_B=3; int TochCet=4; int BIP=9; byte zero=B00000000; byte REG0=B11110110; byte REG1=B01100000; byte REG2=B01011110; byte REG3=B01111010; byte REG4=B11101000; byte REG5=B10111010; byte REG6=B10111110; byte REG7=B01100010; byte REG8=B11111111; byte REG9=B11111011; int Razzzz[]={ razrad1,razrad2,razrad3,razrad4}; byte REG[]={ REG0,REG1,REG2,REG3,REG4,REG5,REG6,REG7,REG8,REG9,REG9}; int PinKnop[]={ 7,6,8}; int knopka[]={ 0,0,0}; int razrad[]={ 1,2,3,4}; int PozMenu=0; int BUDsecond=0, BUDminute=0, BUDhour=0; int nactroika=0; int n=0; int t=0; int k=3; int address = 0; /////////////////////////////////////////////////////////////// void setup() { pinMode(BIP, OUTPUT); digitalWrite(BIP,0); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); for(int i=0;i<=3; i++){ pinMode(Razzzz[i], OUTPUT); digitalWrite(Razzzz[i],0); } pinMode(Tochka_B, OUTPUT); pinMode(Tochka_N, OUTPUT); pinMode(TochCet, OUTPUT); digitalWrite(Tochka_B,0); digitalWrite(Tochka_N,0); digitalWrite(TochCet,0); Wire.begin(); SPIVivod(zero); Serial.begin(9600); BUDminute = EEPROM.read(address); address = address + 1; BUDhour = EEPROM.read(address); address=0; } int inter=0; int flag_Byd=0; void loop() { byte second, minute, hour; getDateDs1307(&second, &minute, &hour); if (BUDminute==minute&&BUDhour==hour&&BUDminute!=0&&BUDhour!=0&&flag_Byd==0&&((second&1)==0)) { PozMenu=1; digitalWrite(BIP,1); } else digitalWrite(BIP,0); if (minute!=BUDminute) flag_Byd=0; if(digitalRead(PinKnop[0])==0&&knopka[0]==0) { knopka[0]=1; flag_Byd=1; if (digitalRead(PinKnop[1])==1&&PozMenu<3) nactroika=1; if (nactroika==1) { n++; if (n==3) n=0; shikl(n); } else { PozMenu++; if (PozMenu==2) PozMenu=0; shikl(0); } } if(digitalRead(PinKnop[0])==1&&knopka[0]==1) knopka[0]=0; ///////////////////////////////////////////// if(digitalRead(PinKnop[1])==1&&knopka[1]==0) { knopka[1]=1; if (nactroika==1) { if (PozMenu==0) { if(n==2&&minute>0)minute--; if(n==1&&hour>0)hour--; setDateDs1307(second, minute, hour); } if (PozMenu==1) { if(n==2&&BUDminute>0)BUDminute--; if(n==1&&BUDhour>0)BUDhour--; EEPROM.write(address, BUDminute); address = address + 1; EEPROM.write(address, BUDhour); address=0; } } } if(digitalRead(PinKnop[1])==0&&knopka[1]==1) knopka[1]=0; ////////////////////////////////////////////// if(digitalRead(PinKnop[2])==1&&knopka[2]==0) { knopka[2]=1; if (nactroika==1) { if (PozMenu==0) { if(n==2)minute++; if(n==1)hour++; if(minute==60)minute=0; if(hour==24)hour=0; setDateDs1307(second, minute, hour); } if (PozMenu==1) { if(n==2)BUDminute++; if(n==1)BUDhour++; if(BUDminute==60)BUDminute=0; if(BUDhour==24)BUDhour=0; EEPROM.write(address, BUDminute); address = address + 1; EEPROM.write(address, BUDhour); address=0; } } } if(digitalRead(PinKnop[2])==0&&knopka[2]==1) knopka[2]=0; if (PozMenu==0) { rachot(hour,1); rachot(minute,3); } if (PozMenu==1) { rachot(BUDhour,1); rachot(BUDminute,3); } vivod(second); } void shikl(int nn) { switch (nn) { case 0: nactroika=0; t=0; k=3; break; case 1: t=0; k=1; break; case 2: t=2; k=3; break; } } void vivod(int second){ for (int i=t; i<=k; i++){ if (razrad[i]==0&&i==0)i++; SPIVivod(REG[razrad[i]]); digitalWrite(Razzzz[i],1); if (PozMenu==0&&((second&1)==0)) { digitalWrite(Tochka_B,1); digitalWrite(Tochka_N,1); digitalWrite(TochCet,1); } if (PozMenu==1) { digitalWrite(Tochka_B,1); digitalWrite(Tochka_N,1); digitalWrite(TochCet,0); } delay(1); digitalWrite(Razzzz[i],0); SPIVivod(zero); digitalWrite(Tochka_B,0); digitalWrite(Tochka_N,0); digitalWrite(TochCet,0); } } void rachot(int time, int poz) { razrad[poz-1] = time/10; razrad[poz] = time - pow((time/10), 1)*10; } void SPIVivod(byte t) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, t); digitalWrite(latchPin, HIGH); }
А готовую библиотеку для 1307 не используешь принципиально? Она представляет собой часть вот этой библиотеки:
www.arduino.cc/playground/Code/Time
По крайней мере посмотри как другие сделали работу с этой микрухой. Да и код твой подожмется значительно.
Попробовал. Всё также. Я склоняюсь к тому что это аппаратная проблема!