Страница 3 из 4
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 14:46:52
kelod
eess9 писал(а):Вы знаете что такое логические операции?
сделал так:
Код: Выделить всё
ADCSRA &=~ (1 << ADEN);
ADMUX &=~ (1 << MUX3)|(1 << MUX2)|(1 << MUX1)|(1 << MUX0);
ADMUX |= (0 << MUX3)|(0 << MUX2)|(1 << MUX1)|(0 << MUX0); // вход ADC0
ADCSRA |= (1 << ADEN);
ADCSRA |= (1 << ADSC);
не фига не заработало опять
потом тупо присвоил
и о чудо всё запустилось
что же касается прерываний, то я не задумывал ждать каждую итерацию, задумывалось выводить на дисплей сохранённые значения, по мере изменения, я же там частоту, скорость, две температуры, дублирую частоту в виде шкалы светиков и ещё кучу всего по мелочи делаю, если каждый раз ждать выполнения чего либо, то данные актуальность будут терять
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 14:55:03
vdavid
kelod писал(а):
сделал так:
Код: Выделить всё
ADCSRA &=~ (1 << ADEN);
ADMUX &=~ (1 << MUX3)|(1 << MUX2)|(1 << MUX1)|(1 << MUX0);
ADMUX |= (0 << MUX3)|(0 << MUX2)|(1 << MUX1)|(0 << MUX0); // вход ADC0
ADCSRA |= (1 << ADEN);
ADCSRA |= (1 << ADSC);
не фига не заработало опять
Вы очень невнимательны. Строка
Код: Выделить всё
ADMUX |= (0 << MUX3)|(0 << MUX2)|(1 << MUX1)|(0 << MUX0); // вход ADC0
никак не соответствует ADC0. Для ADC0 она вообще не нужна. Но уж если сильно хочется, то
Код: Выделить всё
ADMUX |= (0 << MUX3)|(0 << MUX2)|(0 << MUX1)|(0 << MUX0); // вход ADC0
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 14:58:45
vdavid
-
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 15:00:41
kelod
она зато соответствует третей ножке, а на комментарии не обращайте внимания, это я очепятался
и кстати в сон тоже не особо уйдёшь,с тахометра сигналы постоянно идут
и раз уж зашло дело о силе веры, объясните мне обязательно ли нужно обнулять и снова объявлять ADEN у меня вроде нормально заработало даже его не трогая
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 15:08:30
vdavid
kelod писал(а):кстати в сон тоже не особо уйдёшь,с тахометра сигналы постоянно идут
Не всякий сон останавливает таймеры

