Ох уж эти прерывания
- Войдите на сайт для отправки комментариев
Втр, 22/03/2016 - 11:18
[code]
#define STEP 7
#define DIR 6
#define En_5V 9
double s = 12;
void setup() {
pinMode(STEP, OUTPUT);
pinMode(DIR, OUTPUT);
pinMode(En_5V,OUTPUT);
}
void MotorBegin(double Step,boolean dirMotor)
{
s = s -0.01;
if (s < 5) s = 5;
digitalWrite(DIR, dirMotor);
for (float i = 0; i < Step; i++)
{
digitalWrite(STEP, HIGH);
delayMicroseconds(s*(s*1.58));
digitalWrite(STEP, LOW);
delayMicroseconds(s*(s*2));
digitalWrite(En_5V, HIGH);
}
}
void loop()
{
MotorBegin(s,0);
}
[/code]
Собственно на LCD нужнужно вывести значение переменной 's' сильно не пинайте начанающий я
а где тут прерывания?
а где тут прерывания?
так вот и надо кудато их (прерывания) впихнуть , а у меня с этим пока ни чего не получается
опиши что ты хочешь получить. я не очень понял. только подробно
ок
На LCD нужно выводить значения переменной s, и что б при этом двигатель не тормозил . Так сказать запаралелить процесс управления двигателем и процесс вывода значения переменной на LCD , а на данный момент (насколько я понимаю) процесс работает последовательно и из за этого наступают сбои в работе шагового двигателя
в данном случае я бы сделал обработчик прерывания по таймеру, например timer2 и туда вставил код управления шаговиком, тогдк шаговик будет работать с четко заданными интервалами времени
в LCD в loop() как обычно
В коде плохо все. От double s = 12; до вставки в сообщение, все плохо. Начните заново. Вы пишите про сбои при выводе на экран, а в коде вывода нет. И экрана тоже нет. Это вобще как?
Во-первых, digitalWrite(En_5V, HIGH); необходимо унести в setup(), насколько я понимаю. И digitalWrite(DIR, dirMotor);, похоже, тоже - Вы же не меняеете напрвление нигде.
Ищите тему, тут уже полно описаний как сделать управление по таймеру: надо ногами "двигателя" управлять из прерывания таймера. У уберите вещественные значения, перейдите на целочисленный с коэффициентом 1024, например. Вещественные числа авркам считать напряжно, а кратные степени двойки - на ура.
класс титановый велосипед для delay без delay().
Ухожу в прерывания с головой ))
Не нужно прерываться. Любая многозадачность это быстрое переключене между задачами. Дело в том что у Вас экран печатается в каждом цикле, это очень много, ведь частота то 16 МГц. Нужно определиться как часто нам нужно обновлять эту s. ну допустим раз в секунду. тогда пишем
Очень вам конечно благодарен, но вся затея в том , что б отследить значение переменной "s" в момент когда двигатель входит в резонанс ...
Ну не нужны они вам, уж просто поверте, чтоб много не писать. Вы в них поразбирайтесь, они хорошие ;) но конкретно эта штука без них лучше получится.
уменьшите значение time_period до 100, пусть будет 10 кадров в секунду.
Ухожу в прерывания с головой ))
Это важно, что с головой. Если нигде её по дороге не збудешь, то всё получится.
Всех благодарю за пинки . Вчера умерла ардуинка заказал новую жду . Еще где то у меня валяется STM32 DISCOVERY но пока недорос до нее
Всех благодарю за пинки . Вчера умерла ардуинка заказал новую жду .
RIP.
А может в реанимацию? диодик там перепаять..
Еще где то у меня валяется STM32 DISCOVERY но пока недорос до нее
Можна блинком помигать попробывать. Там не так все просто как с AVR. К тому моменту как получится - глядиш новая приедет ;))) А опыт организации компиляции и загрузки в STM не лишний.
Не нужно прерываться. Любая многозадачность это быстрое переключене между задачами.
Вы сильно заблуждаетесь, если говорить о теории многозадачности. А для АВРок совершенно верно - карусель с таймслотами. :)
Всех благодарю за пинки . Вчера умерла ардуинка заказал новую жду .
RIP.
А может в реанимацию? диодик там перепаять..
Диодик ? Так не реагирует даже на кнопку "резет" думаю сдох контроллер