три вольтметра на одной меге16

Обсуждаем контроллеры компании Atmel.
Ответить
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение 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);
не фига не заработало опять :)))

потом тупо присвоил

Код: Выделить всё

ADMUX=0b11000000;
ADCSRA |= (1 << ADSC);
и о чудо всё запустилось :solder:

что же касается прерываний, то я не задумывал ждать каждую итерацию, задумывалось выводить на дисплей сохранённые значения, по мере изменения, я же там частоту, скорость, две температуры, дублирую частоту в виде шкалы светиков и ещё кучу всего по мелочи делаю, если каждый раз ждать выполнения чего либо, то данные актуальность будут терять
Реклама
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение 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
Реклама
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

-
Последний раз редактировалось vdavid Пн сен 29, 2014 18:10:29, всего редактировалось 1 раз.
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

она зато соответствует третей ножке, а на комментарии не обращайте внимания, это я очепятался :oops:
и кстати в сон тоже не особо уйдёшь,с тахометра сигналы постоянно идут

и раз уж зашло дело о силе веры, объясните мне обязательно ли нужно обнулять и снова объявлять ADEN у меня вроде нормально заработало даже его не трогая
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

kelod писал(а):кстати в сон тоже не особо уйдёшь,с тахометра сигналы постоянно идут
Не всякий сон останавливает таймеры :) . Так что можно.
Реклама
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

ну так и прерывания генерируются, как только имспульс пришёл, потом считаем время между пришедшим и предидущим, когда спать то ?
Реклама
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

kelod писал(а): и раз уж зашло дело о силе веры, объясните мне обязательно ли нужно обнулять и снова объявлять ADEN у меня вроде нормально заработало даже его не трогая
Совершенно не обязательно.
И да, код

Код: Выделить всё

ADMUX &=~ (1 << MUX3)|(1 << MUX2)|(1 << MUX1)|(1 << MUX0)
должен выглядеть вот так:

Код: Выделить всё

ADMUX &=~ ((1 << MUX3)|(1 << MUX2)|(1 << MUX1)|(1 << MUX0))
Поскольку унарная операция "~" имеет более высокий приоритет, чем "или", то будет применена только к (1 << MUX3) когда нет скобок.
Последний раз редактировалось vdavid Пн сен 29, 2014 15:21:10, всего редактировалось 1 раз.
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

kelod писал(а):ну так и прерывания генерируются, как только имспульс пришёл, потом считаем время между пришедшим и предидущим, когда спать то ?
Это если тахометр медленный. А ведь можно подать импульсы с него на T0 или T1 и по прерыванию от времязадающего таймера смотреть сколько их накопилось за фиксированный отрезок времени. Т.е. измерять именно частоту, а не период.
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

это конечно замечательно, частота измеряется более точно,но появляется такая неприятная вещь как период в течении которого будут накапливаться эти импульсы, например если учесть обороты холостого хода 1000 об/мин, получим 16 об/с , если учесть что распредвал делает 1 оборот за 2 оборота коленвала, получает уже 8 имп/с, за полсекунды насчитает всего 4, а раз в пол секунды это заметная задержка, да и погрешность измерения накладывается и за эти же пол секунды может набраться не 4 импульса, а допустим четыре с половиной или почти пять, поэтому измерять именно время между импульсами в данном случае лучше и точнее, да и погрешности появляются в данном случае на высоких частотах, которые там не так существенны
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

Ну так снимать данные с шестерни. У ней зубьев ой как много... А если серьезно, то при низкой частоте импульсов с тахометра - спать не переспать. В Вашем случае - 8 импульсов в секунду - это 125 мс. За это время можно сделать 1500 преобразований АЦП во free running.
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

У вас батарейное питание? Если нет, то просто не усложняйте себе жизнь.
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

Чем меньше молотит процессор/периферия, тем точнее преобразования АЦП за счет уменьшения шумов. Тут резон именно в этом.
Последний раз редактировалось vdavid Пн сен 29, 2014 18:13:03, всего редактировалось 1 раз.
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Тут есть вопросы. Если спать именно для АЦП, то нужен именно режим снижения шумов АЦП. Но у товарища тахометр. Я честно сказать не понял как именно он меряет свои данные. Если таймер в режиме захвата, то от его прерывания контроллер не проснется. Если сигнал висит на INT, то все нормально. В этом режиме сна, если верить даташиту, прерывания только от асинхронного таймера, синхронный не канает. А асинхронный там только 2-й при работе от внешнего такта на TOSC.
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

Не, синхронный остановить тоже не удастся. Чем тогда измерять время между прерываниями от таходатчика? Но остановка процессора при работающих таймерах тоже существенно снижает "болтанку" в показаниях АЦП. Убедился на практике.
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

При чем тут остановить? Таймер будет считать, прерывание от него контроллер не разбудит только...
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение 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.
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Я заглянул в даташит и понял о чем вы. a Timer/Counter2 interrupt
А таймеры 0 и 1 не разбудят. Очень смахивает на то, что имеется ввиду асинхронный режим таймера 2. В книге Евстигнеева "Микроконтроллеры AVR семейства mega" так прямо и сказано "асинхронный таймер". А в даташите очень похоже, что инженеры Atmel просто упустили из виду этот момент. Иначе как объяснить что 0 и 1-й не будят, а 2-й будит (при условии что все таймеры синхронные)?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

kelod писал(а):нефига он у вас не работает
это у вас он не работает, а у меня наоборот, работает... еще с давних пор: http://radiokot.ru/circuit/digital/measure/09/
в аккурат 3 измерительных канала...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

ARV, внимательно посмотрите на Ваш код.
while (ADCSRA & (1<<ADEN)); - вечный цикл, поскольку ADEN сам по себе не изменится. Если считаете иначе - приведите цитату из даташита.

eess9 Второй таймер может работать как в синхронном, так и в асинхронном режиме. В отличие от нулевого и первого. Timer0/Timer1 останавливаются автоматически при отключении clkI/O, поскольку тактироваться могут только от него. А раз остановлены, то и прерываний, естественно, не будет.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

дотошный какой :) ну опечатался, перепутал ADSC и ADEN... прямо уж и опечататься нельзя?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «AVR»