Цифровой приёмник на TEA5767 c часами на DS1307

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Вс апр 17, 2011 12:09:57

Сообщение уткодроз »

Все отлично. Но вот еще вопрос - где в коде прописано мигание точкой при вывода на дисплей часов?
Хотел добавить мигание еще одной точкой чтобы две точки мигали, но не нашел в коде нужных строк.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Контактная информация:
Реклама
Потрогал лапой паяльник
Сообщения: 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);

?
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Не совсем. Добавить | (time[SEC] % 2 ? BIT_P : CH_EMPTY) к нужному разряду. (добавление точки (BIT_P) на чётных секундах, или пустоготы (CH_EMPTY) на нечётных).
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Вс апр 17, 2011 12:09:57

Сообщение уткодроз »

Я наверное неправильно сформулировал идею.
Хотелось бы чтобы мигали в один такт две точки (у меня на дисплее две точки перпендикулярно разрядам), то есть не так что зажглась одна, погасла и тут же зажглась вторая, а сразу зажглись две, потом через секунду обе погасли.
Скажем нужно зажигание сегмента P у разряда ind[2] и ind[3].
Как будет тогда выглядить код?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

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

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);
time[HOUR] - это часы, time[HOUR] / 10 - единица часов.
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;
}
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

А уверены вообще, что точка эта принадлежит ind[3] (четвёртому справа разряду)?
Контактная информация:
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Вс апр 17, 2011 12:09:57

Сообщение уткодроз »

Да уверен.

При подаче питания + через резистор на ind[3] и минус на [P] точка загорается.
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Вс апр 17, 2011 12:09:57

Сообщение уткодроз »

Какой код написать чтобы просто зажечь точку ind[3] разряда?
И в какую область кода segm.c его поместить (между какими строками)?
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Просто записать нужные данные в 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[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); - мигающая точка

Ничего сверхсложного.
Контактная информация:
Потрогал лапой паяльник
Сообщения: 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 ?
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Нет. Я уже говорил - к строке с ind[3] дописать | (time[SEC] % 2 ? BIT_P : CH_EMPTY), и помимо десятков часов (time[HOUR] / 10) там ещё будет мигать и точка. То есть просто исправить строку после #endif на

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

ind[3] = (time[HOUR] / 10 ? num[time[HOUR] / 10] : chZeroHour) | (time[SEC] % 2 ? BIT_P : CH_EMPTY);
В Proteus можно это проверить.

Изображение
Контактная информация:
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Вс апр 17, 2011 12:09:57

Сообщение уткодроз »

А... Как только посмотрел на картинку понял ошибку.
Нумерация разрядов идет наоборот.
Значит мне нужно не ind[3] точку зажигать, а ind[1].
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Я не один раз подчёркивал, что разряды нумеруются справа налево, начиная с нуля.
И здесь (что было даже процитировано), и здесь.

А здесь прямо было заявлено что таки да, ind[3].

Но внезапно это оказался ind[1]. Как так?
Контактная информация:
k22
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Пт сен 11, 2015 21:59:22
Откуда: Нижний Новгород

Сообщение k22 »

решил собрать приемник с большими индикаторами. хочу использовать cpd-23011sr2/a. с общим анодом. у них сегмент состоит из 4 последовательно соединенных светодиодов. то есть питание надо будет коммутировать около 7 вольт.
прошу совета как лучше организовать. по анодам и по катодам ставить транзисторы? может кто делал?
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Да, тут придётся на каждый анод (разряд) ставить пару транзисторов (NPN + PNP), а на каждый катод (сегмент) - транзистор NPN.

В принципе, ничего страшного не произойдёт, если на катоды транзисторы не ставить, но всё же лучше с ними.
Контактная информация:
k22
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Пт сен 11, 2015 21:59:22
Откуда: Нижний Новгород

Сообщение k22 »

WiseLord писал(а):Да, тут придётся на каждый анод (разряд) ставить пару транзисторов (NPN + PNP), а на каждый катод (сегмент) - транзистор NPN.

В принципе, ничего страшного не произойдёт, если на катоды транзисторы не ставить, но всё же лучше с ними.
спасибо за быстрый ответ. я видимо не очень понял принцип переключения сегментов. почему пару надо ставить в аноды? у меня была идея использовать прошивку с общими катодами и транзисторы для индикаторов с общими анодами как вариант. не прокатит?
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Если у индикаторов общий анод, значит, нужно иметь возможность как-то подать на этот анод 12В. Это можно сделать только через pnp транзистор, подключенный эмиттером к 12В, коллектором к аноду. Прямо к МК такой транзистор базой не подключишь, так как на базу этого транзистора при этом надо подавать 12В, чтобы его выключить, поэтому нужен ещё и npn транзистор.

Изображение
Контактная информация:
k22
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Пт сен 11, 2015 21:59:22
Откуда: Нижний Новгород

Сообщение k22 »

спасибо. буду платку разводить.
Ответить

Вернуться в «AVR»