Хотел добавить мигание еще одной точкой чтобы две точки мигали, но не нашел в коде нужных строк.
Цифровой приёмник на TEA5767 c часами на DS1307
- Сообщения: 330
- Зарегистрирован: Вс апр 17, 2011 12:09:57
Все отлично. Но вот еще вопрос - где в коде прописано мигание точкой при вывода на дисплей часов?
Хотел добавить мигание еще одной точкой чтобы две точки мигали, но не нашел в коде нужных строк.
Хотел добавить мигание еще одной точкой чтобы две точки мигали, но не нашел в коде нужных строк.
- Реклама
- Сообщения: 330
- Зарегистрирован: Вс апр 17, 2011 12:09:57
То есть если мне нужно чтобы мигала еще точка 3-го разряда то нужно добавить:
#else
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
ind[3] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
?
#else
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
ind[3] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
?
Не совсем. Добавить | (time[SEC] % 2 ? BIT_P : CH_EMPTY) к нужному разряду. (добавление точки (BIT_P) на чётных секундах, или пустоготы (CH_EMPTY) на нечётных).
- Сообщения: 330
- Зарегистрирован: Вс апр 17, 2011 12:09:57
Я наверное неправильно сформулировал идею.
Хотелось бы чтобы мигали в один такт две точки (у меня на дисплее две точки перпендикулярно разрядам), то есть не так что зажглась одна, погасла и тут же зажглась вторая, а сразу зажглись две, потом через секунду обе погасли.
Скажем нужно зажигание сегмента P у разряда ind[2] и ind[3].
Как будет тогда выглядить код?
Хотелось бы чтобы мигали в один такт две точки (у меня на дисплее две точки перпендикулярно разрядам), то есть не так что зажглась одна, погасла и тут же зажглась вторая, а сразу зажглись две, потом через секунду обе погасли.
Скажем нужно зажигание сегмента P у разряда ind[2] и ind[3].
Как будет тогда выглядить код?
- Реклама
Код: Выделить всё
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
ind[3] = time[HOUR] / 10 ? num[time[HOUR] / 10] : chZeroHour | (time[SEC] % 2 ? BIT_P : CH_EMPTY);chZeroHour ранее в коде назначается либо CH_EMPTY (пустота), либо 0, в зависимости от настройки отображения часов меньших 10.
time[SEC] - секунды.
Вот и получается фактически последняя строчка интерпретируется как...
3 цифра индикатора = (час/10 ненулевой ? рисуем час/10 : иначе рисуем 0 или пробел) | (секунды делятся на два ? подрисовываем точку : иначе ничего)
Да, расписать это в виде if/else могло бы быть понятнее, но с тернатрым оператором ?: оно короче выглядит.
- Сообщения: 330
- Зарегистрирован: Вс апр 17, 2011 12:09:57
Пробовал это код:
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
ind[3] = time[HOUR] / 10 ? num[time[HOUR] / 10] : chZeroHour | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
Пробовал этот:
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
ind[3] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
В обоих случаях точка 3-его разряда ind[3] не мигает и не загорается.
Что нужно дописать в этот код чтобы мигали точки ind[2] и ind[3]?
void segmTimeHM(int8_t *time)
{
uint8_t chZeroHour = CH_EMPTY;
if (zeroHour)
chZeroHour = CH_0;
ind[0] = num[time[MIN] % 10];
ind[1] = num[time[MIN] / 10];
#ifdef _NIXIE
ind[2] = num[time[HOUR] % 10];
(time[SEC] % 2) ? (PORT(SEG_G) |= SEG_G_LINE) : (PORT(SEG_G) &= ~SEG_G_LINE);
PORT(SEG_P) &= ~SEG_P_LINE;
PORT(SEG_F) &= ~SEG_F_LINE;
#else
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
#endif
ind[3] = time[HOUR] / 10 ? num[time[HOUR] / 10] : chZeroHour;
return;
}
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
ind[3] = time[HOUR] / 10 ? num[time[HOUR] / 10] : chZeroHour | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
Пробовал этот:
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
ind[3] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
В обоих случаях точка 3-его разряда ind[3] не мигает и не загорается.
Что нужно дописать в этот код чтобы мигали точки ind[2] и ind[3]?
void segmTimeHM(int8_t *time)
{
uint8_t chZeroHour = CH_EMPTY;
if (zeroHour)
chZeroHour = CH_0;
ind[0] = num[time[MIN] % 10];
ind[1] = num[time[MIN] / 10];
#ifdef _NIXIE
ind[2] = num[time[HOUR] % 10];
(time[SEC] % 2) ? (PORT(SEG_G) |= SEG_G_LINE) : (PORT(SEG_G) &= ~SEG_G_LINE);
PORT(SEG_P) &= ~SEG_P_LINE;
PORT(SEG_F) &= ~SEG_F_LINE;
#else
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
#endif
ind[3] = time[HOUR] / 10 ? num[time[HOUR] / 10] : chZeroHour;
return;
}
А уверены вообще, что точка эта принадлежит ind[3] (четвёртому справа разряду)?
- Сообщения: 330
- Зарегистрирован: Вс апр 17, 2011 12:09:57
Да уверен.
При подаче питания + через резистор на ind[3] и минус на [P] точка загорается.
При подаче питания + через резистор на ind[3] и минус на [P] точка загорается.
- Сообщения: 330
- Зарегистрирован: Вс апр 17, 2011 12:09:57
Какой код написать чтобы просто зажечь точку ind[3] разряда?
И в какую область кода segm.c его поместить (между какими строками)?
И в какую область кода segm.c его поместить (между какими строками)?
Просто записать нужные данные в ind[3].
Вот оригинальный код:
time[HOUR] - время (час), соответственно
time[HOUR] % 10 - единицы часов
time[HOUR] / 10 - десятки часов
Дальше. В массиве num[0..9] хранятся "картинки" цифр. То есть, num[3] хранит "изображение" цифры 3 и т.д. Например,
ind[2] = num[3]; - вызовет зажигание цифры '3' в позиции 2 (считаем позицию справа, начиная с нуля)
Соответственно
ind[2] = num[time[HOUR] % 10] - зажжёт в позиции 2 цифру единиц часа
ind[3] = num[time[HOUR] / 10] - зажжёт в позиции 3 цифру десятков часа
BIT_P - это точка. Добавив её к "картинке" цифры, получим её свечение. CH_EMPTY - это пустое место. Поэтому
ind[2] = num[time[HOUR] % 10] | CH_EMPTY; - единицы часа в позиции 2
ind[2] = num[time[HOUR] % 10] | BIT_P; - единицы часа в позиции 2 плюс точка
Вот и выходит
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY); - единицы часа в позиции 2 плюс, если секунды не делятся на 2 нацело - точка не горит, иначе горит.
Так и прочие разряды. Нужно дополнительно к чему-то в позиции pos дозажечь индикатор:
ind[pos] = blablabla; - оригинальный код
ind[pos] = blablabla | BIT_P; - постоянно горящая точка
ind[pos] = blablabla || (time[SEC] % 2 ? BIT_P : CH_EMPTY); - мигающая точка
Ничего сверхсложного.
Вот оригинальный код:
Код: Выделить всё
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
ind[3] = time[HOUR] / 10 ? num[time[HOUR] / 10] : chZeroHour;time[HOUR] % 10 - единицы часов
time[HOUR] / 10 - десятки часов
Дальше. В массиве num[0..9] хранятся "картинки" цифр. То есть, num[3] хранит "изображение" цифры 3 и т.д. Например,
ind[2] = num[3]; - вызовет зажигание цифры '3' в позиции 2 (считаем позицию справа, начиная с нуля)
Соответственно
ind[2] = num[time[HOUR] % 10] - зажжёт в позиции 2 цифру единиц часа
ind[3] = num[time[HOUR] / 10] - зажжёт в позиции 3 цифру десятков часа
BIT_P - это точка. Добавив её к "картинке" цифры, получим её свечение. CH_EMPTY - это пустое место. Поэтому
ind[2] = num[time[HOUR] % 10] | CH_EMPTY; - единицы часа в позиции 2
ind[2] = num[time[HOUR] % 10] | BIT_P; - единицы часа в позиции 2 плюс точка
Вот и выходит
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY); - единицы часа в позиции 2 плюс, если секунды не делятся на 2 нацело - точка не горит, иначе горит.
Так и прочие разряды. Нужно дополнительно к чему-то в позиции pos дозажечь индикатор:
ind[pos] = blablabla; - оригинальный код
ind[pos] = blablabla | BIT_P; - постоянно горящая точка
ind[pos] = blablabla || (time[SEC] % 2 ? BIT_P : CH_EMPTY); - мигающая точка
Ничего сверхсложного.
- Сообщения: 330
- Зарегистрирован: Вс апр 17, 2011 12:09:57
Так там строчки находятся между #else и #endif.
#else
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
#endif
ind[3] = time[HOUR] / 10 ? num[time[HOUR] / 10] : chZeroHour;
return;
}
Мне нужно дописать строчку сразу после ind[2] = блаблабла ? Чтобы она была между #else и #endif, но не как не после #endif ?
#else
ind[2] = num[time[HOUR] % 10] | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
#endif
ind[3] = time[HOUR] / 10 ? num[time[HOUR] / 10] : chZeroHour;
return;
}
Мне нужно дописать строчку сразу после ind[2] = блаблабла ? Чтобы она была между #else и #endif, но не как не после #endif ?
Нет. Я уже говорил - к строке с ind[3] дописать | (time[SEC] % 2 ? BIT_P : CH_EMPTY), и помимо десятков часов (time[HOUR] / 10) там ещё будет мигать и точка. То есть просто исправить строку после #endif на
В Proteus можно это проверить.

Код: Выделить всё
ind[3] = (time[HOUR] / 10 ? num[time[HOUR] / 10] : chZeroHour) | (time[SEC] % 2 ? BIT_P : CH_EMPTY);- Сообщения: 330
- Зарегистрирован: Вс апр 17, 2011 12:09:57
А... Как только посмотрел на картинку понял ошибку.
Нумерация разрядов идет наоборот.
Значит мне нужно не ind[3] точку зажигать, а ind[1].
Нумерация разрядов идет наоборот.
Значит мне нужно не ind[3] точку зажигать, а ind[1].
Я не один раз подчёркивал, что разряды нумеруются справа налево, начиная с нуля.
И здесь (что было даже процитировано), и здесь.
А здесь прямо было заявлено что таки да, ind[3].
Но внезапно это оказался ind[1]. Как так?
И здесь (что было даже процитировано), и здесь.
А здесь прямо было заявлено что таки да, ind[3].
Но внезапно это оказался ind[1]. Как так?
решил собрать приемник с большими индикаторами. хочу использовать cpd-23011sr2/a. с общим анодом. у них сегмент состоит из 4 последовательно соединенных светодиодов. то есть питание надо будет коммутировать около 7 вольт.
прошу совета как лучше организовать. по анодам и по катодам ставить транзисторы? может кто делал?
прошу совета как лучше организовать. по анодам и по катодам ставить транзисторы? может кто делал?
Да, тут придётся на каждый анод (разряд) ставить пару транзисторов (NPN + PNP), а на каждый катод (сегмент) - транзистор NPN.
В принципе, ничего страшного не произойдёт, если на катоды транзисторы не ставить, но всё же лучше с ними.
В принципе, ничего страшного не произойдёт, если на катоды транзисторы не ставить, но всё же лучше с ними.
спасибо за быстрый ответ. я видимо не очень понял принцип переключения сегментов. почему пару надо ставить в аноды? у меня была идея использовать прошивку с общими катодами и транзисторы для индикаторов с общими анодами как вариант. не прокатит?WiseLord писал(а):Да, тут придётся на каждый анод (разряд) ставить пару транзисторов (NPN + PNP), а на каждый катод (сегмент) - транзистор NPN.
В принципе, ничего страшного не произойдёт, если на катоды транзисторы не ставить, но всё же лучше с ними.
Если у индикаторов общий анод, значит, нужно иметь возможность как-то подать на этот анод 12В. Это можно сделать только через pnp транзистор, подключенный эмиттером к 12В, коллектором к аноду. Прямо к МК такой транзистор базой не подключишь, так как на базу этого транзистора при этом надо подавать 12В, чтобы его выключить, поэтому нужен ещё и npn транзистор.



