Хочу построить вольтметр на две входные точки. Одну вывести на экран, вторую использовать в дальнейшем. Меняю в программе (на Си) (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 Спасибою
не так, во-первых, оформлен код - надо использовать тег Code а во-вторых, вы внимательно посмотрите на процитированный участок: вы на самом деле понимаете, что тут делается? ответьте на следующие вопросы: 1. почему здесь есть ЗАПЯТЫЕ? какую роль они выполняют? 2. что происходит при выполнении этого кода: (1<<ADPS0)? 3. сколько раз вы читали даташит на МК, чтобы разобраться с АЦП?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
Любая разработка начинается с чтения документации и изучения доступных средств разработки. Данный материал целиком посвящен средствам разработки, включая детальные инструкции по запуску вашего первого приложения на BlueNRG-LP. Описана работа с отладкой STEVAL-IDB011V1, набором инструментов и пакетом ПО позволяющим разработчику быстро войти в курс дела.
Что привлекает в SiC по сравнению с кремнием, и какие особенности делают компоненты SiC часто используемыми, несмотря на более высокую стоимость в сравнении с кремниевыми высоковольтными устройствами? – Объясняет специалист ведущего разработчика силовых приборов из карбида кремния, компании Infineon.
Нет, это 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) - подобный стиль минимизирует ошибки, можно ведь и забыть приоритетность выполнения
Компилятор не может забыть приоритетность выполнения операций.
так компилятор и не ошибается, не надо за ним следить. следить надо за человеком - он ошибается. и забывает приоритеты...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
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 раз.
запятые могут являться разделителями лишь операндов, то есть параметров, передаваемых в функцию
нет, это ложное утверждение. запятая - законный разделитель списка в Си, и вполне может использоваться между отдельными операторами, что наиболее часто можно видеть в операторе for:
Код:
for(i=10, j=0; i != j; i++, j--)
как видите, тут есть и запятые, и точки с запятой, и все при этом правильно написано.
Valer5 писал(а):
а запятые являются разделителямим.
именно поэтому я свой вопрос и задал: вы ЗНАЕТЕ разницу между разделителем-запятой и раделителем точка-с-запятой? или вам монопенисуально всё?
Valer5 писал(а):
Замена выражения (1<<ADPS0) на ADMUX |= (1<<ADPS0) то же не привела к успеху
методом подбора задачу, вероятно, решить и можно, но навык решать задачи такой метод не вырабатывает. вы не ответили на мой вопрос: что делает то, то было написано ранее? а теперь я добавлю еще один вопрос: что делает то, что вы попробовали сделать сейчас?
Valer5 писал(а):
С даташитом сложнее, инглишом не владею, а переводчики такое переводят, что и не поймешь
и каким же образом вы учитесь писать программы для микроконтроллера? наугад ставя то одно, то другое, что где-то когда-то увидели? или все-таки какие-то источники читаете?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
Valer5 Это правильно: в одном посте (17.12 12:33 ) повторить 3 раза одно и то же. Чтоб крепче дошло' . И english учить не надо, и ДШ читать. Пусть они клепают "интуитивно понятные" микроконтроллеры, а что не понятно - на русском объясняют. Буржуи проклятые...
запятая - законный разделитель списка в Си, и вполне может использоваться между отдельными операторами, что наиболее часто можно видеть в операторе for: Код: for(i=10, j=0; i != j; i++, j--) как видите, тут есть и запятые, и точки с запятой, и все при этом правильно написано.
Да. Но не могу не заметить, что тут операторы являются операндами функции цикла, и скобки круглые, о чём я и говорил
Но не могу не заметить, что тут операторы являются операндами функции цикла
цикл - это не функция, а оператор. и списки операторов можно делать в любом месте программы, в том числе и в фигурных скобках, и даже квадратных. например, можно делать так:
Код:
x = y, z;
не спрашивайте меня, для чего так делать
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
Замена выражения (1<<ADPS0) на ADMUX |= (1<<ADPS0) то же не привела к успеху.
А вы упорный. Подозреваю, что хотите оцифровать 0 канал, но номер канала все-равно указываете 1. Идентификаторы ADPSx вообще относятся к делителю тактовой частоты АЦП.
ARV, да, верно. хороший пример, хоть и нелогичный ) Но предпочту всё равно придерживаться своего варианта - так проще избежать ошибок. Например, совершенно не уверен, что разделение операторов запятой с одновременным переносом строки везде будет восприниматься нормально. Предложенный корректный вариант x = y, z; компилятор Cosmic посчитал как x = y, проигнорировав z, если у и z константы, и сделал два присваивания по очереди, если переменные. А ведь существует множество примеров, где чтение флага выполняется без присваивания. И получается, что такое вольное обращение содержит потенциальную ошибку. Например, x = y, UIF; по логике, что операторы можно разделять запятой отработает совершенно не так, как x=y; UIF; Но, моё предыдущее сообщение всё равно получается в теории некорректным, и чтобы не разносить неверную информацию, исправлю. ARV, спасибо.
И получается, что такое вольное обращение содержит потенциальную ошибку.
потенциальную ошибку содержит любой код, поведение которого программист не до конца понимает. именно об этом я топикстартеру и пытался намекнуть: ставить запятую, не понимая, как она действует - плохо.
BlackKilkennyCat писал(а):
вариант x = y, z; компилятор Cosmic посчитал как x = y, проигнорировав z, если у и z константы, и сделал два присваивания по очереди, если переменные.
с моей точки зрения, компилятор облажался, ибо по стандарту результатом всегда должно быть значение y, т.к. оператор = имеет более высокий приоритет, чем запятая.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: misir, slav0n и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения