Применение millis для нескольких процессов

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Posol88 пишет:

получается что в типе int памяти не хватает? она при таком построении скетча не стирает что ли ни чего и хранит каждое пропечатанное значение?

размерность типа int на 8-битных платформах, по умолчанию - 2 байта, диапазон для знакового типа: [-32768,+32767].

Размерность unsigned long - 4 байта, диапазон значений: [0,+4294967295];

Posol88
Offline
Зарегистрирован: 14.11.2019

DIYMan пишет:

Posol88 пишет:

получается что в типе int памяти не хватает? она при таком построении скетча не стирает что ли ни чего и хранит каждое пропечатанное значение?

размерность типа int на 8-битных платформах, по умолчанию - 2 байта, диапазон для знакового типа: [-32768,+32767].

Размерность unsigned long - 4 байта, диапазон значений: [0,+4294967295];

это понятно, не понятно по чему не хватает типа int там же значение не превышает 300 - 310 миллисикунд, и после этого обнуляется. по чему интервал сбивается то?

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

Posol88 пишет:
не понятно по чему не хватает типа int там же значение не превышает 300 - 310 миллисикунд,
А что написано в 8-ой строке? Значение millis тоже обнуляется?

Posol88
Offline
Зарегистрирован: 14.11.2019

а я думал под счетчик millis выделяется своя память...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Posol88 пишет:

это понятно, не понятно по чему не хватает типа int там же значение не превышает 300 - 310 миллисикунд, и после этого обнуляется. по чему интервал сбивается то?

возвращаемое millis() значение - имеет тип unsigned long, и НЕ ОБНУЛЯЕТСЯ до перезапуска контроллера. Вы возвращаемое значение в 4 байта пытаетесь упихнуть в двухбайтовую переменную, отсюда переполнение этой переменной. Дальше объяснять?

Posol88
Offline
Зарегистрирован: 14.11.2019

не, щас попробую переварить... спасибо)))

Posol88
Offline
Зарегистрирован: 14.11.2019

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

 timeRequest = millis();

по тому что обьем  памяти занимаемый функцией millis превысил максимальный обьем памяти int

я это так понял

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Posol88 пишет:

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

 timeRequest = millis();

по тому что обьем  памяти занимаемый функцией millis превысил максимальный обьем памяти int

я это так понял

Нет, millis не занимает больше места - это вообще функция. Просто millis возвращает данные в переменной размерностью 4 байта, следовательно - переменная, которая принимает возвращаемое millis значение - должна быть такого же типа, как указано в документации к функции millis, т.е. unsigned long.

При этом никакого увеличения занимаемой памяти - нет. Вы путаете тёплое с круглым.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Posol88 пишет:

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

 timeRequest = millis();

по тому что обьем  памяти занимаемый функцией millis превысил максимальный обьем памяти int

 

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

Максимальное значение int это 32767. Миллис стартует с 0 и увеличивается на 1 за каждую миллисекунду. До истечении 32 с хвостиком секунд все работает как и задуманно, потом миллис переваливает за 32767 и продолжает увеличиваться, а в timeReques впихивается только часть от миллиса которая гарантированно меньше 32768. В результате вычитание   millis() - timeRequest всегда дает больше заданных 300.

 

Posol88
Offline
Зарегистрирован: 14.11.2019

вот только что дошло до меня)))  XD (не я и так понимал, но не понятно было в каком моменте и как это происходит в коде)))

Logik
Offline
Зарегистрирован: 05.08.2014

asam пишет:

миллис переваливает за 32767 и продолжает увеличиваться, а в timeReques впихивается только часть от миллиса которая гарантированно меньше 32768. В результате вычитание   millis() - timeRequest всегда дает больше заданных 300.

 

Да. И самый простой и эффективный способ это указать что в расчете millis() - timeRequest тоже брать только ту часть у millis() которая влазит в timeReques, т.е. написать (int)millis() - timeRequest. Увеличение размера переменной timeReques также поможет, но это более затратно.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Logik пишет:

asam пишет:

миллис переваливает за 32767 и продолжает увеличиваться, а в timeReques впихивается только часть от миллиса которая гарантированно меньше 32768. В результате вычитание   millis() - timeRequest всегда дает больше заданных 300.

 

Да. И самый простой и эффективный способ это указать что в расчете millis() - timeRequest тоже брать только ту часть у millis() которая влазит в timeReques, т.е. написать (int)millis() - timeRequest. Увеличение размера переменной timeReques также поможет, но это более затратно.

век живи век учись, от меня это как-то ускользнуло )))

astwo
Offline
Зарегистрирован: 10.07.2019

Похоже Logik тоже не безгрешен. Я бы вместо int написал uint16_t.

Logik
Offline
Зарегистрирован: 05.08.2014

Нет предела совершенству)) Я бы тоже себе uint16_t написал, но не новичку на форуме. Ну и timeRequest такой же делать тогда.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

у AVR GCC еще __uint24  есть

