Помогите разобраться в работе uint32_t и uint16_t
- Войдите на сайт для отправки комментариев
Пнд, 02/03/2020 - 11:27
Привет, что я опять не так делаю? Прошу помощи.
Балуюсь с ШИМ и шаговым. Решил сделать плавное замедление. В результате правок и тестирования получил следующий код с шагом в цикле 30 тысяч. Работает идеально.
Подумал, что для 30 тыс. вместо uint32_t хватит и uint16_t. Но не тут-то было. При uint16_t время цикла в разы падает при этом не доходя до минимальных значений. Как будто сбрасывается раньше.
Чего я не учел? Все мои внутренние предположения разбиваются о факт нормальной работы с uint32_t. Пробовал компилировать и заливать и в Ардуино, и в Атмел Студио 7. Эффект один и тот же. Мега 2560.
#include <avr/io.h> int main(void) { DDRE |= (1 << 4); // нога 2 выход PE4 PORTE &= ~(1 << 4); TCCR3A |= 1 << COM3B1; TCCR3A &= ~(1 << COM3B0); TCCR3A &= ~((1 << WGM30) | (1 << WGM31) | (1 << WGM32)); TCCR3B |= 1 << WGM33; TCCR3B |= 1 << CS31 ; TCCR3B &= ~((1 << CS30) | (1 << CS32)); while (1) { for (uint32_t i = 0; i <= 30000; ++i) { OCR3B = 50 + i / 1000; ICR3 = OCR3B * 2; } } }
строка 21 как бы абсурдна, мне кажется
Гарантируется минимальное значение "50"
OCR3B = 50 и ICR3 = 100 - это значения при максимальной скорости вращения.
В чем абсурд по-Вашему?
Привет, что я опять не так делаю?
Ну, как что? Вам в Ваших прошлых темах что рекомендовали делать? Читать хорошие книжки! А Вы что вместо этого делаете?
Балуюсь с ШИМ и шаговым.
Вот это и не так.
Как и прошлый раз, перечитал все в разделе не по разу. Не помогло пока.
у вас цикл основан на времени выполнения математических операций, что уже само по себе очень неправильно, так как не дает надежного интервала. Операции с типом int16_t В РАЗЫ быстрее, чем с uint32_t - вот и ответ.
Не пользуйте эти костыли из циклов с магически подобраным числом повторений, используйте таймеры
Да уж. 21 строка. Выход при любых uint32_t и uint16_t крутится от 50 до 80 с шагом 1 на каждые 1000 прокруток цикла. Какая плавная прокрутка? Это делэй самодельный.
у вас цикл основан на времени выполнения математических операций, что уже само по себе очень неправильно, так как не дает надежного интервала. Операции с типом int16_t В РАЗЫ быстрее, чем с uint32_t - вот и ответ.
Не пользуйте эти костыли из циклов с магически подобраным числом повторений, используйте таймеры
Спасибо, именно такие были подозрения, что "не успевает". В рабочем коде я использую другой алгоритм формирования. Но всегда было интересно дойти до края, "до абсурда". Это очень помогает разобраться. Как с велосипедом, нельзя научиться не падая.
Благодарю. Тема закрыта.
Да уж. 21 строка. Выход при любых uint32_t и uint16_t крутится от 50 до 80 с шагом 1 на каждые 1000 прокруток цикла. Какая плавная прокрутка? Это делэй самодельный.
Ну это же не рабочая программа. А кусок кода для тестирования замедления.
А вот попробуйте переделать код, чтобы обойтись без цикла задержки...
На входе в цикл запомним в переменную микрос(), на выходе подсчитаем её значение, будет известна требуемая задержка на -"Работает идеально." для 30 итераций
...используйте таймеры
Можно я немного приоткрою тему, пользуясь случаем?
Верен ли будет такой алгоритм для отсчета интервала?
1) Запустить таймер с нужными параметрами;
2) Ввести переменную, которая будет изменяться по совпадению таймера (OCR);
3) Работать с этой переменной для получения интервалов.
Я перед ШИМ так делал, но решил "срезать", пойти напрямую и посмотреть. Посмотрел ))
Может у Вас есть под рукой пример для тайминга, который Вы считаете удачной реализацией? ну а вдруг?..
А вот попробуйте переделать код, чтобы обойтись без цикла задержки...
На входе в цикл запомним в переменную микрос(), на выходе подсчитаем её значение, будет известна требуемая задержка на -"Работает идеально." для 30 итераций
Да, это понятно, спасибо.
Так я делал в самом начале.
Именно тут цель другая - перепробовать возможные варианты работы. Представьте есть потребность что-то крутить. Включил ШИМ (без изменения параметров) и на ногу провод от шагового двигателя. Вот и пусть крутится пока включен контроллер. И у меня крутился беззаботно, пока я не решил параметры на ходу таким поменять ))
У меня только один вопрос - почему выбран ШИМ?
Для генерации прямоугольного импульса для шагового двигателя.
Показалось элегантным решением использование аппаратного ШИМ ))
Тут уместней CTC, как мне кажется.
ШИМ красивее, конечно, на осциллографе выглядит, но с ним сложней рассчитывать соотношение on/off так, чтобы не пролететь с допустимыми для драйвера длительностями состояний выхода. Тем более, как я полагаю, ICR3 = OCR3B * 2 - для меандра?
Или ещё какой-то фокус проделывается с этим таймером?
Может у Вас есть под рукой пример для тайминга, который Вы считаете удачной реализацией? ну а вдруг?..
Дарю тебе будильник с разрешением 1 мс. https://github.com/DetSimen/Arduino_TimerList
Тут уместней CTC, как мне кажется.
ШИМ красивее, конечно, на осциллографе выглядит, но с ним сложней рассчитывать соотношение on/off так, чтобы не пролететь с допустимыми для драйвера длительностями состояний выхода. Тем более, как я полагаю, ICR3 = OCR3B * 2 - для меандра?
Или ещё какой-то фокус проделывается с этим таймером?
Спасибо, попробую СТС.
Да, все верно Вы указали, только меандр.
Контроллер ШД парень "крепкий". Я ему разные скважности подсовывал, все ест ))
Дарю тебе будильник с разрешением 1 мс. https://github.com/DetSimen/Arduino_TimerList
Спасибо! Будильник мне еще никто не дарил :)
Я без сарказма, обязательно разберусь с тем, что там написано.
P.S. Хочется пошутить, поэтому:
1. МС не мало? Не проспать бы )) Кстати, я читал Атмел, что они калибруют свои внутренние осцилляторы. Интересно, а как поддерживается точность на длительном промежутке времени этих будильников?
2. Надо было тему 23 февраля открывать.... ++подарок
P.P.S. Какое у Вас там вступление...
P.P.P.S. Прочел. Наверное, как пишете Вы, мне "еще рано". Много незнакомых конструкций на этот день.
В любом случае, спасибо.
Привет, что я опять не так делаю? Прошу помощи.
Балуюсь с ШИМ и шаговым. Решил сделать плавное замедление.
Сорри. Я буду краток. То, что ты написал - работать не может.
Изменения OCR и TOP нужно делать в прерывании по достижении TOP. У меня всё.
Сорри. Я буду краток. То, что ты написал - работать не может.
Изменения OCR и TOP нужно делать в прерывании по достижении TOP. У меня всё.
Тоже кратко. Как не может, если работает? Ну будем считать повезло.
Сорри. Я буду краток. То, что ты написал - работать не может.
Изменения OCR и TOP нужно делать в прерывании по достижении TOP. У меня всё.
Пащиму, нащальника?
Для PWM mode#8 OCR3x запишется в теневой регистр и, в точке BOTTOM, аутомотически перенесётся в реальный OCR3x. Другое дело, что TOP менять надо бы с оглядкой, а то так можно и впросак попасть. Да и атомарности тут нет... Оно потом проявится, случайным стуком.
Сорри. Я буду краток. То, что ты написал - работать не может.
Изменения OCR и TOP нужно делать в прерывании по достижении TOP. У меня всё.
Пащиму, нащальника?
Да именно штоп случайностей не было. ;))
Посчитать потребное время замедления, количество шагов, размер шага и микросекунд на шаг. А потом запустить все это, меняя границы в прерывании.
Я сторонник классических решений. На их написание - не тратишь время, изобретая велосипед.
-----------------
Мой прошлый пёс однажды увидел сосиску и спёр её! ;)) Так вот, не имея опыта поедания сосиски, он пытался есть её поперёк собаки. Было неудобно. Потом пришло понимание, что сосиску надо есть вдоль собаки! ;)))
Посчитать потребное время замедления, количество шагов, размер шага и микросекунд на шаг. А потом запустить все это, меняя границы в прерывании.
Ну, это логическая часть. Технически-то всё работоспособно. Отсюда и расхождение во взглядах.
Посмотрите видео (всего минута и три секунды). Если раньше не видели, хорошее настроение обеспечено!
Кстати, надо показывать бы всем, кто тут пишет "уже целый день трахаюсь, памагити!" - упорнее надо быть. Вот он - смог!
Что тут такого? Мой обычный день в программировании. )))))
Мой обычный день в программировании. )))))
Неправда Ваша, сэр! (ничего, если я процитирую Булгакова? - "перед нами типичный случай так-называемого вранья")
Если бы это был Ваш день, то после третьей-пятой попытки, кот пошёл бы постить на форум сообщение с заголовком: "кукуруза + ворота - памагити прапихнуть непрапихуемое"
:-)
Неправда Ваша, сэр! (ничего, если я процитирую Булгакова? - "перед нами типичный случай так-называемого вранья")
Если бы это был Ваш день, то после третьей-пятой попытки, кот пошёл бы постить на форум сообщение с заголовком: "кукуруза + ворота - памагити прапихнуть непрапихуемое"
:-)
Вы не представляете, сколько я тем после последнего холивара не опубликовал, так хотел и про ворота, и про кукурузу )) Два дня только прерывания с UARTом скрещивал, пока кукуруза не пролезла ...
Сегодня промолчать не смог, внутри кто-то сказал: сам не справишься, иди пиши :)
А Булгаков да, в тему ))
Посмотрите видео (всего минута и три секунды). Если раньше не видели, хорошее настроение обеспечено!
Кстати, надо показывать бы всем, кто тут пишет "уже целый день трахаюсь, памагити!" - упорнее надо быть. Вот он - смог!
Коту - мои респект и уважуха!!!Мой так гребенку на окне открывать учился... победил минут через 10!
Коту - мои респект и уважуха!!!...
Если кратко, то так работать не будет. Код бессмысленный.
Правильно: моЙ респект, уважуха (через запятую, как перевод слова)
)))))
Коту - мои респект и уважуха!!!...
Если кратко, то так работать не будет. Код бессмысленный.
Правильно: моЙ респект, уважуха (через запятую, как перевод слова)
)))))
Это если перевод. Но в русском это уже два разных понятия, описывающие две различные эмоции.
Респект - сдержанная форма уважения, можно проиллюстрировать: "Снимаю шляпу!".
Уважуха - панибратское выражения радости за "кореша". Сопровождается дружескими пинками и похлопыванием по плечу. ;))))) Как-то так.
Это если перевод. Но в русском это уже два разных понятия, описывающие две различные эмоции.
Респект - сдержанная форма уважения, можно проиллюстрировать: "Снимаю шляпу!".
Уважуха - панибратское выражения радости за "кореша". Сопровождается дружескими пинками и похлопыванием по плечу. ;))))) Как-то так.
Ну в этом случае я бы тем более не смешивал. )))
Как джентельмен, изъясняющийся на новоязе. Или как гопник на корточках с семками и со словами "Честь имею, сударыня". Как степень мокрости воды. У меня не получается одновременно эти два слова использовать.
И как прикажете коту на эту фразу реагировать? - "Благодарю. Збс." )))
Посмотрите видео (всего минута и три секунды). Если раньше не видели, хорошее настроение обеспечено!
Кстати, надо показывать бы всем, кто тут пишет "уже целый день трахаюсь, памагити!" - упорнее надо быть. Вот он - смог!
Я в ролике вижу гораздо больший философский смысл, уравнивающий кота с ардуинщиками: кукуруза эта коту, в принципе, не нужна. Если только он не ЗОЖ-ник.
Абсолютно! Именно так! И в этом нет никакого противоречия!
Этот кот - достояние рода, изобретатель. Экспериментатор. И не только в Ардуино. Вообще в любой сфере.
Вы сами говорите: читай книгу. Так читаешь всю книгу, не зная заранее, что понадобится. Все учат мигать диодом или выводить на консоль "Hello World!". Кто потом именно так, как в примерах, делает? Никто. Это этап становления.
Флуктуации - это именно то, благодаря чему всё вообще развивается. Да а как иначе? Ведь развитие будет только тогда, когда будет интерес что-то сделать. Причем сделать не так, как все. Уж наверное микроконтроллер придумали не по книге: "как сделать Ардуино, пока его не придумали".
И одновременно здесь на форуме витает мысль, что приветствуются те, кто что-то пытается. Абсолютное противоречие: не бери кукурузу, но приготовь из нее крахмал.
И как это все без кукурузы сделать, объясните? Определенно никак. Метафизика.
Не могу не восхититься глубиной философского проникновения в предмет. Согласен на 200%. :))) Хотя у самого на столе три панельки с воткнутыми проводками. А сам даже и не ЗОЖ-ник ни грамма. Может на кукурузу перейти?
Я в ролике вижу гораздо больший философский смысл, уравнивающий кота с ардуинщиками: кукуруза эта коту, в принципе, не нужна. Если только он не ЗОЖ-ник.
А дома жена такая: "Ну и нафига ты это припер?! Иди сдавай назад в магазин!" )))
В С++ всего несколько базовых конструкций и несколько десятков ключевых слов. И все до единой программы состоят именно из этих конструкций и этих слов. И Ваши попытки оправдать свою лень их изучать неуместны. Знать их абсолютно обязательно даже (и особенно) если Вы собираетесь программировать то, чего никто до Вас не программировал. Например, чтобы быть художником мало уметь точно зарисовывать с натуры, ещё нужно уметь видеть то, чего не видят другие. Но это не отменяет необходимости уметь изобразить то, что видишь!
Да и знать-то там ... базовых конструкций в языке "всего-ничего" и все программы построены на них. Это как в попсе - по большому счёту всего две темы: "мне не дают" и "мне наставили рога" а песен-то вона сколько!
Только лишь, поясню, что я имел в виду:
Вы используете delay для управления светодидом? Часто пишете "Привет, мир"?
Ведь развитие будет только тогда, когда будет интерес что-то сделать. Причем сделать не так, как все.
Ты не совсем понимаешь предмет, а потому и строишь неадекватные аналогии.
В случае твоей задачи твои попытки это не поиск нового решения, а повторения ДАВНО известных ошибок.
Одно дело искать новое, другое дело - повторять НОВЫЕ ДЛЯ ТЕБЯ, но давно известные ошибки.
В примере задачи: не синхронизированное с таймером изменение OCR и TOP - источник бесконечного количества глюков и сбоев, с которыми ты потом не будешь знать, что делать и возможно опять придешь сюда.
Поэтому и написано - "не будет работать". Делай простые вещи - как положено, типовыми способами. Для этого изучи эти способы, условно "моргая светодиодом". А творчество оставь для сложных, не типовых задач.
Всегда стоит помнить поговорку: "Ты делай хорошо! Плохо - само получится!".
Вы используете delay для управления светодидом? Часто пишете "Привет, мир"?
Ты не поверишь!!! ;)))
Рассказать откуда ноги растут?
Сделал меандр на выходе, на задержках. Следующий миллисами. Следующий таймером. Прочел про ШИМ, сделал. Прочел про регистр ICR. Сделал. И понимаю, что не надо так. Да плевать хотел. У меня эксперименты.
Это ты не имеешь ни малейшего понятия, что я делаю и зачем. А вопрос был лишь в том, почему перестал работать код.
Твой ответ вообще не нужен, от слова совсем, он не для того вопроса. Так понятнее?
Всем привет,
откланяюсь.
Рассказать откуда ноги растут?
Сделал меандр на выходе, на задержках. Следующий миллисами. Следующий таймером. Прочел про ШИМ, сделал. Прочел про регистр ICR. Сделал. И понимаю, что не надо так. Да плевать хотел. У меня эксперименты.
Это ты не имеешь ни малейшего понятия, что я делаю и зачем. А вопрос был лишь в том, почему перестал работать код.
Твой ответ вообще не нужен, от слова совсем, он не для того вопроса. Так понятнее?
Всем привет,
откланяюсь.
Терпеливо, раз уж нужно любить новичков.
Почему твой, простите, "код"не стал работать с int16_t тебе пояснили выше - слишком быстро делит на 1000. Влияет это потому, что написал я - нельзя так делать вообще. Нельзя менять TOP и OCR не синхронно с таймером.
---
Общий же подход неверен в том, что "прочел про то - сделал...". Это процесс обучения, интимный, как мастурбация. Ты ж не станешь демонстрировать на форуме результат неудачной мастурбации?
---
То что мой ответ как раз "от того вопроса" ты не смог понять просто потому, что еще не обладаешь достаточным знанием предмета.
Вы используете delay для управления светодидом?
А то! Я не состою в секте делеефобов, и там, где делей уместен именно его и использую. Другое дело, необходимо точно понимать, что делаешь, ну так это в любом деле так.
Да в твоей теме меня всего прям распропагандировали!
Это ты не имеешь ни малейшего понятия, что я делаю и зачем. А вопрос был лишь в том, почему перестал работать код.
Твой ответ вообще не нужен, от слова совсем, он не для того вопроса. Так понятнее?
Всем привет,
откланяюсь.
а что обижаться то? вам всего лишь указали на ошибку в тестовой программе - а реакция как будто вам сказали. что вы прожили жизнь впустую :)))