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



 

Урок 23

Часть 2

 

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

 

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

Мы пока не будем реализовывать функции самих часов, это лучше делать. как следует подготовив под это базовый проект.

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

А управлять мы будем яркостью свечения нашего индикатора постредством предварительно изученного нами в уроке 13 аппаратно реализованного в контроллере модуля широтно-импультной модуляции или ШИМ. Поэтому мы файлы 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;

 

Вот схема реализации управления яркостью по ШИМ (нажмите на картинку для увеличения изображения)

 

image08_0500

 

Ключевой транзистор для данной регулировки 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;

 

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

 

image09

 

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

 

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

 

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

 

image10 image11 image12 image13

 

Вот такой результат. Я думаю, понятно. Теперь у нас яркость свечения может регулироваться.

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

 

 

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

 

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

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

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

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

 

 

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

 

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

Один комментарий на “AVR Урок 23. Собираем часы на DS1307 и LED индикаторе. Часть 2
  1. Алексей:

    опечатка в коде 

    OCR2=0x100;

    надо OCR2=100; или OCR2=0x10;

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

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

*