// const int говорит компилятору, что это константа и не надо на это выделять память
-Память таки выделяется. Константа ничем не отличается от переменной, память под нее будет выделена. Единственное отличие - её нельзя изменить.
Обычно используется PROGMEM, для того чтобы размещать данные во флеш-памяти. И read_pgm_byte() - для чтения из флеш-памяти. Поправте, если ошибаюсь.
Тоесть если:
const uint8_t A=123; //- выделяется оперативная память 1 байт, но только для чтения. И туда записывается 123.
А если так:
uint8_t B=0; //тоже самое
B=123; //А тут уже значение 123 - берется из флеш памяти, асеблерной командой LDI rd, к уже иного вида константа загружается в регистр а уже оттуда в РАМ.
romixerr, похоже вы батенька трепло. Слава богу, программирование это практика, а не СМИ говорильня. И напишите скетч без const int и скомпилируйте, а потом с const int и тоже скомпилируйте. А потом сравните. И не надо нам туфту гнать, что "американцы высадились на Солнце".
dimax, а можно чуть-чуть поподробнее? у меня в скетче используется не millis(), а micros(), подойдёт ли Ваш способ? или эти счётчики привязаны к разным переменным?
dimax, а можно чуть-чуть поподробнее? у меня в скетче используется не millis(), а micros(), подойдёт ли Ваш способ? или эти счётчики привязаны к разным переменным?
maxposta - весь предыдущий тред - не более чем флуд, и ответ dimaх не стоит воспринимать всерьез, хотя он и правильный. Почему не стоит трогать миллис - описано в сообщении #12.
А самое главное, что вам нужно понять - что не существует реальных ситуаций, в которых нужно было бы обнулять millis или micros. Если у вас встала такая задача - значит вы категорически не умеете программировать.
опять же - можно чуточку подробнее, это вроде как мой первый скетч для Arduino, и первая программа сложнее "Hello World"
мне нужно управлять с платы трёхфазным асинхронным движком, для этого и используется micros()(функция синуса), в момент когда счётчик micros уйдёт в ноль после переполнения - двигатель получит "рывок", мой "проект" позволяет раз в час без проблем выключать двигатель и сбрасывать счётчик программно
опять же - можно чуточку подробнее, это вроде как мой первый скетч для Arduino, и первая программа сложнее "Hello World" мне нужно управлять с платы трёхфазным асинхронным движком
вы меня, конечно, простите - но я чуть со стула не упал от смеха.
Первый проект - и сразу управление трехфазным мотором?
Теперь по сути вопроса - если правильносчитать интервалы (ищите на форуме по словам "переполнение миллис") - то при переполнении счетчика интервал не сбивается. программа вообще не замечает, что счетчик прошел через ноль.
Это одинаково относится и к миллис и к микрос. так что я угадал, когда написал, что никакое обнуление вам не нужно - вы просто не умеете пользоваться микросами.
143.4375 и 95.625 - коэффициенты(ещё будут подстраиваться на практике после испытаний), Pi - константа, объявленная в самом начале скетча, FREQ - переменная float - пропорциональна частоте синуса(частота примерно от 10 до 100 Гц(частота модуляции ~8кГц))
полученная амплитуда синуса уходит на аналоговый выход (шим-модуляция, в 8-бит)
и заранее - мне нужны всего 3 фазы с Arduino, т.к. необходимые 6 получатся уже на драйвере
что будет с этим при переполнении micros() (для меня было бы идеально скидывать раз в час его программно - всё равно это необходимая защита на случай если двигатель включили и ушли оставив его включённым, так долго без перерывов его работа не предусмотрена)? не произойдёт ли переполнение выражения от которого вычисляется синус(хотел это проверить позже на осциллографе, но раз уж спрашиваю...)
maxpostal - давайте начнем с того, что ваш подход к генерации синуса в корне неверный. В онлайн режиме во время работы мотора никто синусы не пересчитывает - на обычной Ардуине. типа Уно или Нано - вам тупо не хватит на этот расчет быстродействия контроллера(расчет тригонометрических функций о-о-очень медленный), а на чем-нибудь более быстром, типа СТМ32 - это пустая трата ресурсов.
Расчет синуса делается заранее и кладется в память в виде готовой таблицы значений с шагом, например, в градус. А во время работы мотора у вас работает таймер(что такое аппаратный таймер МК - почитайте, это не микрос), который через равные промежутки берет из таблицы следующее значение и загружает в регистр PWM. В зависимости от частоты этого таймера меняется частота вращения мотора. И все.
Значение микрос в управлении мотором вам не нужно вовсе.
приведите пример, когда это может быть необходимо? :)
Задача "обнулить миллис" возникает только у самых зеленых новичков, которые ардуину увидели 2 дня назад... Это примерно тоже самое, как " принести ведро компрессии" у автомехаников :)
а когда судно выходит из порта, за борт бросают кильватер...
Если бы мне до усрачки захотелось бы обнуляемый millis сделать, то делал бы я его так. Завел бы long zero_millis в месте кода где нужно обновить писал бы zero_millis=millis(), а где нужно получать его значение то писал бы (millis()-zero_millis). И все.
p.s. ушёл искать материал про составление таблиц и аппаратный таймер, в ближайшее время(надеюсь) ещё появлюсь тут, если получится - выложу всё что у меня получилось
а когда судно выходит из порта, за борт бросают кильватер...
Если бы мне до усрачки захотелось бы обнуляемый millis сделать, то делал бы я его так. Завел бы long zero_millis в месте кода где нужно обновить писал бы zero_millis=millis(), а где нужно получать его значение то писал бы (millis()-zero_millis). И все.
Хотел такое написать с работы, да отвлекли. Куда логичнее и не убивает новый код (если его надо будет добавить).
// const int говорит компилятору, что это константа и не надо на это выделять память
-Память таки выделяется. Константа ничем не отличается от переменной, память под нее будет выделена. Единственное отличие - её нельзя изменить.
Обычно используется PROGMEM, для того чтобы размещать данные во флеш-памяти. И read_pgm_byte() - для чтения из флеш-памяти. Поправте, если ошибаюсь.
Тоесть если:
const uint8_t A=123; //- выделяется оперативная память 1 байт, но только для чтения. И туда записывается 123.
А если так:
uint8_t B=0; //тоже самое
B=123; //А тут уже значение 123 - берется из флеш памяти, асеблерной командой LDI rd, к уже иного вида константа загружается в регистр а уже оттуда в РАМ.
romixerr, похоже вы батенька трепло. Слава богу, программирование это практика, а не СМИ говорильня. И напишите скетч без const int и скомпилируйте, а потом с const int и тоже скомпилируйте. А потом сравните. И не надо нам туфту гнать, что "американцы высадились на Солнце".
dimax, а можно чуть-чуть поподробнее? у меня в скетче используется не millis(), а micros(), подойдёт ли Ваш способ? или эти счётчики привязаны к разным переменным?
если сделать jmp 0x0000, то пофиг, обнулятся обе, и millis и micros.
dimax, а можно чуть-чуть поподробнее? у меня в скетче используется не millis(), а micros(), подойдёт ли Ваш способ? или эти счётчики привязаны к разным переменным?
maxposta - весь предыдущий тред - не более чем флуд, и ответ dimaх не стоит воспринимать всерьез, хотя он и правильный. Почему не стоит трогать миллис - описано в сообщении #12.
А самое главное, что вам нужно понять - что не существует реальных ситуаций, в которых нужно было бы обнулять millis или micros. Если у вас встала такая задача - значит вы категорически не умеете программировать.
Поэтому учитесь, а не занимайтесь ерундой.
опять же - можно чуточку подробнее, это вроде как мой первый скетч для Arduino, и первая программа сложнее "Hello World"
мне нужно управлять с платы трёхфазным асинхронным движком, для этого и используется micros()(функция синуса), в момент когда счётчик micros уйдёт в ноль после переполнения - двигатель получит "рывок", мой "проект" позволяет раз в час без проблем выключать двигатель и сбрасывать счётчик программно
опять же - можно чуточку подробнее, это вроде как мой первый скетч для Arduino, и первая программа сложнее "Hello World" мне нужно управлять с платы трёхфазным асинхронным движком
вы меня, конечно, простите - но я чуть со стула не упал от смеха.
Первый проект - и сразу управление трехфазным мотором?
Теперь по сути вопроса - если правильносчитать интервалы (ищите на форуме по словам "переполнение миллис") - то при переполнении счетчика интервал не сбивается. программа вообще не замечает, что счетчик прошел через ноль.
Это одинаково относится и к миллис и к микрос. так что я угадал, когда написал, что никакое обнуление вам не нужно - вы просто не умеете пользоваться микросами.
ну вот так вот получилось, просветите меня, пожалуйста
имеется примерно вот такая формула:
PhaseA = (143.4375 + ( 95.625 * sin( Pi * FREQ * micros())));
143.4375 и 95.625 - коэффициенты(ещё будут подстраиваться на практике после испытаний), Pi - константа, объявленная в самом начале скетча, FREQ - переменная float - пропорциональна частоте синуса(частота примерно от 10 до 100 Гц(частота модуляции ~8кГц))
полученная амплитуда синуса уходит на аналоговый выход (шим-модуляция, в 8-бит)
и заранее - мне нужны всего 3 фазы с Arduino, т.к. необходимые 6 получатся уже на драйвере
что будет с этим при переполнении micros() (для меня было бы идеально скидывать раз в час его программно - всё равно это необходимая защита на случай если двигатель включили и ушли оставив его включённым, так долго без перерывов его работа не предусмотрена)? не произойдёт ли переполнение выражения от которого вычисляется синус(хотел это проверить позже на осциллографе, но раз уж спрашиваю...)
maxpostal - давайте начнем с того, что ваш подход к генерации синуса в корне неверный. В онлайн режиме во время работы мотора никто синусы не пересчитывает - на обычной Ардуине. типа Уно или Нано - вам тупо не хватит на этот расчет быстродействия контроллера(расчет тригонометрических функций о-о-очень медленный), а на чем-нибудь более быстром, типа СТМ32 - это пустая трата ресурсов.
Расчет синуса делается заранее и кладется в память в виде готовой таблицы значений с шагом, например, в градус. А во время работы мотора у вас работает таймер(что такое аппаратный таймер МК - почитайте, это не микрос), который через равные промежутки берет из таблицы следующее значение и загружает в регистр PWM. В зависимости от частоты этого таймера меняется частота вращения мотора. И все.
Значение микрос в управлении мотором вам не нужно вовсе.
Если всё-таки необходимо обнулить, то надо обнулять три переменные:
Если всё-таки необходимо обнулить...
приведите пример, когда это может быть необходимо? :)
Задача "обнулить миллис" возникает только у самых зеленых новичков, которые ардуину увидели 2 дня назад... Это примерно тоже самое, как " принести ведро компрессии" у автомехаников :)
а когда судно выходит из порта, за борт бросают кильватер...
Если бы мне до усрачки захотелось бы обнуляемый millis сделать, то делал бы я его так. Завел бы long zero_millis в месте кода где нужно обновить писал бы zero_millis=millis(), а где нужно получать его значение то писал бы (millis()-zero_millis). И все.
Абычна, четверть периода - достатошно. 0-90 гра. Остальное вычисляется
Да. 8 бит в 8 бит.
Спасибо за Ваши советы
p.s. ушёл искать материал про составление таблиц и аппаратный таймер, в ближайшее время(надеюсь) ещё появлюсь тут, если получится - выложу всё что у меня получилось
Но миллис-то можно обнулить... Значение хранится в переменной ;) Сорцы avr-lib покажут, что надо делать extern, чтобы бахнуть это чертов счётчик.
а когда судно выходит из порта, за борт бросают кильватер...
Если бы мне до усрачки захотелось бы обнуляемый millis сделать, то делал бы я его так. Завел бы long zero_millis в месте кода где нужно обновить писал бы zero_millis=millis(), а где нужно получать его значение то писал бы (millis()-zero_millis). И все.
Хотел такое написать с работы, да отвлекли. Куда логичнее и не убивает новый код (если его надо будет добавить).
а где нужно получать его значение то писал бы (millis()-zero_millis). И все.