#26 2018-03-27 23:54:18

Olej
Учасник
З Харьков
Зареєстрований: 2018-03-08
Повідомлень: 234

Re: служба времени Arduino

Kaka пише:

Проверили.

Правда не совсем точно...

Kaka пише:

Скважность, конечно не ровно 2, но близко к тому. Читать надо.

Как это "не ровно"?
Если время пустого цикла loop() порядка ~0.5мкс. то при delay( 1 ) скважность будет 1 + 1.0005 - это и есть "не ровно 2"? hmm

Неактивний

#27 2018-05-06 18:29:55

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: служба времени Arduino

Olej пише:

Вот любопытные вещи относительно хронометража в Arduino:

При использовании millis() нужно помнить об одной особенности - millis() "тикает" не равномерно.
Возвращаемое значение увеличивается на единицу каждые 1024 мсек. Затем, когда миллис отстанет на 1 мсек, она "подводится" на единицу, т.е.  возвращаемое значение перескакивает через один.
При измерении длительных интервалов это не страшно, но при интервалах в несколько мсек это заметно.


Смотря, что вы считаете длительным интервалом ...  smile  по моему весьма заметно....

#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);	
	} */
  }  
//	====================================================================  

http://i.piccy.info/i9/dac81faee8bb5b4b3b111aced540e9e1/1525620449/477562/1161865/00004.jpg

http://i.piccy.info/i9/39ae4e996c6d2ce4a64812209258db93/1525620463/418130/1161865/00005.jpg

Неактивний

#28 2018-05-06 19:19:29

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: служба времени Arduino

На самом деле millis() имеет джиттер. А на 8-ми мгц просто гигантский! Поэтому иногда (например для динамической индикации) приходится использовать нештатный миллис().
Ну а в пустом loope конечно можно добиться абсолютной (до такта) скважности = 2, только зачем?)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму