Не всегда обрабатывается конструкция switch-case
- Войдите на сайт для отправки комментариев
Вс, 28/04/2013 - 15:41
#include <Wire.h>
#include <DS1307.h>
void setup()
{
Serial.begin(9600);
Wire.begin();
delay(1000);
}
void write_RTC() {
char value=0;
char command=0;
command = Serial.read();
delay(50);
value=byte((Serial.read()-48)*10);
delay(50);
value+=byte((Serial.read()-48));
switch (command) {
case 'h' :
RTC.set(DS1307_HR,value);
Serial.print("hours set to ");
Serial.println(value,DEC);
break;
case 'm' :
RTC.set(DS1307_MIN,value);
Serial.print("minutes set to ");
Serial.println(value,DEC);
break;
case 's' :
RTC.set(DS1307_SEC,value);
Serial.print("seconds set to ");
Serial.println(value,DEC);
break;
case 'D' :
RTC.set(DS1307_DATE,value);
Serial.print("day of month set to ");
Serial.println(value,DEC);
break;
case 'd' :
RTC.set(DS1307_DOW,value);
Serial.print("day of week set to ");
Serial.println(value,DEC);
break;
case 'M' :
RTC.set(DS1307_MTH,value);
Serial.print("month set to ");
Serial.println(value,DEC);
break;
case 'Y' :
RTC.set(DS1307_YR,value);
Serial.print("year set to ");
Serial.println(value,DEC);
break;
case 'u' :
case 'U' :
use();
break;
case 'r' :
RTC.stop();
Serial.println("Clock stopped");
break;
case 'R' :
RTC.start();
Serial.println("Clock running");
break;
default :
break;
}
}
void lister()
{
Serial.println();
Serial.print("Time: ");
Serial.print(RTC.get(DS1307_HR,true));
Serial.print(":");
Serial.print(RTC.get(DS1307_MIN,false));
Serial.print(", Date: ");
Serial.print(RTC.get(DS1307_DATE,false));
Serial.print("/");
Serial.print(RTC.get(DS1307_MTH,false));
Serial.print("/");
Serial.print(RTC.get(DS1307_YR,false));
/*тут еще есть опрос других датчиков*/
}
void loop()
{
switch (RTC.get(DS1307_SEC,true))
{
case 58:
lister();
delay (1000);
break;
default:
if (Serial.available()) { write_RTC(); }
}
}
Это код моей программы. Собственно к меге2560 подключены часы, пара датчиков (один из которых висит вместе с часами).
Задумка такая - каждую 58-ю секунду надо выводить время, дату и значения датчиков.
То есть читаю из DS1307 секунды, если равно 58 то опрашиваю датчичи и часы, если нет, то слушаю СОМ-порт на наличие команд (управления DS1307).
На практике - данные выводтся не каждую 58-ю секунду (ну или каждую минуту), а каждую 58+58 секунду.
Пробовал убирать switch-case - скорости опроса хватает чтобы данные выводить 2-3 раза в секунду. Но это избыточно, надо каждую минуту...
Подскажите, в чем может быть проблема пропуска одной из минут?