Не могу вылечить ватчдог на "голой" атмеге328р с внутр тактированием 8 МГц

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

кстати - для новичков - вот это и есть пример "велосипеда с костылем" "%1000" - явный велосипед, причем сваренный из водопроводной трубы, а delay(1) - костыль к нему, поскольку необходим из=за "трубного" наследия велосипеда. ;)))))))))))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

В этом коде delay(1) - необходим, потому, что millis()%1000 останется равным 0 в течении 1 мс, а цикл - значительно короче.


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

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

ну так я о чём, для этого кода он необходим и, человек его писавший это понимал,

понимал бы - не вставил бы в код %1000.

Ставлю на то, что делей появился в этом коде именно как костыль - то есть пока делея не было, код работал неустойчиво - вот и ПРИШЛОСЬ добавлять.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

ну так я о чём, для этого кода он необходим и, человек его писавший это понимал,

понимал бы - не вставил бы в код %1000.

Ставлю на то, что делей появился в этом коде именно как костыль - то есть пока делея не было, код работал неустойчиво - вот и ПРИШЛОСЬ добавлять.

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

Я бы точно не смог даже теоретически написать %1000 а потом использовать отрицание-отрицания )))
Ограничился простым delay(1000) которого в этом случае за глаза

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Кстати, хорошая статья мне многое прояснила

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

оставь ссылку в Песочнице, чтобы не потерялась. Немного скомкано, но нормально.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

wdrakula пишет:

В этом коде delay(1) - необходим, потому, что millis()%1000 останется равным 0 в течении 1 мс, а цикл - значительно короче.

Зачем здесь delay() - понятно.

Что это - грубый костыль - тоже понятно.

Осталось добавить, что даже при наличии костыля эта конструкция все равно не будет устойчиво работать, потому что счетчик миллисекунд обновляется раз в 1024 мкс, а не раз в 1000 мкс, следовательно:

1. Периодически (но не строго периодично) пауза будет составлять не 1, а 2 секунды, т.к. приращение мс иногда происходит сразу на 2 единицы.

2. Если остальные действия в цикле в сумме занимают менее 24 мкс, время от времени будет наблюдаться два "срабатывания" подряд.

 

bwn
Offline
Зарегистрирован: 25.08.2014

ua6em пишет:

Кстати, хорошая статья мне многое прояснила

Поддерживаю Влада, если не трудно запостите в песочницу. Со всех просторов я собрать не сумею и забуду. А там постоянно просматриваю и редактирую.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

wdrakula пишет:

В этом коде delay(1) - необходим, потому, что millis()%1000 останется равным 0 в течении 1 мс, а цикл - значительно короче.

Зачем здесь delay() - понятно.

Осталось добавить, что даже при наличии костыля эта конструкция все равно не будет устойчиво работать, потому что счетчик миллисекунд обновляется раз в 1024 мкс, а не раз в 1000 мкс, следовательно:

Это точно? Функция миллис именно так и написана? Я считал, что использует micros(), а у ней точность 4 -ре микросекунды

Не поленился проверить, Вы заблуждаетесь!
 

unsigned long time_micros;
unsigned long time_millis;
void setup(){
  Serial.begin(9600);
}
void loop(){
  Serial.print("Time: ");
  delay(8000);
  time_micros = micros();
  time_millis = millis();
  //выводит количество микросекунд с момента начала выполнения программы
   Serial.print(time_micros/1024);
   Serial.print("  ");
   Serial.println(time_millis);
   Serial.println();
  // ждет секунду, перед следующей итерацией цикла.
  delay(1000);
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

Не поленился проверить, Вы заблуждаетесь!

 

unsigned long time_micros;
unsigned long time_millis;
void setup(){
  Serial.begin(9600);
}
void loop(){
  Serial.print("Time: ");
  delay(8000);
  time_micros = micros();
  time_millis = millis();
  //выводит количество микросекунд с момента начала выполнения программы
   Serial.print(time_micros/1024);
   Serial.print("  ");
   Serial.println(time_millis);
   Serial.println();
  // ждет секунду, перед следующей итерацией цикла.
  delay(1000);
}

 

Интересно, что именно Вы проверяли, и в чем именно я, по Вашему мнению, заблуждаюсь?

// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))

// the whole number of milliseconds per timer0 overflow
#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000)

// the fractional number of milliseconds per timer0 overflow. we shift right
// by three to fit these numbers into a byte. (for the clock speeds we care
// about - 8 and 16 MHz - this doesn't lose precision.)
#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)
#define FRACT_MAX (1000 >> 3)

volatile unsigned long timer0_overflow_count = 0;
volatile unsigned long timer0_millis = 0;
static unsigned char timer0_fract = 0;

#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ISR(TIM0_OVF_vect)
#else
ISR(TIMER0_OVF_vect)
#endif
{
	// copy these to local variables so they can be stored in registers
	// (volatile variables must be read from memory on every access)
	unsigned long m = timer0_millis;
	unsigned char f = timer0_fract;

	m += MILLIS_INC;
	f += FRACT_INC;
	if (f >= FRACT_MAX) {
		f -= FRACT_MAX;
		m += 1;
	}

	timer0_fract = f;
	timer0_millis = m;
	timer0_overflow_count++;
}

unsigned long millis()
{
	unsigned long m;
	uint8_t oldSREG = SREG;

	// disable interrupts while we read timer0_millis or we might get an
	// inconsistent value (e.g. in the middle of a write to timer0_millis)
	cli();
	m = timer0_millis;
	SREG = oldSREG;

	return m;
} 

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

...

Ну? ;))))))))) дык 1000 или 1024?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Зависит от того, в какой валюте.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

И смотрим, пишут жеж, что можно, без потери точности -  #define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

И смотрим, пишут жеж, что можно, без потери точности -  #define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)

А у Вас есть сомнения по поводу делимости чисел 1000 и 24 на 8 нацело без остатка?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

999 нацело не делится, нет?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

999 нацело делится на 3, на 9, на 27 и 37. Вас что-то еще интересует?

Если же Вас заинтересовал фрагмент дискуссии в постах 110, 113 и 114, то поясняю, что авторы wiring.c, фрагмент которого помещен в посте №110, в строках 11 и 12 сокращают дробь 24/1000 до 3/125, а в строках 8-10 объясняют, зачем они это делают.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а какая разница между 24/1000 и 3/125 ?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

кстати - для новичков - вот это и есть пример "велосипеда с костылем" "%1000" - явный велосипед, причем сваренный из водопроводной трубы, а delay(1) - костыль к нему, поскольку необходим из=за "трубного" наследия велосипеда. ;)))))))))))))

Интересно мнение профессионала, Вадим, а как ты бы обыграл эту ситуацию - поймать и обработать импульс по переднему фронту

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

а какая разница между 24/1000 и 3/125 ?

Еще раз: ответ на этот вопрос содержится в строках 8-9 фрагмента wiring.c, который я разместил в сообщении 110. (я не думаю, что я должен своими словами пересказывать ответ, данный авторами исходника)

Но Вы все-таки ответьте на мой вопрос: что именно Вы пытались сделать в исходнике из сообщения №109, и как интерпретировали результат его прогона?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

пытался проверить ваше утверждение - что счетчик миллисекунд обновляется раз в 1024 мкс, а не раз в 1000 мкс, следовательно:

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

пытался проверить ваше утверждение - что счетчик миллисекунд обновляется раз в 1024 мкс, а не раз в 1000 мкс, следовательно:

И каким способом Вы пытались это проверить?

Опишите алгоритм и расскажите, почему он должен приводить к такому выводу.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

Опишите алгоритм и расскажите, почему он должен приводить к такому выводу.

...Та побистрее, швайн! - сказал он, похлопывая стеком по надраенному голенищу. ;)))))))))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000)

 

Хуже того, то-есть вижу непрофессионализм разработчиков (исходя из ваших слов) так как они применяют
и, я скажу вам довольно успешно, конструкцию вида x%1000  ;-)))
 

PS кода не смотрел да и толку, коли не понимаю в С, а вот на ассемблере смог бы, но коли счетчик микросекунд делят сдвигом на три бита когда в битах D0-D2 нули, не думаю чтобы скосячили в миллис )))

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ua6em пишет:

wdrakula пишет:

кстати - для новичков - вот это и есть пример "велосипеда с костылем" "%1000" - явный велосипед, причем сваренный из водопроводной трубы, а delay(1) - костыль к нему, поскольку необходим из=за "трубного" наследия велосипеда. ;)))))))))))))

Интересно мнение профессионала, Вадим, а как ты бы обыграл эту ситуацию - поймать и обработать импульс по переднему фронту

Так и не удалось заслушать начальника транспортного цеха:

Попытаюсь тогда самостоятельно:
Подытоживая, что костылём в этой конструкции является использование блокирующей функции delay(1) обойти её можно используя к примеру флаги, а использование простого чтения состояния пина 13 позволит экономить еще пару байт памяти программ

ЗЫ что удивительно - время исполнения кода в loop более 500 микросекунд и тормозит отнюдь не вывод в сериал )))

void loop(){
  // Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial
  if(!(millis()%1000) && flag==0){
    timer++;
    Serial.println(timer);
   // digitalWrite(13, digitalRead(13)==1?0:1);delay(1);
    digitalWrite(13, !digitalRead(13));
    flag = 1;
  }
   if(millis()%1000)flag=0;
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

Хуже того, то-есть вижу непрофессионализм разработчиков (исходя из ваших слов) так как они применяют
и, я скажу вам довольно успешно, конструкцию вида x%1000  ;-)))

Теперь над другой стороной поглумлюсь:

А где ты в коде увидел %1000 ??????

В #define? Так это компайл-тайм вычисления, к коду не имеют никакого отношения и туда не попадают.

Отсылки к якобы "знанию ассемблера" без знания С вызывают... ну как сказать... снисходительную ухмылку.

ua6em пишет:

Интересно мнение профессионала, Вадим, а как ты бы обыграл эту ситуацию - поймать и обработать импульс по переднему фронту

.....
Так и не удалось заслушать начальника транспортного цеха:

Если это ко мне, то меня зовут не так. В каких областях необъятной России можно превратить имя Владислав в Вадим???? Просто любопытно? Потому, что оба на "В"? ;)))) 

bwn
Offline
Зарегистрирован: 25.08.2014

wdrakula пишет:

Если это ко мне, то меня зовут не так. В каких областях необъятной России можно превратить имя Владислав в Вадим???? Просто любопытно? Потому, что оба на "В"? ;)))) 

Да, и оба вместо "V" используют "W".))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Владислав! С именами у меня извечная проблема, за то ничего не скажу тем, кто так спрашивает так спрашивает )))
Имею точное представление о жёсткой логике то-есть сделать к примеру микропроцессор на элемантах жёсткой логики смог бы ...

Листинг читаю свободно (для интел) думаю что-то знаю всё жеж )))
Я жеж говорю драйвер дисководов гибких дисков мной был написан задолго до Альберто Паскуале, написан в машинных кодах, объем 3.6 килобайта, читал, писал и форматировал ЛЮБЫЕ дискеты 180/360/720/1.2/1.44 использовал INT13 (а не 21 как у него)

PS ассемблер у меня появился, но потом, версии 1.27
 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

Владислав! С именами у меня извечная проблема, за то ничего не скажу тем, кто так спрашивает так спрашивает )))
Имею точное представление о жёсткой логике то-есть сделать к примеру микропроцессор на элемантах жёсткой логики смог бы ...

Листинг читаю свободно (для интел) думаю что-то знаю всё жеж )))
Я жеж говорю драйвер дисководов гибких дисков мной был написан задолго до Альберто Паскуале, написан в машинных кодах, объем 3.6 килобайта, читал, писал и форматировал ЛЮБЫЕ дискеты 180/360/720/1.2/1.44 использовал INT13 (а не 21 как у него)

PS ассемблер у меня появился, но потом, версии 1.27
 

Это не ассемблер, а знание архитектуры первых ПК, уровня 8086-8088. Прерывание 21 - системный вызов ДОС, 13 - БИОС в стандартном режиме - дисковый интерфейс. Знание интерфейса БИОС первыз ПиСюков - круто, но какое отношение это имеет к программированию вообще?

Если уж "по Гамбургскому счету", то в Кнуте много машинного кода? А это все-таки "Тора" програмиста. Ну да ладно...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

wdrakula пишет:
Прерывание 21 - системный вызов ДОС, 13 - БИОС в стандартном режиме - дисковый интерфейс.

Вот это память! (реально круто)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

 Знание интерфейса БИОС первыз ПиСюков - круто, но какое отношение это имеет к программированию вообще?

Я не знал интерфейс, я мог написать ПО заменяющее любое прерывание на уровне БИОС )))
С пытаюсь одолеть более 30 лет, не задалось )))
 

PS вот чесслово интуитивно предполагал что конструкция x%y реализована как команда процессора, логично жеж?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andycat пишет:
wdrakula пишет:
Прерывание 21 - системный вызов ДОС, 13 - БИОС в стандартном режиме - дисковый интерфейс.
Вот это память! (реально круто)

Круто, это когда ты анализируя код Чернобыля, понимаешь, что сотни тысяч программистов зная команду перехода процессора  на нулевой уровень не написали эту блудь )))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

PS вот чесслово интуитивно предполагал что конструкция x%y реализована как команда процессора, логично жеж?

