Страница 1 из 2
Куда вставить задержку
Добавлено: Сб май 14, 2016 20:26:06
Дем
Программа для биполярного двигателя _ взял на одном сайте
Необходимо задержка включения двигателя после нажатия кнопки
Куда вставить функцию _delay_ms(5000)?
ункциб de <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
// Полношаговый режим 2 фазы
// Направление вращения по часовой стрелке
unsigned char cw_dir[4]=
{
0b00000001,
0b00000010,
0b00000100,
0b00001000
};
// Направление вращения против часовой стрелки
unsigned char ccw_dir[4]=
{
0b00001000,
0b00000100,
0b00000010,
0b00000001
};
volatile unsigned char step_index;
volatile unsigned int ovftimes;
volatile unsigned char status;
// Прерывание по переполнению Т0
ISR(TIMER0_OVF_vect)
{
static unsigned int count = 1;
count++;
if(count >= ovftimes) // Применяем задержку
{
cli(); // Запрещаем прерывания
if(status) // если status == 1 крутим против часовой
PORTB = ccw_dir[step_index++];
else // иначе крутим по часовой
PORTB = cw_dir[step_index++];
if (step_index >= 4)
step_index=0;
count = 0; // Сброс счетчика
TCNT0 = 0; // Старт счетчика с нуля
sei(); // Глобально разрешаем прерывания
}
}
// прерывание по вектору INT0
ISR(INT0_vect)
{
status = 0; // по часовой
}
// прерывание по вектору INT1
ISR(INT1_vect)
{
status = 1; // против часовой
}
int main(void)
{
DDRB = 0b00001111; // PB0, PB1, PB2, PB3 - выходы
PORTB = 0x00; // Лог. нули на выходе
ADCSRA = (1 << ADEN) // разрешение АЦП
| (1 << ADPS2) // предделитель на 64 (частота АЦП 125kHz)
| (1 << ADPS1);
ADMUX = 0x00; // ADC0 - вход, внешний ИОН 5 Вольт
GICR |= (1 << INT1)|(1 << INT0); // Разрешаем внешние прерывания
MCUCR |= (1 << ISC11) // Прерывание по заднему фронту INT1
|(1 << ISC01); // Прерывание по заднему фронту INT0
TCCR0 |= (1 << CS01); // Предделитель на 8
TCNT0 = 0; // Старт счетчика с нуля
TIMSK |= (1 << TOIE0); // Разрешаем прерывания по переполнению Т0
step_index = 0;
ovftimes = 10; // первоначальная задержка
status = 0; // при включении вращение по часовой
sei(); // Глобально разрешаем прерывания
while(1)
{
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while (ADCSRA & (1 << ADSC)); // Ждем пока завершится преобразование
ovftimes = ADCW; // Значение временной задержки
}
}
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 08:46:06
Аlex
Дем писал(а):после нажатия кнопки
После какой кнопки ? Тут про кнопку вообще ничего не сказано.
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 08:59:05
Дем
Здесь прерывания прописаны. Я програмирмастак не мастак. Но мне кажется в одной из функций можно вставить задержку, что бы движок запустился позже.
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 09:33:03
Demiurg
Дем писал(а):Куда вставить функцию _delay_ms(5000)?
День рождения у Наташи Ростовой - 19 лет. Приглашены все гусары. Наташа втыкает свечки в торт, поместилось только 18. "Господа, куда же мне вставить 19-ю?"
Всех опережает поручик Ржевский: "Гусары, молчать!"
Если серьезно, то при написании программ и затруднениях: берем бумажку, карандаш, садимся и рисуем. Алгоритмы.
В вашем примере все свалено в кучу.
Некоторые правила при написании программ:
Модульность.
Опрос кнопки отдельный модуль. Аналого-цифровое преобразование - отдельный модуль. Собственно алгоритм устройства - отдельный модуль.
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 09:46:50
Аlex
Вообще, вставлять так тупо задержку - равносильно паузы до нажатия кнопки. Просто как захотели нажать на кнопку, подождите 5 секунд и жмите

Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 10:36:57
Дем
Я же говорю не спец. Прога работает, но я цепляю устройство к таймеру. Таймер не может работать менее 1 минуты, поэтому нужна задержка запуска, а как сделат незнаю
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 10:43:01
Demiurg
Дем писал(а):Я же говорю не спец. Прога работает, но я цепляю устройство к таймеру. Таймер не может работать менее 1 минуты, поэтому нужна задержка запуска, а как сделат незнаю
Насколько я понял, вы пытаетесь пристроить какую-то найденную программу. Что вы вообще делаете? Озвучьте вашу задачу.
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 10:49:32
Аlex
Дем писал(а):Таймер не может работать менее 1 минуты, поэтому нужна задержка запуска
Не вижу никакой связи. Причём тут 5 секунд задержи и минуты в каком-то там таймере ?

Порой люди сами не понимают, что им нужно. Отсюда и не могут нормально объяснить.
ЗЫ: Вы бы хоть схему чтоли показали, или ссылку откуда всё это взяли.
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 12:40:58
Дем
Есть суточный таймер. Есть плата управления биполярным двигателем. Таямер срабатывает раз в сутки на 1минуту и включает другое устройство через реле. Другое устройство это плата управления двигателем. 1 минута это много вот и необходимо что бы двигатель работал не 1минуту а 10 секунд. Программы управления таймером нет, а управления двигателем есть. Вообще это кормушка черепахи.
http://radioparty.ru/index.php/prog-avr ... step-motor
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 12:49:30
Demiurg
Дем писал(а):Вообще это кормушка черепахи.
Для того чтобы решить вашу задачу, нужны исходные данные и что имеем на руках, чтобы из этого всего исходить. Какой суточный таймер. Это он включает на 1 минуту? Вообще, ваш вопрос похож на тему в раздел "Есть работа". Я могу написать вам программу. Но за деньги. Потому что двумя строчками и _delay_ms (5000) здесь не обойдешься.
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 12:57:37
Дем
Теперь понятно что строчкой не обойтись. Буду учиться. Спасибо.
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 13:25:46
Morroc
*кэп очевидность вкл* Взяли бы ардуину что ли. Одна не одна строчка, но всяко меньше в разы - библиотеку воткнули для двигателя, перед стартом запомнили системный таймер, библиотеку пнули чтобы двигатель завертелся и ждем когда таймер отсчитает 10 сек -> двигатель.стоп, разрешаем новый старт.

*кэп очевидность выкл*
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 13:48:08
_abk_
Нагородили...
Есть суточный таймер. Он срабатывает в назначенное время, включает банальный одновибратор на 555АГ3 и еще 3-х деталях, который на 10 сек включает плату двигателя...
Ардуино....за деньги...
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 13:49:52
Аlex
Дем писал(а):Есть суточный таймер. Есть плата управления биполярным двигателем. Таямер срабатывает раз в сутки на 1минуту и включает другое устройство через реле. Другое устройство это плата управления двигателем. 1 минута это много вот и необходимо что бы двигатель работал не 1минуту а 10 секунд. Программы управления таймером нет, а управления двигателем есть. Вообще это кормушка черепахи.
http://radioparty.ru/index.php/prog-avr ... step-motor
А причём тут задержка перед включением ? Вам нужно, чтобы устройство работало 5 секунд, а не задерживать его пуск на 5 секунд.
Копайте в сторону одновибратора. На одной микрухе, типа 555, можно собрать.
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 14:02:42
Demiurg
Аlex писал(а):...
У одновибраторов, мультивибраторов главная проблема - зависимость времянок от емкости. Соответственно, от напряжения питания, температуры. Если используется ТТЛ логика, то времянки долей герца и ниже уже предполагает полярные, электролитические конденсаторы. Которые со временем высыхают. Либо усложнять схемы, чтобы использовать неполярные конденсаторы. Требуется 5 секунд? Тогда ТС-у нужно брать КМОП версию 555 таймера.
Для уменьшения влияния факторов влияющих на частоту и времянки лучше использовать более высокую частоту, соответственно, схемы усложняются делителями частоты.
Что имеем в итоге: либо автор мирится с гулянием времянок, либо усложняет схемы, либо собирает девайс на МК. В последнем случае ТС может постепенно играться функционалом девайса.
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 15:30:58
Morroc
Я думаю черепаха переживет если двигатель будет работать не 10 сек, а 9-11

Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 15:46:32
_abk_
Demiurg писал(а):...В последнем случае ТС может постепенно играться функционалом девайса.
...... Человек же сказал, что ему черепаху надо накормить, а не функционалом играться.
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 15:54:35
Дем
Будем точить механику
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 15:55:19
Demiurg
_abk_ писал(а):Человек же сказал, что ему черепаху надо накормить, а не функционалом играться.
Это сейчас он хочет просто накормить, когда МК освоит, во вкус войдет, колеса к своему питомцу прикрутит. А то и к антиграву на термоклей насоплит...
Re: Куда вставить задержку
Добавлено: Вс май 15, 2016 15:59:08
Аlex
А не проще одновибратор сляпать на одной микрухе ? Схем море в сети.
Да хоть на том же МК 8-ми выводном. Прога то - пару строк.
ЗЫ: Кстати, там же скорость двигателя регулируется, зачем вводить какие то задержки ? Снизьте просто скорость и будет у Вас минуту мееееедленно он крутиться.