Проблемы с DS 1307

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Привет всем. Ситуация: я построил часы на Вакуумно-люминесцентном индикаторе ИВЛ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);
}

 

Sky
Offline
Зарегистрирован: 04.04.2012

 А готовую библиотеку  для 1307 не используешь принципиально? Она представляет собой часть вот этой библиотеки:

www.arduino.cc/playground/Code/Time

По крайней мере посмотри как другие сделали работу с этой микрухой. Да и код твой подожмется значительно.

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Попробовал. Всё также. Я склоняюсь к тому что это аппаратная проблема!