Logik
Offline
Зарегистрирован: 05.08.2014

тут бы __uint9 годился ;)

Green
Offline
Зарегистрирован: 01.10.2015

А то и меньше. Зачастую и bool хватает.

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

Green пишет:

А то и меньше. Зачастую и bool хватает.


uint0 O_o

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Green пишет:

А то и меньше. Зачастую и bool хватает.

а она не uint8_t занимает ???

Green
Offline
Зарегистрирован: 01.10.2015

Клапауций 003 пишет:

uint0 O_o

Звучит!

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

а она не uint8_t занимает ???

Не важно сколько занимает. Важно сколько весит.)

Posol88
Offline
Зарегистрирован: 14.11.2019

Товарищи! всем привет. Подскажите пожалуйста чем "%" отличается от "-" ? 

P.S. - я тут нашел один пример использования I2C модуля часов реального времени


#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1302,6,7,8);
void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
}
void loop(){
    if(millis()%1000==0){ // если прошла 1 секунда
      Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
      delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
    }
}

в четвертой строчке кода 30 миллисекунд зачем пропускается? это от балды автор ляпнул или какое то сакральное предназначение имеет действие?

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

Posol88 пишет:

Товарищи! всем привет. Подскажите пожалуйста чем "%" отличается от "-" ? 

Ну, прочитайте ж Вы, наконец, хоть какую-нибудь книжку о языке программирования! Хоть самую тоненькую - для дебилов! Хоть просто странички на этом сайте про % и про - прочитайте - ну сделайте же хоть что-нибудь! Неужели Вам нравится выступать в роли идиота?

Posol88
Offline
Зарегистрирован: 14.11.2019

так а я читаю, и на этом сайте в часности. 

Пример
x = 7 % 5;   // x имеет значение 2
x = 9 % 5;   // x имеет значение 4
x = 5 % 5;   // x имеет значение 0
x = 4 % 5;   // x имеет значение 4

 

Пример
y = y + 3;
x = x - 7;
i = j * 6;
r = r / 5;
Синтаксис
result = value1 + value2;
result = value1 - value2;
result = value1 * value2;
result = value1 / value2;

и вопрос задаю, только когда не понятен ответ после прочтения всего этого

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

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

Здесь раздел "программирование", а не детский сад и не специализированное медицинское учреждение для альтернативно-одарённых.

Posol88
Offline
Зарегистрирован: 14.11.2019

ругается, а все равно объясняет)) 

и все равно не понятно... из примера :  x = 4 % 5;   // x имеет значение 4

 

"% оператор

Возвращает остаток от деления одного целого (int) операнда на другой."

это как так нужно разделить 4 на 5 что бы в остатке получилось 4, когда результатом такого деления будет 0.8? ведь тут в остатке 8

(видимо теперь я буду послан изучать математику...)

 

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Posol88 пишет:

это как так нужно разделить 4 на 5 что бы в остатке получилось 4

целочисленно!

В целых числах 4 делить на пять -будет ноль! И остаток 4. Что тут непонятно???

Цитата:
когда результатом такого деления будет 0.8? ведь тут в остатке 8    <<<< ????????

вот это вообще бред

Цитата:
видимо теперь я буду послан изучать математику...)

именно

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

Posol88 пишет:

когда результатом такого деления будет 0.8? ведь тут в остатке 8

Вы решили потроллить и похихикать? Неудачный момент, у меня не то настроение

Posol88 пишет:

(видимо теперь я буду послан изучать математику...)

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

astwo
Offline
Зарегистрирован: 10.07.2019

5 пиратов решили пойти в рейд. Добычу поделить поровну, а на остаток погулять. Рейд был плохим. Получили 4 золотых. Итого каждый получил по 0, и на четыре погуляли, что бы никому обидно не было. Вот % это и есть пиратское деление.

Posol88
Offline
Зарегистрирован: 14.11.2019

не я тут так понял просто 

x = 7 % 5;   // x имеет значение 2

//7:5=1 и остаток 2

x = 9 % 5;   // x имеет значение 4

//9:5=1 и остаток 4

x = 5 % 5;   // x имеет значение 0

//5:5 = 1 и остаток 0

x = 4 % 5;   // x имеет значение 4

//4:5 = 0 и остаток 8

и вовсе не бред. просто легкое недопонимание.

b707
Онлайн
Зарегистрирован: 26.05.2017

Posol88 пишет:

x = 4 % 5;   // x имеет значение 4

//4:5 = 0 и остаток 8

и вовсе не бред. просто легкое недопонимание.

ПОЧЕМУ 8???? - именно бред

Остаток от деления никак не может быть больше делителя, неужели непонятно? - то есть больше пяти в этом случае

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

"Один дурак может задать вопросы, на которые и сто мудрецов не ответят", как говорится.

Posol88
Offline
Зарегистрирован: 14.11.2019

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

b707
Онлайн
Зарегистрирован: 26.05.2017

