baghear, если вы не понимаете как оно должно работать, то как вы разберётесь в том что вам могут написать? К тому же процедура будет зависеть от схемы (от подключения АЦП к МК). Ну напишут вам код - будете просить объяснить как он работает? Можете не отвечать. Это, практически, риторический вопрос. Если хотите, чтобы написали код за вас - это в другую тему.
А если по делу, то вам надо ознакомиться с битовыми операциями и сдвигами в Си. Можете поискать программную реализацию SPI. Думаю, это то что вы ищите. Если разберётесь как она работает, то и со считыванием с вашего АЦП разберётесь.
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
int main() { ... DDR_ADC |= ADC_CLK; // Этот пин МК будет выходом (организовывать тактирование с периодом, например, 10 мкс) DDR_ADC &= ~ADC_PIN; // Этот пин МК будет входом (принимать данные с выхода АЦП) ... }
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678.
все числовые константы, если явно не указан их тип, имеют размерность int. поэтому даже число 0x23498579834759823476982347982347 все равно будет типа int.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678.
А точнее - константы 0x0000FFFF...
ARV писал(а):
все числовые константы, если явно не указан их тип, имеют размерность int. поэтому даже число 0x23498579834759823476982347982347 все равно будет типа int.
Интересно, а чем продиктован такой подход? Логично же что если константа разрядностью больше 16 бит, то компиль мог бы сформировать 32-х битное число...
варнинги при компиляции прочтите - будет видно, в каком месте трабл.
берем константу 0x0000FFFF, которая воспринимается как 0xFFFF (int - мы же о таком int говорим?) и пробуем сдвинуть ее на 16 разрядов... получаем 0. это проблема в первом образце кода. AND с 0 даст 0, и плевать на первую константу (в присваивании), хотя и там она int.
во втором примере суффиксом UL вы указали, что константа 32-битная, поэтому проблемы и нет
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
раз переменная temp - 32-х разрядная, то и константа подтягивается автоматом к 32-м разрядам (та скать - автоматическое приведение типа) и результат нормальный...
В этом случае -
Код:
uint32_t var = 0x12345678; UartTransmitHexLong (var & (0x0000ffff << 16));
сначала вычисление происходит со сдвигом константы, а она как выяснилось по умолчанию 16-ти разрядная... указатель сдвига тоже обычный, следовательно никакого приведения к 32-м разрядам не происходит... и мы благополучно теряем FFFF... остается чистый 16-ти разрядный нолик... Потом уже вычисляется &, и естественно правый 16-ти разрядный нолик приводится к 32-м разрядам... но вот незадача, сколько нолик не приводи, он так и остается ноликом ))) В итоге - то что имеем...
PS. Ой... пока писал, ARV уже практически все объяснил...
PPS. Хотя... внимательнее ваше объяснение почитал, помоему у меня более правдоподобно ...
все числовые константы, если явно не указан их тип, имеют размерность int. поэтому даже число 0x23498579834759823476982347982347 все равно будет типа int.
Пункт стандарта 3.1.3.2 (кусочек):
Код:
Значение десятичной константы вычисляется по основанию 10, значение восьмеричной константы вычисляется по основанию 8, а шестнадцатеричной константы - по основанию 16. Лексически пер- вая цифра является старшей цифрой значения. Типом целой константы будет первый из перечисленных ниже типов, в котором может быть представлено ее значение. Бессуф- фиксные десятичные: int, long int, unsigned long int; бессуф- фиксные восьмеричные или шестнадцатеричные: int, unsigned int, long int, unsigned long int; константы с беззнаковым суффик- сом: unsigned int, unsigned long int; константы с суффиксом размера: long int, unsigned long int; константы с разными суф- фиксами: unsigned long int.
0x12345678 - это 32-х разрядная константа. Для avr-gcc её тип signed long. Если написать 0xdeadbeaf - то unsigned long на этом же компиляторе. На arm-none-eabi-gcc её тип signed int, для второй unsigned int.
uint32_t var = 0x12345678; UartTransmitHexLong (var & (0x0000ffff << 16));
дает результат 0x00000000 ? Т.е. константа 0x0000ffff трактуется как 16-ти разрядная... (о... чет подумалось... может не представление числа а его значение играет роль, скольки разрядным оно будет... т.е. в данном случае 0x0000ffff помещается в 16 разрядов, поэтому и назначается 16-ти разрядным... не?)
т.к. тут константа 0x000fffff превышает 16 разрядов, соответственно константе назначается 32 разряда...
Вроде разобрались, всем спасибо ... В общем, если нужно гарантированно обеспечить 32 разряда константе, лучше это указать явно или так UL или так (uint32_t)...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения