Ви не увійшли.
Проверили.
Правда не совсем точно...
Скважность, конечно не ровно 2, но близко к тому. Читать надо.
Как это "не ровно"?
Если время пустого цикла loop() порядка ~0.5мкс. то при delay( 1 ) скважность будет 1 + 1.0005 - это и есть "не ровно 2"?
Неактивний
Вот любопытные вещи относительно хронометража в Arduino:
При использовании millis() нужно помнить об одной особенности - millis() "тикает" не равномерно.
Возвращаемое значение увеличивается на единицу каждые 1024 мсек. Затем, когда миллис отстанет на 1 мсек, она "подводится" на единицу, т.е. возвращаемое значение перескакивает через один.
При измерении длительных интервалов это не страшно, но при интервалах в несколько мсек это заметно.
Смотря, что вы считаете длительным интервалом ... по моему весьма заметно....
#include <S65Display.h>
S65Display lcd;
#define BLACK RGB( 0, 0, 0)
#define WHITE RGB(255,255,255)
#define RED RGB(255, 0, 0)
#define GREEN RGB( 0,255, 0)
#define GREEN2 RGB( 0,255, 51)
#define BLUE RGB( 0, 0,255)
#define YELLOW RGB(255,255, 0)
#define YELLOW2 RGB(153,153, 0)
#define PINK RGB(204,051,153)
#define BGCOLOR RGB( 51,204,255)
char str[10];
byte hour=0, minut=0, secund=0;
unsigned long TimeCHR;
byte Sec=0, Min=0, Hrs=0;
void setup() {
lcd.init(2); lcd.clear(0);
lcd.clear(BLACK); //закрашиваем дисплей
lcd.drawRect(1,1,175,131,RED); // рисуем рамку
lcd.drawRect(3,3,173,129,GREEN2); // рисуем рамку
lcd.drawRect(5,5,171,127,BLUE); // рисуем рамку
lcd.drawText(52, 55,"test time", 1, GREEN, BLACK);
// ************************************
// * Настраиваем таймер времени *
// ************************************
TIMSK1 = 0x01; // включенно глобальное прерывание переполнения таймера
TCCR1A = 0x00;
TCNT1 = 0x0BDC; // установить начальное значение для удаления ошибки времени (регистр бит-бит)
TCCR1B = 0x04; // запуск таймера / установка часов
}
// ********************************************************************
// функция учета времени
// ********************************************************************
ISR(TIMER1_OVF_vect) { TCNT1=0x0BDC; measure(); }
// функция вызывается с интервалом в одну секунду
void measure (void) { secund++;
if (secund==60) {secund=0; minut++;}
if (minut==60) {minut=0; hour++;}
if (hour==24) {hour=0;}
sprintf(str, "%02d.%02d.%02d", (int)hour, (int)minut, (int)secund);
lcd.drawText(55, 25, str, 1, YELLOW, BLACK); }
// ====================================================================
// ====================================================================
void loop() {
TimeCHR = millis();
Sec = (TimeCHR/1000L)%60;
Min = ((TimeCHR/1000L)/60L)%60;
Hrs = ((TimeCHR/1000L)/3600L)%24;
sprintf(str, "%02d.%02d.%02d", (int)Hrs, (int)Min, (int)Sec);
lcd.drawText(55, 85, str, 1, YELLOW2, BLACK);
/* for (int i = 0; i <= 15; i++) {
lcd.drawText(52, 55,"test time", 1, WHITE, BLACK); delay(100);
lcd.drawText(52, 55,"test time", 1, RED, BLACK); delay(100);
lcd.drawText(52, 55,"test time", 1, BLUE, BLACK); delay(100);
lcd.drawText(52, 55,"test time", 1, PINK, BLACK); delay(100);
lcd.drawText(52, 55,"test time", 1, GREEN, BLACK); delay(100);
} */
}
// ====================================================================
Неактивний
На самом деле millis() имеет джиттер. А на 8-ми мгц просто гигантский! Поэтому иногда (например для динамической индикации) приходится использовать нештатный миллис().
Ну а в пустом loope конечно можно добиться абсолютной (до такта) скважности = 2, только зачем?)
Неактивний