Arduino бинарные часы будильник binary clock alarm atmega328 часть 1 - part 1

Опубликовано: 27 Февраль 2021
на канале: Дмитрий Осипов
551
16

Arduino_binary_clock_alarm_atmega328_2021_02_27.ino
https://ok.ru/group/55500490473687/to...
замените символы юникода ◄ ► на знаки больше меньше►
replace unicode characters ◄ ► with greater than less characters


/*
Arduino_binary_clock_alarm_atmega328_2021_02_27
arduino-IDE v 1.6.12 - atmega328.
бинарные часы.
показываем часы минуты секунды с помощью светодиодов в бинарном виде, также есть настройки для будильника.
https://diodov.net/tajmer-svoimi-ruka...
https://habr.com/ru/post/453276/


*/


#define HH (((__TIME__[0] - '0') * 10) + __TIME__[1] - '0') // текущее часы - на компьютере.
#define MM (((__TIME__[3] - '0') * 10) + __TIME__[4] - '0') // текущее минуты - на компьютере.
#define SS (((__TIME__[6] - '0') * 10) + __TIME__[7] - '0') // текущее секунды.
// #define CHAR_TO_INT(x,r) (((x - '0') * 10) + r - '0')

volatile byte hours = HH, minutes = MM, seconds = SS; минуты, секунды.
volatile bool flag_timeCorrection = true;
volatile bool flag_printTime = true;

void setup() {
Serial.begin(9600);
Serial.println(F(__DATE__"\t"__TIME__));
Serial.println(F(__TIMESTAMP__));




PORTB = 0b00111110;
PORTD = 0b11111100;
PORTC = 0b111111;

DDRB = (hours ◄◄ 1);
DDRD = (minutes ◄◄ 2);
DDRC = seconds;



// Таймеры, как и внешние прерывания, работают независимо от основной программы.
// инициализация Timer-1 (16 битный) "Этот таймер использует библиотека Arduino Servo".
cli(); // отключить глобальные прерывания.
TCCR1A = 0, TCCR1B = 0; // устанавливаем регистры (TCCR1A и TCCR1B) в 0.
OCR1A = 15626; // устанавливаем число, для регистра совпадения. (правильно 15624. - "у меня проблема с
кварцевым резонатором").
TCCR1B |= (1 ◄◄ WGM12); // включаем CTC режим - сброс таймера по совпадению.
TCCR1B |= (1 ◄◄ CS10) | (1 ◄◄ CS12); // Установить биты на коэффициент деления 1024, частота тактового
источника / на 1024.
TIMSK1 |= (1 ◄◄ OCIE1A); // включаем прерывание по совпадению с числом регистра совпадения.
sei(); // включить глобальные прерывания.





while (1) { // вместо void loop() основная программа будет крутится здесь. в loop() много мусора, который
тормозит программу.

if (flag_printTime) {

Serial.print(F("hours\t")); //
Serial.print(hours); // выводим состояние порта DDRB, в десятичном виде.
Serial.print('\t');
// выводим состояние порта DDRB в двоичном виде. "(16) - только 5 разрядов, включая нули слева.
for (byte mask = 16; mask; mask ►►= 1)(mask & hours) ? Serial.print('1') : Serial.print('0'); // выводим
в двоичном виде.


Serial.print(F(";\t\tminutes\t"));
Serial.print(minutes); // выводим состояние порта DDRD, в десятичном виде.
Serial.print('\t');
// выводим состояние порта DDRD в двоичном виде. (32)- только 6 разрядов, включая нули слева.
for (byte mask = 32; mask; mask ►►= 1)(mask & minutes) ? Serial.print('1') : Serial.print('0'); //
выводим в двоичном виде.


Serial.print(F(";\t\tseconds\t"));
Serial.print(seconds); // выводим состояние порта DDRC, в десятичном виде.
Serial.print('\t');
// выводим состояние порта DDRC в двоичном виде. (32)- только 6 разрядов, включая нули слева.
for (byte mask = 32; mask; mask ►►= 1)(mask & seconds) ? Serial.print('1') : Serial.print('0'); //
выводим в двоичном виде.
Serial.println(';');


flag_printTime = false;
}


// основная программа.



// если нужно установить будильник.
if ((hours == 19) && (minutes == 30) && (seconds == 27)) { // устанавливаем время срабатывания будильника.
Serial.println("ALARM");
DDRD = 0b11111100; // устанавливаем в OUTPUT.
for (int i = 0; i ◄ 9; i++) {
DDRD = ~ DDRD; // инвертируем (INPUT - OUTPUT). мигаем: OUTPUT - яркость светодиодов будет яркой.
INPUT тусклой.
while ((seconds & 1) == (i & 1)); // задержка через Проверку на чётность 1 секунда.
}

DDRD = (minutes ◄◄ 2); // восстанавливаем, отображение минут светодиодами.

}


// основная программа.


}

}

void loop() {}







ISR(TIMER1_COMPA_vect) { // обработчик прерывания по совпадению с числом регистра. Timer_1. запускается с
интервалом одна секунда.

if (flag_timeCorrection && (seconds ◄ 40)) { // только один раз, корректируем время.
seconds += 8; // прибавляем к времени с компьютера, время загрузки кода.
flag_timeCorrection = false;
}

seconds++; // увеличиваем на 1.
if (seconds ►= 60) {
seconds = 0;
minutes++; // увеличиваем на 1.
if (minutes ►= 60) {
minutes = 0;
hours++;
if (hours ►= 24)hours = 0;
DDRB = (hours ◄◄ 1);
}

DDRD = (minutes ◄◄ 2);
}

DDRC = seconds; // записываем в порт (C) текущее значение секунды, через OUTPUT. (6 - bit).
flag_printTime = true;
}


/*

@: bat - файл printTIME
@echo off
:test
echo %TIME%
goto test

*/



Ссылка на видео:
   • Arduino бинарные часы будильник binar...