Posol88 пишет:

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

вы идиот? может у вас и справка есть?

Оператор все делит и ничего не игонорирует, 4 поделить на 5 будет ноль для целых чисел, и относится это не только к оператору "%", но и к обычному делению "/"

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Posol88 пишет:

и вовсе не бред. просто легкое недопонимание.

Нет, это тяжёлый бред. Возможно, после тяжёлых наркотиков.

Posol88 пишет:

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

Неверно. Правильно так:

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

astwo
Offline
Зарегистрирован: 10.07.2019

Угу 28 танков в 7 рот по 13 штук

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пенсионер, поди.  Судя по маразму, Всесоюзного значения. 

b707
Онлайн
Зарегистрирован: 26.05.2017

DetSimen пишет:

Пенсионер, поди.  Судя по маразму, Всесоюзного значения. 

таких и молодых полно. Возможно цифры в нике - год рождения

Posol88
Offline
Зарегистрирован: 14.11.2019

Posol88 пишет:

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

Теоретический материал для самостоятельного изучения

Ребята, мы вновь сегодня говорим о делении, о делении с остатком и рассмотрим ещё один случай. Нам нужно составить из двух палочек треугольник. Получится?

А из трёх палочек составить квадрат? Сможем?

Нет.7e496e68-5ff0-4626-8a6f-2e1626829ce2.png

Треугольников мы составили ноль.

Квадратов составили тоже ноль.

Запишем при помощи чисел и знаков.

Два разделить на три равно нулю и остаток два.

Три разделить на четыре равно нулю и остаток три.

При делении меньшего числа на большее неполное частное всегда будет равно нулю, а остаток равен делимому.

о чем я и говорил

Posol88
Offline
Зарегистрирован: 14.11.2019

 

[/quote]

Возможно цифры в нике - год рождения

[/quote]

логика определенно Ваше))

b707
Онлайн
Зарегистрирован: 26.05.2017

Posol88 пишет:

При делении меньшего числа на большее неполное частное всегда будет равно нулю, а остаток равен делимому.

о чем я и говорил

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

На самом деле никакой разницы между

9 / 5 = 1 и остаток 4

4 / 5 = 0 остаток 4

нет. Вычисление производится по одним и тем же правилам.

 

Не знаю.  зачем я вам это пишу - видимо вы и правда троль

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

DetSimen, расчехляй картинко с указателем. И сертификат заодно.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

b707 пишет:
и правда троль

https://www.youtube.com/watch?v=2H9StVnc6xc&feature=youtu.be

SLKH
Offline
Зарегистрирован: 17.08.2015

Что интересно: эта хрень "if(millis()%1000==0){ // если прошла 1 секунда" похоже, неистребима.

b707
Онлайн
Зарегистрирован: 26.05.2017

да. эта тема прямо клад для молодых психологов... или психиатров. Тут можно диссер писать прямо по форуму.

И таких тем много, напрмер

http://arduino.ru/forum/programmirovanie/vopros-pro-vyvod-otveta-s-komand-v-monitor-porta

Люди годами "занимаются ардуино", правда мало что понимают, в голове не откладывается ничего - но продолжают "смотреть видосы" на ютубе и задавать идиотские вопросы на форуме... ЗАЧЕМ??? - вопрос на докторскую степень...

Posol88
Offline
Зарегистрирован: 14.11.2019

Лично я ардуино первый раз взялся изучать около полутора месяцев назад, по видеоурокам кстати говоря(хотя сейчас пользуюсь в основном текстовыми материалами)...

До этого я даже английский не изучал, не то что программирование. И в принципе мне многое понятно с первого раза, но иногда возникают некоторые недопонимания описываемых пояснений. Приходится задать вопрос, так как самостоятельный поиск ответа чаще всего бывает безуспешным, а про его правильность и говорить нечего (Интернет однако).

Но каждый мой вопрос, на  форуме,а именно Ваша аудитория не вызывает у меня сомнений в вопросе компетентности по программирования ардуино, по мимо ответа сопровождают целые тирады на тему состояния моего   интеллекта. Но среди них, как правило, я нахожу ответы на свои вопросы. 

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

Posol88
Offline
Зарегистрирован: 14.11.2019

b707 пишет:

продолжают "смотреть видосы" на ютубе 

да к стати, ссылочка на ролик :http://kip-world.ru/podklyuchenie-chasov-realnogo-vremeni-ds1302-k-arduino.html

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А какаво состояние твоего интеллекта, если деление с остатком в 3м классе праходют?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ворота пишет:

DetSimen, расчехляй картинко с указателем. И сертификат заодно.

У мня седня руки трясуцца после вчерашних дебошей. 

b707
Онлайн
Зарегистрирован: 26.05.2017

DetSimen пишет:

деление с остатком в 3м классе праходют

А вычитание? :)

я напомню, на второй странице темы ТС спрашивал: "А почему тут тире?" - это про выражение  ( currmillis - prevmillis > 100)