набор слов. Какой ху? Какого ху? У какого процессора?

Вычисления до компиляции происходят ДО компиляции... неожиданно?

Ты думаешь, что

#define r2 sqrt(2.0)

компилируется в вычисление квадратного корня? Как я всегда предлагаю слушателям: "А ты поставь себя на место автора, зачем бы стал так делать? Сознательно вредить? Таких людей мало.".

Конечно все что можно вычислить на этапе компиляции  - тогда и вычисляется. Более того, выражение

"а = 2+3;" на практически любом современном компиляторе компилируется как "a = 5;".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
 if(!(millis()%1000)

имеем: одна переменная, вторая константа и?, как тут не быть дураком после твоих слов???
Я предполагал, берём переменную по адресу, делим на константу, смотрим флаг

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

 if(!(millis()%1000)

имеем: одна переменная, вторая константа и?, как тут не быть дураком после твоих слов???
Я предполагал, берём переменную по адресу, делим на константу, смотрим флаг

ты не следишь за темой разговора. Я уже давно говорю о куске кода из wiring.c, который представил Андиано, и про который ты заявил о "непрофессионализме" ссылаясь на использование "%". Про миллис мы давно закончили.

Будь внимателен!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

ua6em пишет:

 if(!(millis()%1000)

имеем: одна переменная, вторая константа и?, как тут не быть дураком после твоих слов???
Я предполагал, берём переменную по адресу, делим на константу, смотрим флаг

ты не следишь за темой разговора. Я уже давно говорю о куске кода из wiring.c, который представил Андиано, и про который ты заявил о "непрофессионализме" ссылаясь на использование "%". Про миллис мы давно закончили.

Будь внимателен!

сей предмет не входит в круг моих понятий ))) а счетчик микро разве не переменная величина, я так понимал, что программа обрабатывая счетчик микро ждёт совпадения кратного 1000 и сдвигает значение вправо на 3, так как в D0-D2 нули, так и пишут - без потери точности

Так всё же 1000 или 1024? Не пойму, где это прописано?
Мой скетч выводит, что микро с миллисом шлёпают синхронно если счетчик микро делим на 1000 и несинхронно, если на 1024

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

Если Влад на автомате такие конструкции пишет, что же он напишет на пулемёте )))

Вы об этой конструкции?

void loop(){
  // Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial
  if(!(millis()%1000)){
    timer++;
    Serial.println(timer);
    digitalWrite(13, digitalRead(13)==1?0:1); delay(1);
  }
}

так она ж вроде .... старая как дерьмо мамонта. Это кусок был на хабре ещё в 2013 году (там под спойлером найдёте).

А вообще, весело у вас тут без меня :))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

А вообще, весело у вас тут без меня :))))

