Часы на 7ми сегментных лампах зависают
- Войдите на сайт для отправки комментариев
Пт, 24/10/2014 - 01:54
Плохо разбираюсь в программировании по этому прошу помощи у знатаков. Вопросов несколько.
#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 получается. Понять не могу.
Появилось подазрение, не знаю прав или нет. Но при получении данных с RTC и выводе на лампу используется деление на 10 для получения десятков может происходит переполнение?
Появилось подозрение, не знаю прав или нет. Но при получении данных с RTC и выводе на лампу используется деление на 10 для получения десятков может происходит переполнение?
Подозрение на "идийский код"(нужно вначале проверять потом отправлять), сделайте лучше так обе функции:
так то там у вас еще достаточно кояков - но лучше вам их самому найти....