Задержка без Delay.
- Войдите на сайт для отправки комментариев
Вс, 27/12/2015 - 00:32
Делаю первые шаги в освоении ардуино.
Помогите понять свою ошибку.
тестовые скетчи.
Первый код с delay работает.
int data_pin = 11; int clock_pin = 12; byte g_digits[10]={ B00100001, B10110111, B00011001, B00010101, B10000111, // 0 1 2 3 4 B01000101, B01000001, B00110111, B00000001, B00000101}; // 5 6 7 8 9 byte disp; int ledPin = 13; int ledState = LOW; void setup() { pinMode(clock_pin, OUTPUT); pinMode(data_pin, OUTPUT); pinMode(ledPin, OUTPUT);} void loop() { for (int j = 0; j < 10; j++) { disp = g_digits[j]; shiftOut(data_pin, clock_pin, LSBFIRST, disp); if (j > 5) ledState = HIGH; else ledState = LOW; digitalWrite(ledPin, ledState); delay(500);} }
Второй с millis не работает.
//счетчик до 10 на 4094!!!! int data_pin = 11; int clock_pin = 12; byte g_digits[10]={ B00100001, B10110111, B00011001, B00010101, B10000111, // 0 1 2 3 4 B01000101, B01000001, B00110111, B00000001, B00000101}; // 5 6 7 8 9 byte disp; int j_delay = 500; unsigned long actual_j_delay = 0; int ledPin = 13; int ledState = LOW; void setup() { pinMode(clock_pin, OUTPUT); pinMode(data_pin, OUTPUT); pinMode(ledPin, OUTPUT); } void loop() { if(millis() - actual_j_delay > j_delay) { actual_j_delay = millis(); for (int j = 0; j < 10; j++) { disp = g_digits[j]; shiftOut(data_pin, clock_pin, LSBFIRST, disp); if (j > 5) ledState = HIGH; else ledState = LOW; digitalWrite(ledPin, ledState); } } }
Не работает? бывает по разному...
При компелировании какие ошибки выдает?
сдается мне переменные разнотиповые в кучу свалили...
В первом случае задержка внутри цикла, во втором - снаружи. Скетчи разные.
Плюс как именно и что не работает, откуда мы знаем?
Не работает? бывает по разному...
При компелировании какие ошибки выдает?
сдается мне переменные разнотиповые в кучу свалили...
]
Компилируется и заливается без ошибок.
Тоже думаю, что совмещаю несовместимое, а как сделать правильно, не соображу.
Мне, по сути, нужна задержка только для
Не могу сообразить, как можно Millis() засунуть внутрь цикла, если Millis() - объемлющий цикл.
Задача теста - считать на семисегментнике от 0 до 9 и при условии, когда число больше пяти - зажигать светодиод (13).
Скетчи разные только реализацией задержки.
Первый вариант работает исправно, цифры считает, светик горит, когда надо, а именно 3 секунды не горит и 2 секунды горит.
Второй вариант выводит на индикатор мусор, который вздрагивает через 500мс, светик отрабатывает включение - выключение, но с другими интервалвми.
Первый код с delay работает.
Второй с millis не работает.
.....
Вы понимаете что это не логично и с таким подходом вы программировать не научитесь!
-Если работает с delay то нужно так и оставить.
-А если хотите неаучиться delay не использовать, тогда зачем чужой помощи просите? Ищите ошибку сами тогда будет толк.
...тогда зачем чужой помощи просите? Ищите ошибку сами тогда будет толк.
Ну, можно учиться на своих ошибках, а можно на чужих...
Как я понимаю, функция приращения for и функция задержки Millis не совместимы.
Вот так все заработало, что еще раз доказывает, что утро вечера мудренее.
Вот ответ http://arduino.ru/forum/programmirovanie/kak-podruzhit-tsikl-i-funktsiyu-millis
Ну вот, теперь и здесь задержка внутри цикла.
Уважаемый kisoft, я честно не понимаю...
Разве не наоборот? Я вижу в последнем коде функцию задержки Millis, внутри которой всё и происходит.
Вы не могли бы потратить немного своего времени, чтобы объяснить или указать на статью, где этот вопрос будет досконально разжеван?
У меня возникла необходимость адаптировать программу, взятую здесь под свои нужды. И она у меня уже работает, если контроллер сам управляет светодиодными индикаторами.
Если же я перевожу управление на сдвиговый регистр, индикация пропадает, тот же мусор.
Там используется конструкция
Я пытаюсь изменить её вот так
Пока безуспешно. И попытка избавиться от for пока не дала результат на этом конкретном случае.
Я вижу, что в сообщении #5 что все работает. А теперь оказывается, что не работает. Как понять то?
Ну, можно учиться на своих ошибках, а можно на чужих...
На чужих ошибках учатся только хирурги-травматологи.
Все остальные - на своих.
в сообщении #5 "учебный" код, из которого я выкинул for.
И выводы я там про несовместимость делаю неверные.
Потому что в чужом коде оно работает. Но там нет shiftOut.
В итоге, я избавился от for и там. Почти уверен, что если бы больше понимал - не пришлось бы избавляться.
Возможно, сумбурно получилось объяснить...
Мне бы хотелось понять Ваши замечания про вложенность функций. Могли бы направить?
Не понимаю о вложенности каких функций идёт речь?
Разбейте задачу на части. Научитесь работать с 595 регистром без циклов. Потом усложняйте задачу. Статьи по регистру есть на форуме, почитайте раздел Программирование в верхней части экрана есть такая ссылка. Там есть примеры работы с 595.
http://arduino.ru/Tutorial/registr_74HC595
...тогда зачем чужой помощи просите? Ищите ошибку сами тогда будет толк.
Ну, можно учиться на своих ошибках, а можно на чужих...
Как я понимаю, функция приращения for и функция задержки Millis не совместимы.
Вот так все заработало, что еще раз доказывает, что утро вечера мудренее.
Вот ответ http://arduino.ru/forum/programmirovanie/kak-podruzhit-tsikl-i-funktsiyu-millis
а что милис не работает в цикле?
милис завязана на таймер 0. функция делей вызывает милис. т.е по сути делей тот же N*милес.
Я тоже не понимаю, и поэтому прошу Вас разъяснить, что Вы имелли ввиду здесь
и здесь
Я тоже не понимаю, и поэтому прошу Вас разъяснить, что Вы имелли ввиду здесь
[/quote]
Может я попробую объяснить : в тех двух скечах что вы привели в первый в лупе есть цыкл, который тормозится на пол секунды после каждого прибавления i, а во втором скече цыкл for вызывается раз в пол секунды и "прохерачивает сразу все i без задержек.
Первый выполняется так i=0, пауза, i=1, пауза, i=3, пауза....
Второй так: пауза, i=0,1,2,3,4,5,6,7,8,9,10, пауза.
Мне бы хотелось понять Ваши замечания про вложенность функций. Могли бы направить?
Про вложенность функций - вот это Ваша фраза. Понятия не имею, что имелось с виду, по контексту непонятно.
Mr.Privet, благодарю.
Не сочтите за наглость - а как нужно было сделать во втором случае, чтоб не выкидывать for и не использовать delay?
Спасибо.