Урок 23
Часть 2
Собираем часы на DS1307 и LED индикаторе
В прошлой части нашего занятия мы познакомились с четрырёхразрядным семисегментным светодиодным индикатором с общим анодом, а также написали код по его подключению и обеспечения его работоспособности, так как именно на данном индикаторе мы и реализовываем наши будущие часы.
Мы пока не будем реализовывать функции самих часов, это лучше делать. как следует подготовив под это базовый проект.
А в данной части мы попробуем поуправлять яркостью свечения одновременно всех четырёх разрядов нашего индикатора.
А управлять мы будем яркостью свечения нашего индикатора посредством предварительно изученного нами в уроке 13 аппаратно реализованного в контроллере модуля широтно-импульcной модуляции или ШИМ. Поэтому мы файлы PWM.c и PWM.h из проекта Test10 данного занятия подключим в наш новый проект.
Также мы создадим заголовочный файл главного модуля main.h, подключив заодно и вышеуказанную библиотеку для реализации ШИМ в данный файл. Вот весть текст main.h на данный момент
#ifndef MAIN_H_
#define MAIN_H_
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include «PWM.h»
#endif /* MAIN_H_ */
И также файл main.h подключим в главный модуль
#include «main.h»
//—————————————-
unsigned int i;
Вот схема реализации управления яркостью по ШИМ (нажмите на картинку для увеличения изображения)
Ключевой транзистор для данной регулировки Q5 был включен в разрыв подтяжки питания к четырем ключевым транзисторам, управляющими анодами индикатора. Причём включен был транзистор другой полярности навстречу, то есть к общим эмиттерам своим эмиттером, а на его базу с помощью токоограничивающего резистора подаётся широтно-импульсно-модулированный сигнал с соответствующей ножки контроллера PB3.
Вернемся в исходный код. Из него всё лишнее поубираем, оставим только самое нужное, уберём наш счётчик пока, из глобальных переменных остались только вот эти
#include «main.h»
//—————————————-
unsigned char R1=0, R2=0, R3=0, R4=0;
В функции main() осталось только вот это
int main(void)
{
timer_ini();
DDRD = 0xFF;
DDRB = 0b00011111;//3 ножки оставляем на вход для кнопок
PORTD = 0b11111111;
PORTB = 0b00100000;
sei();
while(1)
{
ledprint(1234);
_delay_ms(50);
}
}
То есть у нас должно постоянно выводиться число 1234.
Теперь, собрав код и прошив контроллер, мы убедимся, что у нас теперь вообще индикатор не будет светиться. Так как наш новый транзистор подключен к ножке аппаратной реализации ШИМ, и при равном нулю значении регистра OCR2 у нас скважность равна нулю и соответственно свечение будет самым минимальным, а точнее вообще никаким. И во-вторых у нас ШИМ ещё и не инициализирован. Проделаем всё это в функции main(), также занеся в регистр OCR2 какое-нибудь число
PORTB = 0b00100000;
init_PWM_timer();
OCR2=0x100;
Теперь можно собрать проект и прошьём контроллер, то мы увидим, что индикатор наш заявленное число показывает, но с яркостью. намного меньшей, чем максимальная
Теперь давайте напишем какой-то код, чтобы у нас яркость регулировалась плавно в цикле, а впоследствии мы конечно будем яркость регулировать с помощью подключенного фоторезистора. Пока добавим переменную
int main(void)
{
unsigned int pwm_state=0;
А код возьмём из проекта Test10 урока по ШИМ и показывать будем значение регистра OCR2
while(1)
{
if (pwm_state==0)
{
OCR2++;
if (OCR2>254)
{
pwm_state=1;
}
}
if (pwm_state==1)
{
OCR2—;
if (OCR2<1)
{
pwm_state=0;
}
}
ledprint(OCR2);
Опять соберём код и прошьём контроллер, а затем посмотрим результат
Вот такой результат. Я думаю, понятно. Теперь у нас яркость свечения может регулироваться.
В следующей части мы уже к нашему проекту будем цеплять микросхемку DS1307 и придумывать для неё код.
Предыдущая часть Программирование МК AVR Следующая часть
Программатор, модуль RTC DS1307 с микросхемой памяти и индикатор можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Модуль RTC DS1307 с микросхемой памяти
Семисегментный чертырехразрядный индикатор красный (с общим анодом или катодом на выбор) 10 шт
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
опечатка в коде
OCR2=0x100;
надо OCR2=100; или OCR2=0x10;