. Так что можно.
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 15:12:32
kelod
ну так и прерывания генерируются, как только имспульс пришёл, потом считаем время между пришедшим и предидущим, когда спать то ?
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 15:14:15
vdavid
kelod писал(а):
и раз уж зашло дело о силе веры, объясните мне обязательно ли нужно обнулять и снова объявлять ADEN у меня вроде нормально заработало даже его не трогая
Совершенно не обязательно.
И да, код
Код: Выделить всё
ADMUX &=~ (1 << MUX3)|(1 << MUX2)|(1 << MUX1)|(1 << MUX0)
должен выглядеть вот так:
Код: Выделить всё
ADMUX &=~ ((1 << MUX3)|(1 << MUX2)|(1 << MUX1)|(1 << MUX0))
Поскольку унарная операция "~" имеет более высокий приоритет, чем "или", то будет применена только к (1 << MUX3) когда нет скобок.
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 15:17:26
vdavid
kelod писал(а):ну так и прерывания генерируются, как только имспульс пришёл, потом считаем время между пришедшим и предидущим, когда спать то ?
Это если тахометр медленный. А ведь можно подать импульсы с него на T0 или T1 и по прерыванию от времязадающего таймера смотреть сколько их накопилось за фиксированный отрезок времени. Т.е. измерять именно частоту, а не период.
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 15:47:18
kelod
это конечно замечательно, частота измеряется более точно,но появляется такая неприятная вещь как период в течении которого будут накапливаться эти импульсы, например если учесть обороты холостого хода 1000 об/мин, получим 16 об/с , если учесть что распредвал делает 1 оборот за 2 оборота коленвала, получает уже 8 имп/с, за полсекунды насчитает всего 4, а раз в пол секунды это заметная задержка, да и погрешность измерения накладывается и за эти же пол секунды может набраться не 4 импульса, а допустим четыре с половиной или почти пять, поэтому измерять именно время между импульсами в данном случае лучше и точнее, да и погрешности появляются в данном случае на высоких частотах, которые там не так существенны
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 15:59:27
vdavid
Ну так снимать данные с шестерни. У ней зубьев ой как много... А если серьезно, то при низкой частоте импульсов с тахометра - спать не переспать. В Вашем случае - 8 импульсов в секунду - это 125 мс. За это время можно сделать 1500 преобразований АЦП во free running.
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 16:08:17
eess9
У вас батарейное питание? Если нет, то просто не усложняйте себе жизнь.
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 16:14:25
vdavid
Чем меньше молотит процессор/периферия, тем точнее преобразования АЦП за счет уменьшения шумов. Тут резон именно в этом.
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 16:27:05
eess9
Тут есть вопросы. Если спать именно для АЦП, то нужен именно режим снижения шумов АЦП. Но у товарища тахометр. Я честно сказать не понял как именно он меряет свои данные. Если таймер в режиме захвата, то от его прерывания контроллер не проснется. Если сигнал висит на INT, то все нормально. В этом режиме сна, если верить даташиту, прерывания только от асинхронного таймера, синхронный не канает. А асинхронный там только 2-й при работе от внешнего такта на TOSC.
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 16:35:15
vdavid
Не, синхронный остановить тоже не удастся. Чем тогда измерять время между прерываниями от таходатчика? Но остановка процессора при работающих таймерах тоже существенно снижает "болтанку" в показаниях АЦП. Убедился на практике.
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 16:39:01
eess9
При чем тут остановить? Таймер будет считать, прерывание от него контроллер не разбудит только...
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 17:06:56
vdavid
eess9 писал(а):При чем тут остановить? Таймер будет считать, прерывание от него контроллер не разбудит только...
От внешнего тактирования - да. Ибо написано:
This sleep mode basically halts clkI/O, clkCPU, and clkFLASH, while allowing the
other clocks to run.
Но мы же говорили о синхронном режиме, не?
И прерывания от работающего таймера тоже будут работать. Поскольку:
only an External Reset, a Watchdog Reset, a Brown-out
Reset, a Two-wire Serial Interface Address Match Interrupt, a Timer/Counter2 interrupt, an
SPM/EEPROM ready interrupt, an External level interrupt on INT0 or INT1, or an external interrupt
on INT2 can wake up the MCU from ADC Noise Reduction mode.
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 17:41:59
eess9
Я заглянул в даташит и понял о чем вы. a Timer/Counter2 interrupt
А таймеры 0 и 1 не разбудят. Очень смахивает на то, что имеется ввиду асинхронный режим таймера 2. В книге Евстигнеева "Микроконтроллеры AVR семейства mega" так прямо и сказано "асинхронный таймер". А в даташите очень похоже, что инженеры Atmel просто упустили из виду этот момент. Иначе как объяснить что 0 и 1-й не будят, а 2-й будит (при условии что все таймеры синхронные)?
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 18:08:15
ARV
kelod писал(а):нефига он у вас не работает
это у вас он не работает, а у меня наоборот, работает... еще с давних пор:
http://radiokot.ru/circuit/digital/measure/09/
в аккурат 3 измерительных канала...
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 18:17:21
vdavid
ARV, внимательно посмотрите на Ваш код.
while (ADCSRA & (1<<ADEN)); - вечный цикл, поскольку ADEN сам по себе не изменится. Если считаете иначе - приведите цитату из даташита.
eess9 Второй таймер может работать как в синхронном, так и в асинхронном режиме. В отличие от нулевого и первого. Timer0/Timer1 останавливаются автоматически при отключении clkI/O, поскольку тактироваться могут только от него. А раз остановлены, то и прерываний, естественно, не будет.
Re: три вольтметра на одной меге16
Добавлено: Пн сен 29, 2014 18:50:51
ARV
дотошный какой

ну опечатался, перепутал ADSC и ADEN... прямо уж и опечататься нельзя?!