Например TDA7294

Форум РадиоКот • Просмотр темы - Не могу переключать каналы ADC при измерении.
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Ср май 12, 2021 20:57:58

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Вт дек 15, 2020 17:06:32 
Родился

Зарегистрирован: Чт фев 21, 2013 20:31:33
Сообщений: 11
Рейтинг сообщения: 0
Хочу построить вольтметр на две входные точки. Одну вывести на экран, вторую использовать в дальнейшем. Меняю в программе (на Си) (1<<ADPS0) и (1<<ADPS1), но каналы не переключаются.
Кусок программы:
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data=0;// Read the AD conversion result


adc_data+=ADCW;
// Place your code here
if (adc_counter % 2==0){
adc_buffer1+=adc_data,
adc_counter1++,
(1<<ADPS0);
}
else {adc_buffer2+=adc_data,adc_counter2++,
(0<<ADPS0);}
adc_counter++;
adc_buffer+=adc_data;
ADCSRA |=(1<<ADSC)

Кто подскажет, что не так?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Вт дек 15, 2020 23:40:38 
Вымогатель припоя

Карма: -1
Рейтинг сообщений: -43
Зарегистрирован: Сб окт 22, 2016 17:33:32
Сообщений: 533
Рейтинг сообщения: 0
Код:
#define myADCchannel1 1
#define myADCchannel2 5
#define nChannels     2
#define myADCtemper  0b1000
#define myADC1DOT1V  0b1110
#define myADCGND     0b1111

volatile uint32_t adc_buffer, adc_buffer1, adc_buffer2;
volatile uint16_t adc_counter, adc_counter1, adc_counter2;

ISR(ADC_vect)
{
  uint16_t adc_data = ADCW;
  // Place your code here
  ADMUX &= 0xf0;
  switch(adc_counter % nChannels){
  case 0: // channel1
    adc_buffer1 += adc_data;
    ++adc_counter1;
    ADMUX |= myADCchannel2; // next ch
    break;
  case 1: // channel2
  default:
    adc_buffer2 += adc_data;
    ++adc_counter2;
    ADMUX |= myADCchannel1; // next ch
    break;
  }
  adc_buffer += adc_data;
  ++adc_counter;
}


Вернуться наверх
 

JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/cwc

Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Ср дек 16, 2020 18:20:15 
Родился

Зарегистрирован: Чт фев 21, 2013 20:31:33
Сообщений: 11
Рейтинг сообщения: 0
Карбофос,
Карбофос, спасибо за помощь, но это, наверно, на Си++.
Я пока учусь на Си. Можно ли эту запись воткнуть на CVAvr?
Воткнул в прерывание по ADCб но он, так же как и я, терминов не понимает.
Можно спросить, что такое:
#define myADCchannel1 1
#define myADCchannel2 5
#define nChannels 2
#define myADCtemper 0b1000
#define myADC1DOT1V 0b1110
#define myADCGND 0b1111
Спасибою


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Ср дек 16, 2020 18:29:50 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1853
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 15842
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Код:
adc_buffer1+=adc_data,
 adc_counter1++,
 (1<<ADPS0);

Кто подскажет, что не так?
не так, во-первых, оформлен код - надо использовать тег Code
а во-вторых, вы внимательно посмотрите на процитированный участок: вы на самом деле понимаете, что тут делается?
ответьте на следующие вопросы:
1. почему здесь есть ЗАПЯТЫЕ? какую роль они выполняют?
2. что происходит при выполнении этого кода: (1<<ADPS0)?
3. сколько раз вы читали даташит на МК, чтобы разобраться с АЦП?

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
удивительно, но при взгляде на многих сверху ничего не меняется...


Вернуться наверх
 
Вебинар «Экосистема MEAN WELL. Решения для любых задач электропитания» (20.05.2021)

Приглашаем 20 мая на вебинар, посвященный линейке поставок компании MEAN WELL и ее подходу к производству источников питания — как экосистемы продукции и услуг, которая позволяет подобрать оптимальный источник питания для любых задач электропитания. Рассмотрим весь спектр выпускаемой продукции MEAN WELL в области AC/DC-, DC/DC- и DC/AC-преобразователей с подробным разбором интересных и уникальных новинок, их применении и многое другое.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Ср дек 16, 2020 18:43:18 
Собутыльник Кота

Карма: 36
Рейтинг сообщений: 801
Зарегистрирован: Ср ноя 29, 2017 06:58:50
Сообщений: 2906
Рейтинг сообщения: 0
#define aaa bbb
говорит компилятору, что везде в программе, где встретится aaa заменить на bbb
для удобства человеков читать.

Добавлено after 10 minutes 6 seconds:
и кстати, написание чисел в двоичном коде типа 0b1000 не есть хорошо.

Добавлено after 2 minutes 52 seconds:
Цитата:
if (adc_counter % 2==0)
тоже не ахти.
if ((adc_counter % 2) == 0) - подобный стиль минимизирует ошибки, можно ведь и забыть приоритетность выполнения


Вернуться наверх
 
Интеллектуальные ключи верхнего плеча семейства PROFET™+2 12V от Infineon

Компания Infineon представила новое семейство защищенных силовых ключей PROFET™+2 12V. Изделия объединяют в себе функции диагностики и различные защиты. Ключи PROFET™+2 12V имеют одно из самых низких в отрасли сопротивлений в открытом состоянии RDS(ON) (от 2,6 мОм) и выпускаются в миниатюрном корпусе TSDSO-14 с шагом выводов 0,65 мм. Благодаря функции ReverseON все семейство соответствует строгим требованиям по защите от обратной полярности питания, впервые реализованной в одном чипе.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Ср дек 16, 2020 19:28:54 
Вымогатель припоя

Карма: -1
Рейтинг сообщений: -43
Зарегистрирован: Сб окт 22, 2016 17:33:32
Сообщений: 533
Рейтинг сообщения: 0
это, наверно, на Си++.
Можно спросить, что такое:

Нет, это GNU AVR toolchain. Входит как в состав Arduino IDE, можно отдельно скачать.
Кстати, в конце функции забыл добавить запуск АЦП
Код:
ADCSRA |= _BV(ADSC);

что тоже-самое, что и
Код:
ADCSRA |=(1<<ADSC);

myADCchannel1 - номер 1-го канала измерения АЦП, пусть будет 1
myADCchannel2 - номер 1-го канала измерения АЦП, пусть будет 5
nChannels - общее кол-во каналов
myADCtemper - номер канала АЦП температурного сенсора
myADC1DOT1V - номер канала АЦП опорного напряжения 1.1 вольт
myADCGND - номер канала АЦП, подключенного к 0 вольт

BlackKilkennyCat писал(а):
написание чисел в двоичном коде типа 0b1000 не есть хорошо.

Эти значения приведены в даташите. Глупо переводить их в какую-то другую систему счисления.

BlackKilkennyCat писал(а):
Цитата:
if (adc_counter % 2==0)
тоже не ахти.
if ((adc_counter % 2) == 0) - подобный стиль минимизирует ошибки, можно ведь и забыть приоритетность выполнения

Компилятор не может забыть приоритетность выполнения операций.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Ср дек 16, 2020 19:32:21 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1853
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 15842
Откуда: Новочеркасск
Рейтинг сообщения: 3
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Карбофос писал(а):
Компилятор не может забыть приоритетность
так компилятор и не ошибается, не надо за ним следить. следить надо за человеком - он ошибается. и забывает приоритеты...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
удивительно, но при взгляде на многих сверху ничего не меняется...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Ср дек 16, 2020 21:59:43 
Собутыльник Кота

Карма: 36
Рейтинг сообщений: 801
Зарегистрирован: Ср ноя 29, 2017 06:58:50
Сообщений: 2906
Рейтинг сообщения: 0
BlackKilkennyCat писал(а):
написание чисел в двоичном коде типа 0b1000 не есть хорошо.

Эти значения приведены в даташите. Глупо переводить их в какую-то другую систему счисления.

Глупо не знать стандартов Си; не предполагать, что не все компиляторы понимают что-то вне стандартов; верить в даташиты без ошибок.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Чт дек 17, 2020 00:33:12 
Родился

Зарегистрирован: Чт фев 21, 2013 20:31:33
Сообщений: 11
Рейтинг сообщения: 0
AVRписал
1. почему здесь есть ЗАПЯТЫЕ? какую роль они выполняют?
2. что происходит при выполнении этого кода: (1<<ADPS0)?
3. сколько раз вы читали даташит на МК, чтобы разобраться с АЦП?

Если Вы посмотрите повнимательнее на мой код, то заметите, что он весь стоит между фигурными скобками, а запятые являются разделителямим.
Замена выражения (1<<ADPS0) на ADMUX |= (1<<ADPS0) то же не привела к успеху.
С даташитом сложнее, инглишом не владею, а переводчики такое переводят, что и не поймешь.

Добавлено after 2 minutes 16 seconds:
AVRписал
1. почему здесь есть ЗАПЯТЫЕ? какую роль они выполняют?
2. что происходит при выполнении этого кода: (1<<ADPS0)?
3. сколько раз вы читали даташит на МК, чтобы разобраться с АЦП?

Если Вы посмотрите повнимательнее на мой код, то заметите, этот участок
стоит между фигурными скобками, а запятые являются разделителямим.
Замена выражения (1<<ADPS0) на ADMUX |= (1<<ADPS0) то же не привела к успеху.
С даташитом сложнее, инглишом не владею, а переводчики такое переводят, что и не поймешь.

Добавлено after 54 seconds:
AVRписал
1. почему здесь есть ЗАПЯТЫЕ? какую роль они выполняют?
2. что происходит при выполнении этого кода: (1<<ADPS0)?
3. сколько раз вы читали даташит на МК, чтобы разобраться с АЦП?

Если Вы посмотрите повнимательнее на мой код, то заметите, этот участок
стоит между фигурными скобками, а запятые являются разделителямим.
Замена выражения (1<<ADPS0) на ADMUX |= (1<<ADPS0) то же не привела к успеху.
С даташитом сложнее, инглишом не владею, а переводчики такое переводят, что и не поймешь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Чт дек 17, 2020 05:19:35 
Собутыльник Кота

Карма: 36
Рейтинг сообщений: 801
Зарегистрирован: Ср ноя 29, 2017 06:58:50
Сообщений: 2906
Рейтинг сообщения: 0
Английский надо учить. Хоть как картинки, какое слово что означает. Не сможете читать даташиты - не сможете программировать микроконтроллеры. Да и не особо-то сложно, прочитали один - считайте, что прочитали почти все. Буквального перевода по накоплении опыта будет требоваться значительно меньше.

Добавлено after 6 minutes 34 seconds:
интересно, с точки зрения русского языка, как всё-таки правильно:
"Разделителем является точка с запятой"
или
"Разделителями являются точка с запятой"?
С одной стороны, это как бы один символ. С другой стороны, их вроде как бы два...


Последний раз редактировалось BlackKilkennyCat Чт дек 17, 2020 16:15:09, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Чт дек 17, 2020 08:17:08 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1853
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 15842
Откуда: Новочеркасск
Рейтинг сообщения: 3
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
BlackKilkennyCat писал(а):
запятые могут являться разделителями лишь операндов, то есть параметров, передаваемых в функцию
нет, это ложное утверждение. запятая - законный разделитель списка в Си, и вполне может использоваться между отдельными операторами, что наиболее часто можно видеть в операторе for:
Код:
for(i=10, j=0; i != j; i++, j--)
как видите, тут есть и запятые, и точки с запятой, и все при этом правильно написано.
Valer5 писал(а):
а запятые являются разделителямим.
именно поэтому я свой вопрос и задал: вы ЗНАЕТЕ разницу между разделителем-запятой и раделителем точка-с-запятой? или вам монопенисуально всё?
Valer5 писал(а):
Замена выражения (1<<ADPS0) на ADMUX |= (1<<ADPS0) то же не привела к успеху
методом подбора задачу, вероятно, решить и можно, но навык решать задачи такой метод не вырабатывает. вы не ответили на мой вопрос: что делает то, то было написано ранее? а теперь я добавлю еще один вопрос: что делает то, что вы попробовали сделать сейчас?
Valer5 писал(а):
С даташитом сложнее, инглишом не владею, а переводчики такое переводят, что и не поймешь
и каким же образом вы учитесь писать программы для микроконтроллера? наугад ставя то одно, то другое, что где-то когда-то увидели? или все-таки какие-то источники читаете?

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
удивительно, но при взгляде на многих сверху ничего не меняется...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Чт дек 17, 2020 11:17:27 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 697
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 4464
Откуда: Minsk
Рейтинг сообщения: 0
Valer5 Это правильно: в одном посте (17.12 12:33 ) повторить 3 раза одно и то же. Чтоб крепче дошло' . И english учить не надо, и ДШ читать. Пусть они клепают "интуитивно понятные" микроконтроллеры, а что не понятно - на русском объясняют. Буржуи проклятые...

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Чт дек 17, 2020 12:47:19 
Собутыльник Кота

Карма: 36
Рейтинг сообщений: 801
Зарегистрирован: Ср ноя 29, 2017 06:58:50
Сообщений: 2906
Рейтинг сообщения: 0
ARV писал(а):
запятая - законный разделитель списка в Си, и вполне может использоваться между отдельными операторами, что наиболее часто можно видеть в операторе for:
Код:
for(i=10, j=0; i != j; i++, j--)
как видите, тут есть и запятые, и точки с запятой, и все при этом правильно написано.

Да. Но не могу не заметить, что тут операторы являются операндами функции цикла, и скобки круглые, о чём я и говорил ;)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Чт дек 17, 2020 13:01:05 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1853
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 15842
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
BlackKilkennyCat писал(а):
Но не могу не заметить, что тут операторы являются операндами функции цикла
цикл - это не функция, а оператор. и списки операторов можно делать в любом месте программы, в том числе и в фигурных скобках, и даже квадратных. например, можно делать так:
Код:
x = y, z;
не спрашивайте меня, для чего так делать :)

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
удивительно, но при взгляде на многих сверху ничего не меняется...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Чт дек 17, 2020 13:14:05 
Вымогатель припоя

Карма: -1
Рейтинг сообщений: -43
Зарегистрирован: Сб окт 22, 2016 17:33:32
Сообщений: 533
Рейтинг сообщения: 0
Замена выражения (1<<ADPS0) на ADMUX |= (1<<ADPS0) то же не привела к успеху.

А вы упорный. Подозреваю, что хотите оцифровать 0 канал, но номер канала все-равно указываете 1.
Идентификаторы ADPSx вообще относятся к делителю тактовой частоты АЦП.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Чт дек 17, 2020 16:14:13 
Собутыльник Кота

Карма: 36
Рейтинг сообщений: 801
Зарегистрирован: Ср ноя 29, 2017 06:58:50
Сообщений: 2906
Рейтинг сообщения: 0
ARV, да, верно. хороший пример, хоть и нелогичный )
Но предпочту всё равно придерживаться своего варианта - так проще избежать ошибок. Например, совершенно не уверен, что разделение операторов запятой с одновременным переносом строки везде будет восприниматься нормально.
Предложенный корректный вариант x = y, z; компилятор Cosmic посчитал как x = y, проигнорировав z, если у и z константы, и сделал два присваивания по очереди, если переменные. А ведь существует множество примеров, где чтение флага выполняется без присваивания. И получается, что такое вольное обращение содержит потенциальную ошибку. Например, x = y, UIF; по логике, что операторы можно разделять запятой отработает совершенно не так, как x=y; UIF;
Но, моё предыдущее сообщение всё равно получается в теории некорректным, и чтобы не разносить неверную информацию, исправлю.
ARV, спасибо.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Чт дек 17, 2020 16:45:28 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1853
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 15842
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
BlackKilkennyCat писал(а):
И получается, что такое вольное обращение содержит потенциальную ошибку.
потенциальную ошибку содержит любой код, поведение которого программист не до конца понимает. именно об этом я топикстартеру и пытался намекнуть: ставить запятую, не понимая, как она действует - плохо.
BlackKilkennyCat писал(а):
вариант x = y, z; компилятор Cosmic посчитал как x = y, проигнорировав z, если у и z константы, и сделал два присваивания по очереди, если переменные.
с моей точки зрения, компилятор облажался, ибо по стандарту результатом всегда должно быть значение y, т.к. оператор = имеет более высокий приоритет, чем запятая.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
удивительно, но при взгляде на многих сверху ничего не меняется...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не могу переключать каналы ADC при измерении.
СообщениеДобавлено: Ср дек 23, 2020 21:39:49 
Родился

Зарегистрирован: Чт фев 21, 2013 20:31:33
Сообщений: 11
Рейтинг сообщения: 0
AVR, СПАСИБО. Именно в ";" и было дело.
Заменил и всё заработало!


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y