Часы на 7ми сегментных лампах зависают

leptodon
Offline
Зарегистрирован: 27.09.2012

Плохо разбираюсь в программировании по этому прошу помощи у знатаков. Вопросов несколько. 

#include <Wire.h>
#include <DS1307.h>
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
const int b1 = 2;
const int b2 = 3;
int chas = 0;
int minut = 0;
DS1307 rtc(4, 5);
int hour = 0, min = 0, sec = 0; //the current time globals

void setup() {
  pinMode (b1, INPUT);
  digitalWrite(b1, HIGH);
  pinMode (b2, INPUT);
  digitalWrite(b2, HIGH);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  rtc.halt(false);
}

byte mask[10] =
{
  B01011111, // 0
  B00000110, // 1
  B01101011, // 2
  B01101110, // 3
  B00110110, // 4
  B01111100, // 5
  B01111101, // 6
  B00001110, // 7
  B01111111, // 8
  B01111110  // 9
};

void setchas () {
  {
    chas = (chas++);
    rtc.setTime(chas, minut, 01);
    delay(500);
  }
  if (chas == 24)
  {
    chas = 00;
  }
}

void setminut() {
  {
    minut = (minut++);
    rtc.setTime(chas, minut, 01);
    delay(500);
  }

  if (minut == 60)
  {
    minut = 00;
  }
}

void loop() {
  while (1) { //loop until time changes

    const Time & temp = rtc.getTime();//we get the time

    //if the time is different then our time variables - we need to update them.
    //then we update the old variables and break out of this loop
    if (temp.hour != hour || temp.hour != min || temp.hour != sec) {
      hour = temp.hour;
      min = temp.min;
      sec = temp.sec;
      break;
    }


  }
  if (digitalRead(b1) == LOW)
  {
    setchas();
  }

  if (digitalRead(b2) == LOW)
  {
    setminut();
  }
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, mask[(hour) / 10]);
  shiftOut(dataPin, clockPin, MSBFIRST, mask[(hour) % 10]);

  shiftOut(dataPin, clockPin, MSBFIRST, mask[(min) % 10]);
  shiftOut(dataPin, clockPin, MSBFIRST, mask[(min) / 10]);

  shiftOut(dataPin, clockPin, MSBFIRST, mask[(sec) / 10]);
  shiftOut(dataPin, clockPin, MSBFIRST, mask[(sec) % 10]);
  digitalWrite(latchPin, HIGH);

  Serial.println(rtc.getTimeStr());
}

1. Часы исправно идут до какого-то момента, а потом встают, например при переходе через нули

23.59.59->00.00.00 но бывает и в других моментах встают

2. Как видно из кода, есть 2 кнопки для настройки времени, по идее после того как дошел до 23 следующий час должен быть 00 но по факту 01 получается. Понять не могу.

leptodon
Offline
Зарегистрирован: 27.09.2012

Появилось подазрение, не знаю прав или нет. Но при получении данных с RTC и выводе на лампу используется деление на 10 для получения десятков может происходит переполнение?

leptodon
Offline
Зарегистрирован: 27.09.2012

Появилось подозрение, не знаю прав или нет. Но при получении данных с RTC и выводе на лампу используется деление на 10 для получения десятков может происходит переполнение?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Подозрение на "идийский код"(нужно вначале проверять  потом отправлять), сделайте лучше так обе функции:

void setchas () {
   if (chas >= 23){
      chas = 0;
   }else{
      chas++;
   }
   rtc.setTime(chas, minut, 0);
   delay(500);
}

так то там у вас еще достаточно кояков - но лучше вам их самому найти....