Урок 23
Часть 1
Собираем часы на DS1307 и LED индикаторе
Сегодня мы продолжим нашу работу с микросхемой, являющейся часами реального времени, начатую в уроке 17, уроке 19 и уроке 21, и попробуем теперь собрать на ней часы с применением не жидкокристаллического индикатора, а с применение индикатора светодиодного четырёхразрядного работающего по принципу динамической индикации. Всё мы это с вами проходили, индикацию также проходили, подобный индикатор подключали в уроке 11, поэтому нам будет не так сложно это реализовать.
Но, несмотря на все наши знания урок не обещает быть коротким, а наоборот будет очень обширным, так как сборка часов на таких индикаторах требует решение очень многих дополнительных задач особенно потому, что у нас не 32 знакоместа, как на нашем LCD, а всего 4 и точка или двоеточие. И все показания надо выводить будет в порядке определённой очереди, а также потребует от нас умения организовать изменение показаний (перевода) с помощью кнопок, а может быть вообще с помощью одной только кнопки в рамках использования всего четырех цифр.
Но мы не боимся трудностей, с ними даже интереснее.
Поэтому начнём что-нибудь выдумывать.
Индикатор будет вот такого вот типа, из них именно типа с общим анода
А вот так индикатор выглядит вживую
Судя по клеточкам размером 5 миллиметров несложно оценить его размеры.
Вот его вид с обратной стороны
Также у меня есть ещё один индикатор меньшим размером, но по распиновке точь в точь такой же как и предыдущий. То есть я просто вынимаю из макетной платы и вставляю в него другой, и всё работает.
Вот они оба для сравнения
Вот маркировка маленького индикатора
Также мы можем использовать раздельные индикаторы для каждой цифры, подключив их соответствующим образом, результат будет тот же. Данный тип подключения обычно используется, когда требуются часы с большими цифрами и тяжело найти совмещённый индикатор больших размеров. Способ подключения наглядно демонстрируется в нашей схеме в протеусе, так как я нашёл в протеусе и совмещённый индикатор, но он у меня, почему-то должным образом не заработал (нажмите на картинку для увеличения изображения)
Данную схему мы хорошо помним из урока по динамической индикации. Только там было всего 2 индикатора, поэтому подключим ещё два, также будут использованы ещё два транзисторных ключа, на базу которых пойдут команды через токоограничивающие резистора на 2 килоома от ножек портов PB2 и PB4. Третью ножку порта B мы пропустим в целях её дальнейшего использования в другом альтернативном качестве, в качестве ножки аппаратного ШИМ для регулировки яркости свечения индикатора.
Создадим проект с именем MyClock1307LED, а код весь в главный модуль возьмём как раз из урока по динамической индикации, из проекта Test08. В ту пору у нас пока не было модульного программирования и весь полезный код содержался в одном главном модуле.
Для начала соберём наш проект, подключим контроллер и его прошьём и посмотрим для интереса результат работы кода
Мы видим что два правых индикатора у нас нормально работают. Но нам нужно четыре.
Для начала для этого мы добавим ещё две переменные для двух неиспользуемых разрядов
unsigned int i;
unsigned char R1=0, R2=0, R3=0, R4=0; //цифры разрядов индикатора
Объявим ещё соответствующие данным анодам ножки порта на выход в функции port_ini(), также включая и ножку для ШИМ
DDRB = 0b00011111;
Также добавим код в функцию ledprint
void ledprint(unsigned int number)
{
R1 = number%10;
R2 = number%100/10;
R3 = number%1000/100;
R4 = number/1000;
}
У нас тут ещё вычисляется результат цифр недостающих, так же во втором разряде произошли некоторые изменения в силу того. что он теперь не последний, и надо сотни и тысячи отбросить.
Переменные мы рассчитали, осталось их как-то отобразить на индикаторе.
Для этого мы изменим код в обработчике прерывания от таймера
ISR (TIMER1_COMPA_vect)
{
if(n_count==0) {PORTB&=~(1<<PORTB0);PORTB|=(1<<PORTB1)|(1<<PORTB2)|(1<<PORTB4);segchar(R1);}
if(n_count==1) {PORTB&=~(1<<PORTB1);PORTB|=(1<<PORTB0)|(1<<PORTB2)|(1<<PORTB4);segchar(R2);}
if(n_count==2) {PORTB&=~(1<<PORTB2);PORTB|=(1<<PORTB0)|(1<<PORTB1)|(1<<PORTB4);segchar(R3);}
if(n_count==3) {PORTB&=~(1<<PORTB4);PORTB|=(1<<PORTB0)|(1<<PORTB1)|(1<<PORTB2);segchar(R4);}
n_count++;
if (n_count>3) n_count=0;
}
Тут, я думаю также всё понятно, мы подаём логический ноль на ключевой транзистор нужного нам разряда, так как мы знаем, что ключи у нас инверсные и с другой строны будет единица, а также подаём логические единицы на ключевые транзисторы тех разрядов, которые в данный момент светиться не должны, также мы считаем не до одного, а до трёх.
С этим всё.
Но, так как у нас теперь количество индикаторов увеличилось, теперь очередь до того же индикатора доходит позже, то есть скорость обнолвения показаний одного индикатора у нас упала, и мы должны немного перенастроить таймер. Как это делать, нас учить не надо
OCR1AH = 0b00001111; //записываем в регистр число для сравнения
OCR1AL = 0b01000010;
Ну и сделаем возможность нашему счётчику считать не до 99, а до 9999 для этого в цикле мы напишем не 100, а 10000
for (i=0;i<10000;i++)
И также уменьшим задержку, иначе с такой скоростью мы четвёртой цифры долго не дождёмся
_delay_ms(10);
Соберём код, прошьём контроллер и посмотрим результат нашей работы
Вот теперь другое дело. У нас теперь есть рабочий код для организации динамической индикации четырёхразрядного динамического индикатора, поэтому в следующей части нашего занятия нам к этому вопросу уже больше возвращаться не придется.
Предыдущий урок Программирование МК AVR Следующая часть
Программатор, модуль RTC DS1307 с микросхемой памяти и индикатор можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Модуль RTC DS1307 с микросхемой памяти
Семисегментный чертырехразрядный индикатор красный (с общим анодом или катодом на выбор) 10 шт
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий