Проблемы с 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
По крайней мере посмотри как другие сделали работу с этой микрухой. Да и код твой подожмется значительно.
Попробовал. Всё также. Я склоняюсь к тому что это аппаратная проблема!