AVR Урок 23
Урок 23
Збираємо годинник на DS1307 та LED індикаторі
Сьогодні ми продовжимо нашу роботу з мікросхемою, що є годинником реального часу, розпочату вуроці 17,уроці 19 іуроці 21, і спробуємо тепер зібрати на ній годинник з застосуванням не рідкокристалічного індикатора, а із застосування індикатора світлодіодного чотирирозрядного працюючого за принципом динамічної індикації. Всі ми це з вами проходили, індикацію також проходили, подібний індикатор підключали в уроці 11, тому нам буде не так складно це реалізувати.
Але, незважаючи на всі наші знання урок не обіцяє бути коротким, а навпаки буде дуже великим, тому що складання годинників на таких індикаторах вимагає вирішення багатьох додаткових завдань особливо тому, що у нас не 32 знайомі, як на нашому LCD, а всього 4 і точка або двокрапка. І всі показання треба виводити буде в порядку певної черги, а також вимагатиме від нас вміння організувати зміну показань (перекладу) за допомогою кнопок, а може взагалі за допомогою однієї лише кнопки в рамках використання всього чотирьох цифр.
Але ми не боїмося труднощів, з ними навіть цікавіше.
Тому почнемо щось вигадувати.
Індикатор буде такого типу, з них саме типу із загальним анода

А ось так індикатор виглядає наживо

Судячи з клітин розміром 5 мм нескладно оцінити його розміри.
Ось його вигляд із зворотного боку

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

Ось маркування маленького індикатора
Також ми можемо використовувати окремі індикатори для кожної цифри, підключивши їх відповідним чином, результат буде той самий. Цей тип підключення зазвичай використовується, коли потрібно годинник з великими цифрами і важко знайти суміщений індикатор великих розмірів. Спосіб підключення наочно демонструється в нашій схемі в протеусі, тому що я знайшов у протеусі і поєднаний індикатор, але він у мене чомусь належним чином не заробив (натисніть на картинку для збільшення зображення)

Цю схему ми добре пам'ятаємо з урокудинамічної індикації. Тільки там було всього 2 індикатори, тому підключимо ще два, також будуть використані ще два транзисторні ключі, на базу яких підуть команди через струмообмежуючі резистора на 2 кілооми від ніжок портівPB2 іPB4. Третю ніжку порту B ми пропустимо з метою її подальшого використання в іншій альтернативній якості, в якості ніжки апаратного ШИМ для регулювання яскравості індикатора.
Створимо проект з ім'ямMyClock1307LED, а код весь у головний модуль візьмемо саме з уроку з динамічної індикації, з проектуTest08. На той час у нас поки що не було модульного програмування і весь корисний код містився в одному головному модулі.
Для початку зберемо наш проект, підключимо контролер та його прошимо і подивимося для інтересу результат роботи коду

Ми бачимо, що два праві індикатори у нас нормально працюють. Але нам потрібні чотири.
Для початку для цього ми додамо ще дві змінні для двох розрядів, що не використовуються.
unsigned char R1 = 0, R2 = 0,R3 = 0, R4= 0 ; //Цифри розрядів індикатора
Оголосимо відповідніданим анодам ніжки порту на вихід у функції port_ini(), також включаючи і ніжку для ШІМ
DDRB = 0b000111 11;
Також додамо код у функцію ledprint
void ledprint ( unsigned int number )
R2 = number %100/10;
R3 = number %1000/100;
R4 = number /1000;
У нас тут ще обчислюється результат цифр, що відсутні, так само в другому розряді відбулися деякі зміни через те. що він тепер не останній, і треба сотні та тисячі відкинути.
Змінні ми розрахували, лишилося їх якось відобразити на індикаторі.
Для цього ми змінимо код в обробнику переривання від таймера
if (n_count ==0) < PORTB &=
(1 PORTB0); PORTB = (1 PORTB1) (1 PORTB2) (1 PORTB4); segchar (R1); & gt;
if (n_count ==1) < PORTB &=
(1 PORTB1); PORTB = (1 PORTB0) (1 PORTB2) (1 PORTB4); segchar (R2); & gt;
if (n_count ==2) < PORTB &=
(1 PORTB2); PORTB = (1 PORTB0) (1 PORTB1) (1 PORTB4); segchar (R3); & gt;
if (n_count ==3) < PORTB &=
(1 PORTB4); PORTB = (1 PORTB0) (1 PORTB1) (1 PORTB2); segchar (R4); & gt;
if (n_count >3 ) n_count =0;
Тут, я думаю також все зрозуміло, ми подаємо логічний нуль на ключовий транзистор потрібного нам розряду, тому що ми знаємо, що ключі у нас інверсні і з іншого боку буде одиниця, а також подаємо логічні одиниці на ключові транзистори тих розрядів, які в даний момент світитися не повинні, також ми рахуємо не до одного, а до трьох.
Але, так як у нас тепер кількість індикаторів збільшилася, тепер черга до того ж індикатора доходить пізніше, тобто швидкість оновлення показань одного індикатора у нас впала, і ми повинні трохипереналаштувати таймер. Як це робити, нас учити не треба
OCR1AH =0b00001111 ; //записуємо в регістр число для порівняння
OCR1AL =0b01000010 ;
Ну і зробимо можливість нашому лічильнику рахувати не до 99, а до 9999 для цього в циклі ми напишемо не 100, а 10000
for (i = 0; i 10000; i ++)
І також зменшимо затримку, інакше з такою швидкістю ми четвертої цифри довго не дочекаємось
_delay_ms (10 );
Зберемо код, прохаємо контролер і подивимося результат нашої роботи

Ось тепер інша річ. У нас тепер є робочий код для організації динамічної індикації чотирирозрядного динамічного індикатора, тому в наступній частині нашого заняття нам до цього питання вже більше повертатися не доведеться.
Програматор, модуль RTC DS1307 з мікросхемою пам'яті та індикатор можна придбати тут:
Дивитись ВІДЕОУРОК (натисніть на картинку)