Использование millis() вместо delay()
- Войдите на сайт для отправки комментариев
Сб, 09/01/2016 - 14:19
Доброго времени суток. У меня имеется работающая функция для измерение питающего напряжения микроконтроллера, хотел использовать millis() вместо delay() (currentTime>=loopTime+Timer){...}), но ничего не выходит. Помогите пожалуйста разобраться, так как из за слабого понимания работы функции не могу правильно выставить паузы.
float readVcc(){ float result = 0.0; float tmp = 0.0; ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); delay(1);//Здесь пауза ADCSRA |= _BV(ADSC);//Start conversion while (bit_is_set(ADCSRA,ADSC));//measuring uint8_t low = ADCL;//must read ADCL first - it then locks ADCH uint8_t high = ADCH;//unlocks both tmp = (high<<8) | low; tmp = (typVbg * 1023.0) / tmp; result = result + tmp; curV=result; return result; }
лишняя строка, забыл удалить.
SpearMint, этот delay(1) можно вообще убрать, это пауза навсякий случай. Или сделать раз в 100 меньше. В функции analogRead например паузы нет. Если вы в скече не производите измерения с других аналоговых входов, то настройку мультиплексора можно убрать в секцию setup()
Я тоже так думал, но как только убрал паузу почему то функция начала показывать вместо ~4.8 около 1.2v
SpearMint, значит не успевает зарядиться конденсатор на выводе Aref. Ну тогда подбирайте поменьше паузу, или настройку ADMUX перенести в setup()
Действительно, в пустом скетче всё работает. Проблема оказалось в том что у меня на аналоговом выходе висят кнопки, они и мешают работе функции. Буду думать что делать с этим, спасибо.
Одно не понял, при чем тут millis?
использование millis позволяет не использовать delay(), благодаря этому можно не отвлекать МК на паузы и в "свободное" время продолжать выполнять программу
Вижу скетч с delay, а с millis нет. Потому и спрашиваю.