можно, конечно, прерывание выбросить. Но оно для того и реализовано в контроллере, чтобы не чесать правой рукой левое ухо. У вас было все изначально правильно, за исключением неправильного инкремента ADMUX. так что городить городушки с заменой прерывания ADC прерыванием таймера, это даже не чесать левое ухо правой рукой, это сродни удалению гланд через анальный проход.
Заголовок сообщения: Re: Несколько каналов АЦП Atmega 88
Добавлено: Чт авг 10, 2017 10:47:38
Мучитель микросхем
Карма: 4
Рейтинг сообщений: 15
Зарегистрирован: Ср янв 26, 2011 13:43:30 Сообщений: 414 Откуда: С того берега моря
Рейтинг сообщения:0
Я одно не пойму. Как щелкать каналами и работать с прерыванием по окончанию измерения канала ясно. А вот как это делать через определенные интервалы времени...
_________________ - Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует!
Я одно не пойму. Как щелкать каналами и работать с прерыванием по окончанию измерения канала ясно. А вот как это делать через определенные интервалы времени...
а вот я не пойму, зачем это делать? В контроллере есть специальное прерывание, которое вызывается по окончанию преобразования. зачем же лепить горбатого к стенке?
Заголовок сообщения: Re: Несколько каналов АЦП Atmega 88
Добавлено: Чт авг 10, 2017 10:53:55
Мучитель микросхем
Карма: 4
Рейтинг сообщений: 15
Зарегистрирован: Ср янв 26, 2011 13:43:30 Сообщений: 414 Откуда: С того берега моря
Рейтинг сообщения:0
Нужен опрос каждого канала по 200 микросекунд.
_________________ - Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует!
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
тогда сделайте прерывание по таймеру и перенесите строку:
Код:
ADCSRA |= ( 1 << ADSC );
из прерывания по окончанию преобразования в прерывание по таймеру. Но тут есть нюансы. Если преобразование длится более, чем 200 мкс, то, разумеется, у вас будут проблемы. Посему, сначала разрешаете только одно прерывание по окончанию преобразования, добавляете туда две строчки и осциллографом замеряете, сколько длится преобразование.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Несколько каналов АЦП Atmega 88
Добавлено: Чт авг 10, 2017 11:17:55
Мучитель микросхем
Карма: 4
Рейтинг сообщений: 15
Зарегистрирован: Ср янв 26, 2011 13:43:30 Сообщений: 414 Откуда: С того берега моря
Рейтинг сообщения:0
Чет так в протеусе не работает
Код:
ISR( TIMER0_OVF_vect ) { // 100 us oveflow // Reinitialize Timer 0 value TCNT0=0x9C; ADCSRA|=(1<<ADSC); //ADCSRA|=0x40 }
ISR (ADC_vect) { //static byte input_index=0; // Read the AD conversion result adc_data[input_index]=ADCW; // Select next ADC input if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) input_index=0; ADMUX=(FIRST_ADC_INPUT % 3)| (ADC_VREF_TYPE+input_index); // Delay needed for the stabilization of the ADC input voltage _delay_us(10); //ADCSRA|=(1<<ADSC); }
_________________ - Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует!
ISR( TIMER0_OVF_vect ) { // 100 us oveflow // Reinitialize Timer 0 value TCNT0=0x9C; ADCSRA|=(1<<ADSC); //ADCSRA|=0x40 }
ISR (ADC_vect) { //static byte input_index=0; // Read the AD conversion result adc_data[input_index]=ADCW; // Select next ADC input if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) input_index=0; ADMUX=(FIRST_ADC_INPUT % 3)| (ADC_VREF_TYPE+input_index); // Delay needed for the stabilization of the ADC input voltage _delay_us(10); //ADCSRA|=(1<<ADSC); }
ADCW, это что за зверь? а вообще, код какой-то непонятный. Я даже и не понял, что он делает
Заголовок сообщения: Re: Несколько каналов АЦП Atmega 88
Добавлено: Чт авг 10, 2017 11:32:49
Мучитель микросхем
Карма: 4
Рейтинг сообщений: 15
Зарегистрирован: Ср янв 26, 2011 13:43:30 Сообщений: 414 Откуда: С того берега моря
Рейтинг сообщения:0
Судя по ДШ в ADCW пишутся оба регистра ADCL и ADCH. А код CV AVR генерирует
_________________ - Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует!
_________________ - Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует!
Заголовок сообщения: Re: Несколько каналов АЦП Atmega 88
Добавлено: Чт авг 10, 2017 12:48:40
Мучитель микросхем
Карма: 4
Рейтинг сообщений: 15
Зарегистрирован: Ср янв 26, 2011 13:43:30 Сообщений: 414 Откуда: С того берега моря
Рейтинг сообщения:0
Ой блин... Забыл. Все - теперь работает!!! Спасибо!
Код:
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
_________________ - Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует!
некоторое снижение случайной ошибки, вот например возьмём 10бит шим (младший разряд шумящий) сложим 2 замера и получим 11бит сигнал, младший шумящий - отсекаем его (/2) и получаем обратно 10бит сигнал, но уже стабильней.
об этом и говорю...)) три выборки АЦП - просто стабильней... но это не убирает шум полностью. Нужно или делать МНОГО выборок (оцифровать входной сигнал), или использовать другой алгоритм, например я часто исмпользую гистерезис, который полностью убирает шум АЦП...
чёто вы замудрили.. куча прерываний... Можно просто делать выборки АЦП через 200 мкс в цикле... Например типа так:
mesto_1: // начало ADMUX=0b01100001; // где 1 - номер канала.. ADCSRA|=0b01000000; // где 1 - старт преобразования... delay_us(200); // ждём 200 мкс... a=ADCW; // записали данные из АЦП в переменную "a" (тип int). goto mesto_1; // конец. Перейти вначало.
... и т.д. Короче крутимся в цикле без прерываний))
Последний раз редактировалось roman.com Чт авг 10, 2017 13:22:39, всего редактировалось 1 раз.
Заголовок сообщения: Re: Несколько каналов АЦП Atmega 88
Добавлено: Чт авг 10, 2017 13:22:05
Мучитель микросхем
Карма: 4
Рейтинг сообщений: 15
Зарегистрирован: Ср янв 26, 2011 13:43:30 Сообщений: 414 Откуда: С того берега моря
Рейтинг сообщения:0
Цитата:
... и т.д. Короче крутимся в цикле без прерываний))
Так не интересно. Такой вариант заработал сразу же. Тем более его генерирует Code Vision =)
_________________ - Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует!
)) не интересно им... Это хорошо если МК кроме оцифровки входного сигнала ничего бельше не делает... А если МК выполняет сложные операции с высокой точностью... В этом случае МК вообще не может отвлекаться на прерывания... я не люблю прерывания.. с ними постоянно головняк..
)) не интересно им... Это хорошо если МК кроме оцифровки входного сигнала ничего бельше не делает... А если МК выполняет сложные операции с высокой точностью... В этом случае МК вообще не может отвлекаться на прерывания...
ну да, конечно, на прерывания отвлекаться нельзя, а вот задержки на 200 мкс делать можно. Вам самим-то не смешно? Если ваш контроллер выполняет много разных задач, то при помощи прерывания обрабатываются самые важные. Для того прерывания и придуманы
a=ADCW/2; if (a>ub+1) {u=a/2; ub=a;}; if (a<ub-1) {u=a/2; ub=a;};
Тут, на выходе 10 разрядного АЦП получаем 8 разрядов данных (или 9 разрядов). Понятно, что разрешающая способность АЦП меньше, но зато последний разряд не шумит)) т.к. урень шума на входе АЦП меньше шага квантования АЦП...
ozonn писал(а):
при помощи прерывания обрабатываются самые важные. Для того прерывания и придуманы
я об этом и говрю..)) у меня самые важные - это аварийное отключение систем ))
ozonn писал(а):
на прерывания отвлекаться нельзя, а вот задержки на 200 мкс делать можно.
задержка - это просто пример, если МК больше ничем не занят, то множно и делей delay_us(200);...
но чаще у меня по другому:
mesto_1: // начало ADMUX=0b01100001; // где 1 - номер канала.. ADCSRA|=0b01000000; // где 1 - старт преобразования...
delay_us(200); // ждём 200 мкс... Пока идет преобразование АЦП, МК выполняет полезную работу, без отрыва на прерывание. ))
a=ADCW; // по окончании выполнения полезной работы, записали данные из АЦП в переменную "a" (тип int). goto mesto_1; // конец. Перейти вначало.
a=ADCW/2; if (a>ub+1) {u=a/2; ub=a;}; if (a<ub-1) {u=a/2; ub=a;};
честно говоря не понял. сначала делим результат измерения на 2, потом, независимо от того, больше ли это частное чем предыдущее частное плюс один или оно меньше, чем предыдущее частное минус один, выполняем одно и то же действие, а именно, еще раз делим результат на два. Т.е. получаем результат в четыре раза меньше измеренного. В чем тут фокус?
Пока идет преобразование АЦП, МК выполняет полезную работу, без отрыва на прерывание. ))
да, именно так и организавна программа с использованием прерывания. Пока идет преобразование, контроллер выполняет другую задачу, а как только преобразование завершилось, приступает к его обработке. И чем вам это не нравится?
Тут, на выходе 10 разрядного АЦП получаем 8 разрядов данных (или 9 разрядов). Понятно, что разрешающая способность АЦП меньше, но зато последний разряд не шумит))
чтобы получать 8 разрядов с нешумящими (хотя это самообман) разрядами, специально придуман режим "выравнивания влево" (бит ADLAR) - включите его и пользуйтесь ADCH в качестве результата - к чему какие-то загадочные вычисления, гистерезисы и т.п.?
но повторяю еще раз: это самообман. кто вам мешает в 10-битном результате всегда тупо давить младший бит в 0? и не будет он шуметь...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения