millis(); Как при нажатии на кнопку, его обнулить?!

romixerr
Offline
Зарегистрирован: 28.04.2017

// const int говорит компилятору, что это константа и не надо на это выделять память

-Память таки выделяется. Константа ничем не отличается от переменной, память под нее будет выделена. Единственное отличие - её нельзя изменить.

Обычно используется PROGMEM, для того чтобы размещать данные во флеш-памяти. И read_pgm_byte() - для чтения из флеш-памяти. Поправте, если ошибаюсь.

Тоесть если:

const uint8_t A=123; //- выделяется оперативная память 1 байт, но только для чтения. И туда записывается 123.

А если так:

uint8_t B=0; //тоже самое

B=123; //А тут уже значение 123 - берется из флеш памяти, асеблерной командой LDI rd, к уже иного вида константа загружается в регистр а уже оттуда в РАМ.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

romixerr, похоже вы батенька трепло. Слава богу, программирование это практика, а не СМИ говорильня. И напишите скетч без const int и скомпилируйте, а потом с const int и тоже скомпилируйте. А потом сравните. И не надо нам туфту гнать, что "американцы высадились на Солнце".

maxpostal
Offline
Зарегистрирован: 07.10.2019

dimax, а можно чуть-чуть поподробнее? у меня в скетче используется не millis(), а micros(), подойдёт ли Ваш способ? или эти счётчики привязаны к разным переменным?

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

если сделать jmp 0x0000, то пофиг, обнулятся обе, и millis и micros.

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

maxpostal пишет:

dimax, а можно чуть-чуть поподробнее? у меня в скетче используется не millis(), а micros(), подойдёт ли Ваш способ? или эти счётчики привязаны к разным переменным?

maxposta - весь предыдущий тред - не более чем флуд, и ответ dimaх не стоит воспринимать всерьез, хотя он и правильный. Почему не стоит трогать миллис - описано в сообщении #12.

А самое главное, что вам нужно понять - что не существует реальных ситуаций, в которых нужно было бы обнулять millis или micros. Если у вас встала такая задача - значит вы категорически не умеете программировать.

Поэтому учитесь, а не занимайтесь ерундой.

maxpostal
Offline
Зарегистрирован: 07.10.2019

опять же - можно чуточку подробнее, это вроде как мой первый скетч для Arduino, и первая программа сложнее "Hello World"

мне нужно управлять с платы трёхфазным асинхронным движком, для этого и используется micros()(функция синуса), в момент когда счётчик micros уйдёт в ноль после переполнения - двигатель получит "рывок", мой "проект" позволяет раз в час без проблем выключать двигатель и сбрасывать счётчик программно

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

maxpostal пишет:

опять же - можно чуточку подробнее, это вроде как мой первый скетч для Arduino, и первая программа сложнее "Hello World"   мне нужно управлять с платы трёхфазным асинхронным движком

вы меня, конечно, простите - но я чуть со стула не упал от смеха.

Первый проект - и сразу управление трехфазным мотором?

Теперь по сути вопроса - если правильносчитать интервалы (ищите на форуме по словам "переполнение миллис") - то при переполнении счетчика интервал не сбивается. программа вообще не замечает, что счетчик прошел через ноль.

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

maxpostal
Offline
Зарегистрирован: 07.10.2019

ну вот так вот получилось, просветите меня, пожалуйста

имеется примерно вот такая формула:

PhaseA = (143.4375 + ( 95.625 * sin( Pi * FREQ * micros())));

143.4375 и 95.625 - коэффициенты(ещё будут подстраиваться на практике после испытаний), Pi - константа, объявленная в самом начале скетча, FREQ - переменная float -  пропорциональна частоте синуса(частота примерно от 10 до 100 Гц(частота модуляции ~8кГц))

полученная амплитуда синуса уходит на аналоговый выход (шим-модуляция, в 8-бит)

и заранее - мне нужны всего 3 фазы с Arduino, т.к. необходимые 6 получатся уже на драйвере

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

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

maxpostal - давайте начнем с того, что ваш подход к генерации синуса в корне неверный. В онлайн режиме во время работы мотора никто синусы не пересчитывает - на обычной Ардуине. типа Уно или Нано - вам тупо не хватит на этот расчет быстродействия контроллера(расчет тригонометрических функций о-о-очень медленный), а на чем-нибудь более быстром, типа СТМ32 - это пустая трата ресурсов.

Расчет синуса делается заранее и кладется в память в виде готовой таблицы значений с шагом, например, в градус. А во время работы мотора у вас работает таймер(что такое аппаратный таймер МК - почитайте, это не микрос), который через равные промежутки берет из таблицы следующее значение и загружает в регистр PWM. В  зависимости от частоты этого таймера меняется частота вращения мотора. И все.

Значение микрос в управлении мотором вам не нужно вовсе.

Komandir
Offline
Зарегистрирован: 18.08.2018

Если всё-таки необходимо обнулить, то надо обнулять три переменные:

timer0_overflow_count = 0;
long timer0_millis = 0;
timer0_fract = 0;
 
Иначе можно получить нелинейность в первых значениях.
 
ТС надо сформировать таблицу значений для одной волны синуса с необходимым шагом и использовать её в вычислениях.
b707
Онлайн
Зарегистрирован: 26.05.2017

Komandir пишет:

Если всё-таки необходимо обнулить...

приведите пример, когда это может быть необходимо? :)

Задача "обнулить миллис" возникает только у самых зеленых новичков, которые ардуину увидели 2 дня назад... Это примерно тоже самое, как " принести ведро компрессии" у автомехаников :)

Logik
Онлайн
Зарегистрирован: 05.08.2014

а когда судно выходит из порта, за борт бросают кильватер...

Если бы мне до усрачки захотелось бы обнуляемый millis сделать, то делал бы я его так. Завел бы long zero_millis в месте кода где нужно обновить писал бы zero_millis=millis(), а где нужно получать его значение то писал бы (millis()-zero_millis). И все.

 

 

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

Komandir пишет:

 
ТС надо сформировать таблицу значений для одной волны синуса 

Абычна, четверть периода - достатошно. 0-90 гра. Остальное вычисляется

Logik
Онлайн
Зарегистрирован: 05.08.2014

Да. 8 бит в 8 бит.



inline signed char TabSin(unsigned char x)
{
static const byte TabSin[64]={0, 3,  6,  9, 12, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49,
                       51, 54, 57, 60, 63, 65, 68, 71, 73, 76, 78, 81, 83, 85, 88, 90,
                       92, 94, 96, 98,100,102,104,106,107,109,111,112,113,115,116,117,
                      118,120,121,122,122,123,124,125,125,126,126,126,127,127,127};

signed char r=TabSin[((x&0x40)?-x-1:x)&0x3f];
 if(x&0x80)
   return -r;
 return r;

  
}

 

 
 
maxpostal
Offline
Зарегистрирован: 07.10.2019

Спасибо за Ваши советы

p.s. ушёл искать материал про составление таблиц и аппаратный таймер, в ближайшее время(надеюсь) ещё появлюсь тут, если получится - выложу всё что у меня получилось

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

Но миллис-то можно обнулить... Значение хранится в переменной ;) Сорцы avr-lib покажут, что надо делать extern, чтобы бахнуть это чертов счётчик.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Logik пишет:

а когда судно выходит из порта, за борт бросают кильватер...

Если бы мне до усрачки захотелось бы обнуляемый millis сделать, то делал бы я его так. Завел бы long zero_millis в месте кода где нужно обновить писал бы zero_millis=millis(), а где нужно получать его значение то писал бы (millis()-zero_millis). И все.

Хотел такое написать с работы, да отвлекли. Куда логичнее и не убивает новый код (если его надо будет добавить). 

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

Logik пишет:

а где нужно получать его значение то писал бы (millis()-zero_millis). И все.

    _millis = millis       ();
zero_millis =_millis -_millis;