Идея свести расчет среднеквадратичного значения 10ти разрядного АЦП к результату, хранящемуся в переменной типа int, затем ее побайтно отправить через UART. Для этого пытался взять адрес на нужный мне байт через указатель. Получается передавать только значения нижнего регистра ADCL. Значения верхнего регистра принимают нулевые значения. Приложил исходник и картину в протеусе, по идеи должен выводить 03ff (1023), так как ползунок вверху. Вообще при перемещении ползунка значения нижнего регистра принимают верные значения. Подскажите, как наиболее правильно реализовывать такую задачу? Или выгоднее поступить кардинально иначе?
Заголовок сообщения: Re: Передача int побайтно по UART
Добавлено: Вс янв 07, 2018 10:18:04
Модератор
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
У Вас ukazatel - указатель на int, а значит "ukazatel + 1" - это адрес, равный ukazatel + sizeof(int). Если Вы вытаскиваете байты из памяти, то и указатель должен быть на байтовый тип.
Добавлено after 3 minutes 27 seconds: Чтобы не путаться, лучше сделайте всё через union.
Заголовок сообщения: Re: Передача int побайтно по UART
Добавлено: Вс янв 07, 2018 15:52:17
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Оптимизатор с ними справится, я думаю. А вот использование ADCH и ADCL реально увеличивает код. Лучше сразу 16битную переменную ADC использовать, не нужны избыточные преобразования 8 битных переменных в 16 битную.
Добавлено after 4 minutes 27 seconds: Судя по закоментаренному коду, предполагается передавать среднеквадратичное значения, расчет которого и передача, скорее всего, не стоит делать в прерывании. Но это наверное наброски кода.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
имея l_adc и h_adc, которые можно напрямую выдать в UART, к чему плодить лишние сущности типа указателя?
Нужно по UART передать среднеквадратичное значение АЦП как корень квадратный из суммы квадратов измерений, отнесенной к количеству измерений s=sqr((x1^2+x2^2+...xn^2)/n), так вот чтобы найти сумму квадратов - планирую использовать переменную типа long int, количество измерений думаю взять 20ть, а следовательно чтобы уместить значение под корнем, а это по максимуму 1023^1023*20=1046529=0хFF801, т.е. 3и байта. Затем извлекаем корень и делим на 20ть(кол-во измерений). А уже отсюда посылать побайтно разбитую переменную по UART
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Сделал как вы написали, нижний байт передается правильно, а в верхнем при перемещении потонцеометра от земли выше 13% возникакт ошибка, вместо положенного в нем нуля появляется значение FF., далее эта ошибка повторяется пока ползунок резистора не дайдет до 25% от земли, после значения и верхнего и нижнего регистра вновь принимают верные значения
нижний байт передается правильно, а в верхнем при перемещении потонцеометра от земли выше 13% возникакт ошибка
Во-первых, чтобы не было ЛИШНИХ проблем, используйте ADC вместо пары ADCL и ADCH - для вас же сделали ОДНУ переменную... во-вторых, просто не представляю, как мой код из двух абсолютно прозрачных строк может работать не правильно... разбирайтесь, что у вас ЕЩЕ не так...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
выше 13% возникакт ошибка, вместо положенного в нем нуля появляется значение FF., далее эта ошибка повторяется пока ползунок резистора не дайдет до 25% от земли, после значения и верхнего и нижнего регистра вновь принимают верные значения
Похоже на переполнение при вычислениях. Следите за размерностью промежуточных результатов.
Заголовок сообщения: Re: Передача int побайтно по UART
Добавлено: Пн янв 08, 2018 16:40:19
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Нужно посмотреть как АЦП инициализировано. Кроме того, DenChik87, ну кто же Вам мешает, зачем то введенным переменным l_adc и h_adc, присвоить проблемные значения и посмотреть как передаются данные, сразу станет понятно в какой половине кода копать. Аналогичным образом затем поступите с другими участками исходного кода и постепенно локализуется проблема да больного(ых) места (мест).
Добавлено after 5 minutes 22 seconds:
DenChik87 писал(а):
Затем извлекаем корень и делим на 20ть(кол-во измерений).
Наверное это просто опечатка, но операция извлекания корня должна делаться последней.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
...или как подсказывают 16-ти битнное ADC - чем не устраивают?
Я не знал, что регистровю пару можно назвать ADC и работать с ней как с двухбайтной. Если использовать ADC, то с ней все работает. Когда в первый раз подсказал ARV я не сообразил что он имел в виду, видимо со второго раза лучше доходит
а вообще h_adc, l_adc - лишние, уже же имеются ADCH и ADCL...
Да получается l_adc и h_adc лишние. Но так как я не знал, что можно все так ловко с ADC сделать, делал, через как не надо. А когда не выгружал в l_adc и h_adc, а вместо них писал ADCH и ADCL, то тогда значения в терминал выводятся правильно, но только один раз, будто следующее прерывание не выполнялось, или не обновлялись регистры ADCH/ADCL
И как писал viiv - в варианте с l_adc и h_adc нужно указать тип unsigned и все заработало верно. Был бы счастлив если еще проясните, почему нужно задать unsigned, ведь по умолчанию char и так должен быть беззнаковй?
Последний раз редактировалось DenChik87 Вт янв 09, 2018 19:01:46, всего редактировалось 2 раз(а).
а вместо них писал ADCH и ADCL, то тогда значения в терминал выводятся правильно, но только один раз, будто следующее прерывание не выполнялось, или не обновлялись регистры ADCH/ADCL
Просто еще какую-то ошибку придумали.
DenChik87 писал(а):
Был бы счастлив если еще проясните, почему нужно задать unsigned, ведь по умолчанию char и так должен быть беззнаковй?
Знаковый или беззнаковый будет на совести того или иного компилятора (это только для char), но скорее всего будет знаковый.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
почему нужно задать unsigned, ведь по умолчанию char и так должен быть беззнаковй?
В общем случае, это неверно. например, в gcc при взмахе волшебной палочки указании соответствующей опции компилятору - char может быть как знаковым, так и беззнаковым (-funsigned-char)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения