Использование 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 нет. Потому и спрашиваю.