AVR Урок 23. Собираем часы на DS1307 и LED индикаторе. Часть 1

 

 

 

 

Урок 23

Часть 1

 

Собираем часы на DS1307 и LED индикаторе

 

 

Сегодня мы продолжим нашу работу с микросхемой, являющейся часами реального времени, начатую в уроке 17, уроке 19 и уроке 21, и попробуем теперь собрать на ней часы с применением не жидкокристаллического индикатора, а с применение индикатора светодиодного четырёхразрядного работающего по принципу динамической индикации. Всё мы это с вами проходили, индикацию также проходили, подобный индикатор подключали в уроке 11, поэтому нам будет не так сложно это реализовать.

Но, несмотря на все наши знания урок не обещает быть коротким, а наоборот будет очень обширным, так как сборка часов на таких индикаторах требует решение очень многих дополнительных задач особенно потому, что у нас не 32 знакоместа, как на нашем LCD, а всего 4 и точка или двоеточие. И все показания надо выводить будет в порядке определённой очереди, а также потребует от нас умения организовать изменение показаний (перевода) с помощью кнопок, а может быть вообще с помощью одной только кнопки в рамках использования всего четырех цифр.

Но мы не боимся трудностей, с ними даже интереснее.

Поэтому начнём что-нибудь выдумывать.

Индикатор будет вот такого вот типа, из них именно типа с общим анода

 

image00

 

А вот так индикатор выглядит вживую

 

image01

 

Судя по клеточкам размером 5 милиметров несложно оценить его размеры.

Вот его вид с обратной стороны

 

image02

 

Также у меня есть ещё один индикатор меньшим размером, но по распиновке точь в точь такой же как и предыдущий. То есть я просто вынимаю из макетной платы и вставляю в него другой, и всё работает.

Вот они оба для сравнения

 

image03

 

 

Вот маркировка маленького индикатора

 

image04

 

Также мы можем использовать раздельные индикаторы для каждой цифры, подключив их соответствующим образом, результат будет тот же. Данный тип подключения обычно используется, когда требуются часы с большими цифрами и тяжело найти совмещённый индикатор больших размеров. Способ подключения наглядно демонстрируеся в нашей схеме в протеусе, так как я нашёл в протеусе и совмещённый индикатор, но он у меня, почему-то должным образом не заработал (нажмите на картинку для увеличения изображения)

 

image05_0500

 

Данную схему мы хорошо помним из урока по динамической индикации. Только там было всего 2 индикатора, поэтому подключим ещё два, также будут использованы ещё два транзисторных ключа, на базу которых пойдут команды через токоограничивающие резистора на 2 килоома от ножек портов PB2 и PB4. Третью ножку порта B мы пропустим в целях её дальнейшего использования в другом альтернативном качестве, в качестве ножки аппаратного ШИМ для регулировки яркости свечения индикатора.

 

 

Создадим проект с именем MyClock1307LED, а код весь в главный модуль возьмём как раз из урока по динамической индикации, из проекта Test08. В ту пору у нас пока не было модульного программирования и весь полезный код содержался в одном главном модуле.

Для начала соберём наш проект, подключим контроллер и его прошьём и посмотрим для интереса результат работы кода

 

image06

 

Мы видим что два правых индикатора у нас нормально работают. Но нам нужно четыре.

Для начала для этого мы добавим ещё две переменные для двух неиспользуемых разрядов

 

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);

 

Соберём код, прошьём контроллер и посмотрим результат нашей работы

 

image07

 

Вот теперь другое дело. У нас теперь есть рабочий код для организации динамической индикации четырёхразрядного динамического индикатора, поэтому в следующей части нашего занятия нам к этому вопросу уже больше возвращаться не придется.

 

Предыдущий урок Программирование МК AVR Следующая часть

 

Программатор, модуль RTC DS1307 с микросхемой памяти и индикатор можно приобрести здесь:

Программатор (продавец надёжный) USBASP USBISP 2.0

Модуль RTC DS1307 с микросхемой памяти

Семисегментный чертырехразрядный индикатор красный с общим анодом 10 шт

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR Собираем часы на DS1307 и LED индикаторе

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*