Не всегда обрабатывается конструкция 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 раза в секунду. Но это избыточно, надо каждую минуту...
Подскажите, в чем может быть проблема пропуска одной из минут?