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

 

 

 

 

Урок 23

Часть 12

 

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

 

 

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

Это тоже очень хорошо. Хорошо тем, что код у нас успешно работает, но под светодиод вряд ли кто проснётся.

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

Пищалку мы подключим чуть позже, а пока добавим ещё одну переменную для текущего режима будильника в main.h и button.c

 

unsigned char clockeditmode,clockincmode,alarmmode,alarmcmp,alarmbeep;

 

extern unsigned char clockeditmode,clockincmode,alarmbeep;

 

Инициализируем её в функции main()

 

alarmcmp=0;

alarmbeep=0;

 

В конце бесконечного цикла включим в условие проверку данного флага

 

if((alarmcmp==1)&&(alarmbeep==1))

{

  alarm();

}

 

Сделаем отключение флага по короткому нажатию кнопки в модуле button.c

 

if((button_cnt>3)&&(button_cnt<=60)) //если будет до 3 — то считаем это дребезгом

{

  clockincmode=MODEINC;//включаем прибавление значения показателя

  if(clockeditmode==MODENONEEDIT) alarmbeep=0;//отключим будильник

}

 

Теперь нам нужно где-то этот флаг включить. Сделаем это при совпадении показателей в бесконечном цикле функции main()

 

if((alarmmin==min)&&(alarmhour==hour)&&(clockeditmode==MODENONEEDIT))

{

  //добавим условие, чтобы не включить повторно после короткого нажатия кнопки

  if(alarmcmp==0) alarmbeep=1;

  alarmcmp=1;

}

 

Для работы будущей пищалки добавим некоторый код в функцию alarm()

 

void alarm(void)

{

  PORTC |= (1<<PORTC1); //логическая 1

  _delay_ms(15);

  PORTC&=~(1<<PORTC1); //логический 0

}

 

Подключим пищалку по следующей схеме вместо светодиода

 

image50

 

 

А практически всё это будет выглядеть вот так

 

image51

 

Так как пищалка подключена в режиме инвертора, немного подправим код для ножки PC1 в функции инициализации портов, иначе у нас она будет постоянно пищать

 

DDRC |= (1<<DDRC1); // ножку PORTC1 на выход

PORTC |= (1<<PORTC1); //логическая 1

 

Также в функции alarm() поменяем местами строки

 

PORTC&=~(1<<PORTC1); //логический 0

_delay_ms(15);

PORTC |= (1<<PORTC1); //логическая 1

 

Также изменим код в самом низу бесконечного цикла

 

  PORTC |= (1<<PORTC1); //логическая 1

}

 

Теперь можно собрать код, прошить контроллер и проверить.

Показать я звук писка будильника не смогу на картинке, слышно это в видеоверсии урока, которая прикреплена внизу страницы.

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

 

void alarm(void)

{

  if(sec%4!=0) PORTC&=~(1<<PORTC1); //логический 0

  _delay_ms(15);

  PORTC |= (1<<PORTC1); //логическая 1

}

 

Теперь логический ноль у нас будет включаться в течении трех секунд, а одну будет отключен.

Ещё раз проверим наш код и убедимся, что всё у нас работает.

Ну вот мы наконец и завершили наш урок по часам со светодиодным четырёхразрядным индикаоторм с одной кнопкой.

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

Мы данной переменной практически не воспользовались и это дело я оставляю как домашнее задание. Я думаю, вы справитесь. Напишите свои варианты в комментариях.

Подсказка: можно завести ещё один режим редактирования и в данном режиме например отображать что-то типа A0 или A1 в зависимости от задействованности будильника и по кнопке менять данный режим.

 

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

 

Исходный код

 

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

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

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

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

 

 

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

 

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

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

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

*