Хочу построить вольтметр на две входные точки. Одну вывести на экран, вторую использовать в дальнейшем. Меняю в программе (на Си) (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)
Карбофос,
Карбофос, спасибо за помощь, но это, наверно, на Си++.
Я пока учусь на Си. Можно ли эту запись воткнуть на CVAvr?
Воткнул в прерывание по ADCб но он, так же как и я, терминов не понимает.
Можно спросить, что такое:
#define myADCchannel1 1
#define myADCchannel2 5
#define nChannels 2
#define myADCtemper 0b1000
#define myADC1DOT1V 0b1110
#define myADCGND 0b1111
Спасибою
Кто подскажет, что не так?[/uquote]не так, во-первых, оформлен код - надо использовать тег Code
а во-вторых, вы внимательно посмотрите на процитированный участок: вы на самом деле понимаете, что тут делается?
ответьте на следующие вопросы:
1. почему здесь есть ЗАПЯТЫЕ? какую роль они выполняют?
2. что происходит при выполнении этого кода: (1<<ADPS0)?
3. сколько раз вы читали даташит на МК, чтобы разобраться с АЦП?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
[uquote="Valer5",url="/forum/viewtopic.php?p=3942442#p3942442"]это, наверно, на Си++.
Можно спросить, что такое:[/uquote]
Нет, это GNU AVR toolchain. Входит как в состав Arduino IDE, можно отдельно скачать.
Кстати, в конце функции забыл добавить запуск АЦП
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) - подобный стиль минимизирует ошибки, можно ведь и забыть приоритетность выполнения
Компилятор не может забыть приоритетность выполнения операций.
BlackKilkennyCat писал(а):написание чисел в двоичном коде типа 0b1000 не есть хорошо.
Эти значения приведены в даташите. Глупо переводить их в какую-то другую систему счисления.[/uquote]
Глупо не знать стандартов Си; не предполагать, что не все компиляторы понимают что-то вне стандартов; верить в даташиты без ошибок.
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) то же не привела к успеху.
С даташитом сложнее, инглишом не владею, а переводчики такое переводят, что и не поймешь.
Английский надо учить. Хоть как картинки, какое слово что означает. Не сможете читать даташиты - не сможете программировать микроконтроллеры. Да и не особо-то сложно, прочитали один - считайте, что прочитали почти все. Буквального перевода по накоплении опыта будет требоваться значительно меньше.
Добавлено after 6 minutes 34 seconds:
интересно, с точки зрения русского языка, как всё-таки правильно:
"Разделителем является точка с запятой"
или
"Разделителями являются точка с запятой"?
С одной стороны, это как бы один символ. С другой стороны, их вроде как бы два...
Последний раз редактировалось BlackKilkennyCat Чт дек 17, 2020 16:15:09, всего редактировалось 1 раз.
BlackKilkennyCat писал(а):запятые могут являться разделителями лишь операндов, то есть параметров, передаваемых в функцию
нет, это ложное утверждение. запятая - законный разделитель списка в Си, и вполне может использоваться между отдельными операторами, что наиболее часто можно видеть в операторе for:
как видите, тут есть и запятые, и точки с запятой, и все при этом правильно написано.
Valer5 писал(а):а запятые являются разделителямим.
именно поэтому я свой вопрос и задал: вы ЗНАЕТЕ разницу между разделителем-запятой и раделителем точка-с-запятой? или вам монопенисуально всё?
Valer5 писал(а):Замена выражения (1<<ADPS0) на ADMUX |= (1<<ADPS0) то же не привела к успеху
методом подбора задачу, вероятно, решить и можно, но навык решать задачи такой метод не вырабатывает. вы не ответили на мой вопрос: что делает то, то было написано ранее? а теперь я добавлю еще один вопрос: что делает то, что вы попробовали сделать сейчас?
Valer5 писал(а):С даташитом сложнее, инглишом не владею, а переводчики такое переводят, что и не поймешь
и каким же образом вы учитесь писать программы для микроконтроллера? наугад ставя то одно, то другое, что где-то когда-то увидели? или все-таки какие-то источники читаете?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Valer5 Это правильно: в одном посте (17.12 12:33 ) повторить 3 раза одно и то же. Чтоб крепче дошло' . И english учить не надо, и ДШ читать. Пусть они клепают "интуитивно понятные" микроконтроллеры, а что не понятно - на русском объясняют. Буржуи проклятые...
ARV писал(а):запятая - законный разделитель списка в Си, и вполне может использоваться между отдельными операторами, что наиболее часто можно видеть в операторе for:
Код:
for(i=10, j=0; i != j; i++, j--)
как видите, тут есть и запятые, и точки с запятой, и все при этом правильно написано.
Да. Но не могу не заметить, что тут операторы являются операндами функции цикла, и скобки круглые, о чём я и говорил
BlackKilkennyCat писал(а):Но не могу не заметить, что тут операторы являются операндами функции цикла
цикл - это не функция, а оператор. и списки операторов можно делать в любом месте программы, в том числе и в фигурных скобках, и даже квадратных. например, можно делать так:
[uquote="Valer5",url="/forum/viewtopic.php?p=3942652#p3942652"]Замена выражения (1<<ADPS0) на ADMUX |= (1<<ADPS0) то же не привела к успеху.[/uquote]
А вы упорный. Подозреваю, что хотите оцифровать 0 канал, но номер канала все-равно указываете 1.
Идентификаторы ADPSx вообще относятся к делителю тактовой частоты АЦП.
ARV, да, верно. хороший пример, хоть и нелогичный )
Но предпочту всё равно придерживаться своего варианта - так проще избежать ошибок. Например, совершенно не уверен, что разделение операторов запятой с одновременным переносом строки везде будет восприниматься нормально.
Предложенный корректный вариант x = y, z; компилятор Cosmic посчитал как x = y, проигнорировав z, если у и z константы, и сделал два присваивания по очереди, если переменные. А ведь существует множество примеров, где чтение флага выполняется без присваивания. И получается, что такое вольное обращение содержит потенциальную ошибку. Например, x = y, UIF; по логике, что операторы можно разделять запятой отработает совершенно не так, как x=y; UIF;
Но, моё предыдущее сообщение всё равно получается в теории некорректным, и чтобы не разносить неверную информацию, исправлю. ARV, спасибо.
BlackKilkennyCat писал(а):И получается, что такое вольное обращение содержит потенциальную ошибку.
потенциальную ошибку содержит любой код, поведение которого программист не до конца понимает. именно об этом я топикстартеру и пытался намекнуть: ставить запятую, не понимая, как она действует - плохо.
BlackKilkennyCat писал(а):вариант x = y, z; компилятор Cosmic посчитал как x = y, проигнорировав z, если у и z константы, и сделал два присваивания по очереди, если переменные.
с моей точки зрения, компилятор облажался, ибо по стандарту результатом всегда должно быть значение y, т.к. оператор = имеет более высокий приоритет, чем запятая.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...