Страница 1 из 1
Алгоритм остановки работы будильника
Добавлено: Пт дек 04, 2009 01:00:46
Настя
Интересует алгоритм (даже словесный) в следующей задаче:
есть переменные (упрощенный пример)
char t_tek; // время текущее
char t_bud; // время будильника
bit buz=0; // бит состояния бузера - 0-откл, 1-вкл.
определяем, что будильник должен сработать в некое время
время тикает, текущее время становится равным будильнику
далее обрабатываем типа
if (t_tek == t_bud) buz=1; else buz=0;
и вот вопрос - ну проснулись мы, ну подошли к будильнику,
что-то на нем жмакнули и всё это мы сделали за 10 сек
а условие "t_tek == t_bud" еще актуально.
Как будем обходить условия, если t_tek и t_bud нельзя менять.
а buz по-любому надо сделать =0; дабы не будить остальных.
ПС. Если нужны др переменные локальные или глобальные - вводите.
Добавлено: Пт дек 04, 2009 01:08:12
Пухич
Не понял вопроса. Ну сработало будило. Подошли и вырубили. Пока не подошли - он орет, это стандартно. Можно почётче обозначить проблему?
Добавлено: Пт дек 04, 2009 03:09:14
kalobyte
тоже ничего не понял
Добавлено: Пт дек 04, 2009 04:27:07
Кашпо
Проверяйте условие (t_tek == t_bud) только в момент изменения t_tek, а не в бесконечном цикле. Тогда повторных вхождений не будет.
Добавлено: Пт дек 04, 2009 05:45:28
AI_Disable
Если есть возможность, использовать свободный бит у какой-нибудь переменной, или завести новую:
char t_tek;
char t_bud;
bit buz=0;
char flag;
if (t_tek == t_bud && bit_is_clear(flag,0))
{buz=1; flag|=(1<<0);}
else {buz=0; flag&=~(1<<0);}
Добавлено: Пт дек 04, 2009 09:14:06
Настя
Кашпо писал(а):Проверяйте условие (t_tek == t_bud) только в момент изменения t_tek, а не в бесконечном цикле. Тогда повторных вхождений не будет.
Кашпо - спасибо, отличный совет
AI_Disable - идея ясна. Плз словами поясните
flag|=(1<<0);
flag&=~(1<<0);
что в первом случае с флагом делается, а что во втором.
Добавлено: Пт дек 04, 2009 10:34:11
AI_Disable
В первом случаи в нулевой бит переменной flag записывается 1, а во вторым – ноль. (Остальные биты переменной можете юзать по своему усмотрению)
Добавлено: Пт дек 04, 2009 10:50:55
Настя
спасибо
ну и для полноты понимания вашего кодинга
что скрывается под функцией bit_is_clear(flag,0)
примерно так !((flag) & (1 << 0)) ?
Добавлено: Пт дек 04, 2009 11:29:07
AI_Disable
Приношу свои извинения! Мой первоначальный код - полный бред. Торопился когда писал... Вот как надо:
Код: Выделить всё
char t_tek;
char t_bud;
bit buz=0;
char flag; //Дополнительная флаговая переменная
int main()
{
while()
{
if (t_tek == t_bud) //Если текущее время ровно времени будильника,
{
if (bit_is_clear(flag,0)) //И флаг сброшен,
{
buz=1; flag|=(1<<0); // то включить сигнал и установить флаг.
}
else //Когда текущее время не равно будильнику,
{
buz=0; flag&=~(1<<0); //выключить сигнал(то есть, если в течение минуты его не отключили, он отключится сам) и сбросить флаг
}
//тут или в прерывании можно выключить сигнал "досрочно"
}
}
Если компиль понимает битовые переменные, то можно так:
Код: Выделить всё
char t_tek;
char t_bud;
bit buz=0;
bit flag; //Дополнительная флаговая переменная
int main()
{
while()
{
if (t_tek == t_bud) //Если текущее время ровно времени будильника,
{
if (flag==0)//И флаг сброшен,
{
buz=1; flag=1; // то включить сигнал и установить флаг.
}
else //Когда текущее время не равно будильнику,
{
buz=0; flag=0; //выключить сигнал(то есть, если в течение минуты его не отключили, он отключится сам) и сбросить флаг
}
//тут или в прерывании можно выключить сигнал "досрочно"
}
}
Добавлено: Пт дек 04, 2009 12:10:59
Настя
неее... не канает
так лучше будет
Код: Выделить всё
char t_tek;
char t_bud;
bit buz=0;
bit flag; //Дополнительная флаговая переменная
int main()
{
while()
{
if (t_tek == t_bud) //Если текущее время ровно времени будильника,
{
if (flag==0)//И флаг сброшен,
{
buz=1; // то ТОЛЬКО включить сигнал
}
else //Когда текущее время не равно будильнику,
{
buz=0; flag=0; // т.е. "самоотключение" и "самосброс"
}
//тут или в прерывании можно выключить сигнал "досрочно"
// ЧЕРЕЗ ФЛАГ flag=1;
}
}
Добавлено: Пт дек 04, 2009 12:16:12
Настя
AI_Disable - смотрю и вижу, что ваша мысль более правильная
- работать с объектом, а не через посредника. Да, так удобнее. Спс
Добавлено: Пт дек 04, 2009 12:32:50
AI_Disable
Пожалуйста, рад что смог помочь
