Алгоритм остановки работы будильника

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Мявтор!
Аватара пользователя
Сообщения: 878
Зарегистрирован: Чт авг 07, 2008 09:12:38
Откуда: не скажу

Сообщение Настя »

Интересует алгоритм (даже словесный) в следующей задаче:
есть переменные (упрощенный пример)
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; дабы не будить остальных.

ПС. Если нужны др переменные локальные или глобальные - вводите.
натуральная блондинка
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Не понял вопроса. Ну сработало будило. Подошли и вырубили. Пока не подошли - он орет, это стандартно. Можно почётче обозначить проблему?
Знание - сила!
Реклама
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

тоже ничего не понял
Опытный кот
Сообщения: 764
Зарегистрирован: Пт фев 02, 2007 10:19:58
Откуда: Железногорск

Сообщение Кашпо »

Проверяйте условие (t_tek == t_bud) только в момент изменения t_tek, а не в бесконечном цикле. Тогда повторных вхождений не будет.
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб

Сообщение 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);}
Контактная информация:
Реклама
Мявтор!
Аватара пользователя
Сообщения: 878
Зарегистрирован: Чт авг 07, 2008 09:12:38
Откуда: не скажу

Сообщение Настя »

Кашпо писал(а):Проверяйте условие (t_tek == t_bud) только в момент изменения t_tek, а не в бесконечном цикле. Тогда повторных вхождений не будет.
Кашпо - спасибо, отличный совет

AI_Disable - идея ясна. Плз словами поясните
flag|=(1<<0);
flag&=~(1<<0);
что в первом случае с флагом делается, а что во втором.
натуральная блондинка
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб

Сообщение AI_Disable »

В первом случаи в нулевой бит переменной flag записывается 1, а во вторым – ноль. (Остальные биты переменной можете юзать по своему усмотрению)
Контактная информация:
Мявтор!
Аватара пользователя
Сообщения: 878
Зарегистрирован: Чт авг 07, 2008 09:12:38
Откуда: не скажу

Сообщение Настя »

спасибо

ну и для полноты понимания вашего кодинга
что скрывается под функцией bit_is_clear(flag,0)

примерно так !((flag) & (1 << 0)) ?
натуральная блондинка
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб

Сообщение 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; //выключить сигнал(то есть, если в течение минуты его не отключили, он отключится сам) и сбросить флаг
}
//тут или в прерывании можно выключить сигнал "досрочно"
}
}
Контактная информация:
Мявтор!
Аватара пользователя
Сообщения: 878
Зарегистрирован: Чт авг 07, 2008 09:12:38
Откуда: не скажу

Сообщение Настя »

неее... не канает
так лучше будет

Код: Выделить всё

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;
} 
}
натуральная блондинка
Контактная информация:
Мявтор!
Аватара пользователя
Сообщения: 878
Зарегистрирован: Чт авг 07, 2008 09:12:38
Откуда: не скажу

Сообщение Настя »

AI_Disable - смотрю и вижу, что ваша мысль более правильная
- работать с объектом, а не через посредника. Да, так удобнее. Спс
натуральная блондинка
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб

Сообщение AI_Disable »

Пожалуйста, рад что смог помочь :)
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»