Подключайтесь...а то тут меня уже запинали типа гранаты у меня if(!(millis()%1000)){ не той системы

PS и никто Дрёмкина за его код не распинал

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, гранаты, они вечно. А чего там про 1000 и 1024, если коротко. я то я же задолбался страницы темы листать?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Да, гранаты, они вечно. А чего там про 1000 и 1024, если коротко. я то я же задолбался страницы темы листать?

да товарищ утверждает, что миллис образуется делением микро на 1024 так что конструкция if(!(millis()%1000)){ будет всегда лажать

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

да товарищ утверждает, что миллис образуется делением микро на 1024

прочитайте внимательно ссылку, на которую сами ссылаетесь. "Товарищ" нигде не утверждал. что миллис образуется делением на 1024. Он писал, что миллис обновляется раз в 1024 микроса. Это как бы разница, не находите?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

да товарищ утверждает, что миллис образуется делением микро на 1024

прочитайте внимательно ссылку, на которую сами ссылаетесь. "Товарищ" нигде не утверждал. что миллис образуется делением на 1024. Он писал, что миллис обновляется раз в 1024 микроса. Это как бы разница, не находите?

не нахожу, я понимаю прямо - счетчик миллис увеличивает свое значение на единицу раз в 1024 микросекунды, не, ну если тут все отчаянные охотники убившие "3 целых 72 сотых зайца и 5 целых 34 сотых лисицы", тогда да

ЗЫ текст не авторский, журнал Крокодил 1966 год

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

я понимаю прямо - счетчик миллис увеличивает свое значение на единицу раз в 1024 микросекунды

счетчик миллис увеличивает свое значение раз в 1024 микрос - это верно. Но вовсе не обязательно на единицу.

Чтобы проще было въехать в тему - представьте секундный счетчик, который обновляет свое значение раз в 5 секунд - сразу на 5 секунд.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

я понимаю прямо - счетчик миллис увеличивает свое значение на единицу раз в 1024 микросекунды

счетчик миллис увеличивает свое значение раз в 1024 микрос - это верно. Но вовсе не обязательно на единицу.

Чтобы проще было въехать в тему - представьте секундный счетчик, который обновляет свое значение раз в 5 секунд - сразу на 5 секунд.

Серьёзно? Так написан миллис? Кошмар! Куда мир катится...всё худшее, что я встречал на PC перетащили на ардуино

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Серьёзно? Так написан миллис? Кошмар!

и что же в этом кошмарного? В миллисе ровно 1000 микросов

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

Серьёзно? Так написан миллис? Кошмар!

и что же в этом кошмарного? В миллисе ровно 1000 микросов


так код не синхронный жеж тогда, его плющит, как минимум раз в 40 миллисекунд

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

так код не синхронный жеж тогда, его плющит, как минимум раз в 40 миллисекунд

так упомянутый вами "товарищ" именно про это и писал - а вы спорить начали

sadman41
Offline
Зарегистрирован: 19.10.2016

А где вы в наше время встречали синхронность? Даже плаванье уже не то...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

Подключайтесь...а то тут меня уже запинали типа гранаты у меня if(!(millis()%1000)){ не той системы

Вас действительно интересует моё мнение?

Ну, что сказать … «Так-то оно так, потому как не может того быть, кабы не было бы никак. И не потому, что оно вообще, а потому что когда оно что, тогда оно и пожалуйста».

В общем, тут часто народ пускается в теоретизирование. оторванное от конкретной ситуации. Никогда не забуду, как мне начали возражать с вводной фразы: «А вот в некоторых четырёхразрядных процессорах …»

Ну, так и здесь. Ежели про четырёхразрядные процессоры, то оно, конечно, да, а вот если про конкретный код из поста #80, да ещё и на конкретной частоте 16 мегагерц, то «тогда оно и пожалуйста».

andriano пишет:

счетчик миллисекунд обновляется раз в 1024 мкс, а не раз в 1000 мкс

Таки, да. Согласен.

andriano пишет:

эта конструкция все равно не будет устойчиво работать,

С какого перепугу? Какая-то абстрактная конско-вакуумная конструкция – возможно, но конкретная конструкция  из поста #80 чем виновата? Нормально она будет работать.

andriano пишет:

1. Периодически (но не строго периодично) пауза будет составлять не 1, а 2 секунды, т.к. приращение мс иногда происходит сразу на 2 единицы.

Приращение действительно иногда происходит на 2 мс и какие-то значения пропускаются. Но среди пропущенных значений нет ни одного кратного 1000! Так что к данной конкретной конструкции сиё замечание не относится. К коню в вакууме – да, а к этой конструкции – нет.

andriano пишет:

2. Если остальные действия в цикле в сумме занимают менее 24 мкс, время от времени будет наблюдаться два "срабатывания" подряд.

Остальные действия в данной конструкции – это вот это?

timer++;
Serial.println(timer);
digitalWrite(13, digitalRead(13)==1?0:1);

Менее 24 мкс? Ну, andriano, наверное, сам долго смеялся, когда это написал. Т.е. как и выше – замечание верно про коня в вакууме, но не про конкретный код из поста #80.

Оно, конечно, код в посте 80 уж больно любительский, но данные конкретные претензии - не про него.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

так код не синхронный жеж тогда, его плющит, как минимум раз в 40 миллисекунд

так упомянутый вами "товарищ" именно про это и писал - а вы спорить начали

мы не в церкви, на веру не воспринимаем, показал бы код, чтобы начинающему это понятно было и флуда бы не было )))
Проверил, написал простеший код, смотрю Logic-om, да плющит (сжимает импульс) каждые 40 миллисекунд

unsigned long my = 0;
void setup() {
  pinMode(12,OUTPUT);
  digitalWrite(12,HIGH);
  my = millis();
}

void loop() {
  if(millis()-my  >=9){
    digitalWrite(12,!digitalRead(12));
    my = millis();
  }
}

Теперь то понятно, нужны точные интервали micros() вам в руки )))
PS и эти люди кидали в меня ссаными тряпками, когда я в своих часиках на миллис вводил трехэтапный режим корректировки )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

А где вы в наше время встречали синхронность? Даже плаванье уже не то...

ой, не говорите. С тех пор как там появились мужики, я и на девочек-то смотреть не могу. Только посмотрю, тут жемужиков представляю :(