Например TDA7294

Форум РадиоКот • Просмотр темы - Вопросы по С/С++ (СИ)
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт июл 18, 2025 11:45:26

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


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



Начать новую тему Ответить на тему  [ Сообщений: 7669 ]     ... , , , 201, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Ср сен 10, 2014 20:21:32 
Мудрый кот
Аватар пользователя

Карма: 24
Рейтинг сообщений: 286
Зарегистрирован: Чт июн 10, 2010 08:55:35
Сообщений: 1810
Откуда: Сибирские Афины
Рейтинг сообщения: 0
baghear, если вы не понимаете как оно должно работать, то как вы разберётесь в том что вам могут написать? К тому же процедура будет зависеть от схемы (от подключения АЦП к МК). Ну напишут вам код - будете просить объяснить как он работает? Можете не отвечать. Это, практически, риторический вопрос. :)
Если хотите, чтобы написали код за вас - это в другую тему.

А если по делу, то вам надо ознакомиться с битовыми операциями и сдвигами в Си.
Можете поискать программную реализацию SPI. Думаю, это то что вы ищите. Если разберётесь как она работает, то и со считыванием с вашего АЦП разберётесь.

_________________
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Ср сен 10, 2014 20:48:26 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4884
Откуда: Минск
Рейтинг сообщения: 0
baghear писал(а):
Приведите пожалуйста пример кода на си.
Принип приблизительно такой, тонкости по ситуации:
Спойлер
Код:
#define DDR_ADC  DDRD
#define PIN_ADC  PIND
#define PORT_ADC PORTD

#define ADC_PIN  (1<<PD2) // Последовательный выход АЦП
#define ADC_CLK  (1<<PD1) // Вывод тактирования АЦП

int main() {
...
   DDR_ADC |= ADC_CLK;  // Этот пин МК будет выходом (организовывать тактирование с периодом, например, 10 мкс)
   DDR_ADC &= ~ADC_PIN; // Этот пин МК будет входом (принимать данные с выхода АЦП)
...
}


uint32_t adcResult()
{
   uint8_t i;
   uint32_t adcValue = 0;

   for (i = 0; i < 24; i++) {
      _delay_us(5);
      PORT_ADC |= ADC_CLK;
      
      if (PIN_ADC & ADC_PIN) {
         adcValue |= 0x01;
      }

      if (i != 23)
         adcValue <<= 1;

      _delay_us(5);
      PORT_ADC &= ~ADC_CLK;
   }

   return adcResult;
}


Последний раз редактировалось WiseLord Чт сен 11, 2014 08:47:50, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Ср сен 10, 2014 22:02:11 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 48
Зарегистрирован: Вт июн 17, 2014 00:34:26
Сообщений: 791
Рейтинг сообщения: 0
Спасибо большое!!!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 16:02:55 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Недавно опять у меня ступор был с этими странными стандартами Си...


Долго не мог понять почему не работает одна функция, вроде перепроверял, все должно быть ОК...
Потом разобрался, оказывается следующий вариант -
Код:
uint32_t var = 0x12345678;
UartTransmitHexLong (var & (0x0000ffff << 16));
Дает в результате 0x00000000... хотя логично было получить 0x12340000...


А вот такой вариант -
Код:
uint32_t var = 0x12345678;
UartTransmitHexLong (var & (0xffffUL << 16));
Дает нормальные 0x12340000...


Почему в первом случае компиль не понимает 0x0000ffff как UL ?.... я же ему явно задаю количество знаков.....


Вернуться наверх
 
Выбираем индустриальные и медицинские источники питания MEAN WELL в открытом исполнении

Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 17:09:22 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678.

все числовые константы, если явно не указан их тип, имеют размерность int. поэтому даже число 0x23498579834759823476982347982347 все равно будет типа int.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 17:22:02 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
ARV писал(а):
в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678.
А точнее - константы 0x0000FFFF...

ARV писал(а):
все числовые константы, если явно не указан их тип, имеют размерность int. поэтому даже число 0x23498579834759823476982347982347 все равно будет типа int.
Интересно, а чем продиктован такой подход?
Логично же что если константа разрядностью больше 16 бит, то компиль мог бы сформировать 32-х битное число...


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 17:30:59 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
ARV писал(а):
в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678.
Ан нет... именно в случае со сдвигом проблема проявляется...

Вот так делаю - нормально получается - 0x12340000...
Код:
uint32_t temp = 0x12345678;
UartTransmitHexLong (temp & 0xffff0000);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 17:35:25 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
варнинги при компиляции прочтите - будет видно, в каком месте трабл.

берем константу 0x0000FFFF, которая воспринимается как 0xFFFF (int - мы же о таком int говорим?) и пробуем сдвинуть ее на 16 разрядов... получаем 0. это проблема в первом образце кода. AND с 0 даст 0, и плевать на первую константу (в присваивании), хотя и там она int.

во втором примере суффиксом UL вы указали, что константа 32-битная, поэтому проблемы и нет

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

Мой уютный бложик... заходите!


Последний раз редактировалось ARV Пн сен 15, 2014 17:38:36, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 17:36:31 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4565
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
ARV писал(а):
в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678
ARV, Вы, видимо, поторопились с ответом. Необдуманно... :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 17:39:40 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Аlex писал(а):
ARV писал(а):
в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678
ARV, Вы, видимо, поторопились с ответом. Необдуманно... :)

частично - согласен, но лишь частично - см. корректировку предыдущего моего поста :)))

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 17:45:23 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4565
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
:))
Да я ж не в упрёк :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 17:48:52 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
КажиСЯ я понял логику компиля... вернее - компилерописателей...


В этом случае -
Код:
uint32_t temp = 0x12345678;
UartTransmitHexLong (temp & 0xffff0000);
раз переменная temp - 32-х разрядная, то и константа подтягивается автоматом к 32-м разрядам (та скать - автоматическое приведение типа) и результат нормальный...


В этом случае -
Код:
uint32_t var = 0x12345678;
UartTransmitHexLong (var & (0x0000ffff << 16));
сначала вычисление происходит со сдвигом константы, а она как выяснилось по умолчанию 16-ти разрядная... указатель сдвига тоже обычный, следовательно никакого приведения к 32-м разрядам не происходит... и мы благополучно теряем FFFF... остается чистый 16-ти разрядный нолик...
Потом уже вычисляется &, и естественно правый 16-ти разрядный нолик приводится к 32-м разрядам... но вот незадача, сколько нолик не приводи, он так и остается ноликом )))
В итоге - то что имеем...


PS.
Ой... пока писал, ARV уже практически все объяснил...

PPS.
Хотя... внимательнее ваше объяснение почитал, помоему у меня более правдоподобно :)...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 18:07:02 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 6
Зарегистрирован: Вт май 08, 2012 23:15:45
Сообщений: 81
Откуда: Санкт - Петербург
Рейтинг сообщения: 1
ARV писал(а):
все числовые константы, если явно не указан их тип, имеют размерность 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.
ARV


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 18:12:40 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4565
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
ua1arn, это Вы к чему ? Как эта вырезка относится к типу констант по-умолчанию ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 18:19:53 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 6
Зарегистрирован: Вт май 08, 2012 23:15:45
Сообщений: 81
Откуда: Санкт - Петербург
Рейтинг сообщения: 1
Так относится, что ARV утверждает не совсем правду. Тип констант не всегда int, а зависит от значения (ну и суффиксов, разумеется).

Вот цитата из другой версии перевода стандарта на русский язык:
СпойлерИзображение


Вложения:
constants.png [117.98 KiB]
Скачиваний: 498


Последний раз редактировалось ua1arn Пн сен 15, 2014 18:39:52, всего редактировалось 1 раз.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 18:35:55 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ua1arn писал(а):
Тип констант не всегда int, а зависит от значения (ну и суффиксов, разумеется).

:oops: :?

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 19:56:50 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Так я не понял... и шо... все чет намеками какими то изъясняются...

Вы мне по русски скажите... 0x12345678 - это 16-ти разрядная или 32-х разрядная константа?.....

Если все так как утверждал ARV, то вроде у меня в голове все прояснилось...

Если все так как утверждает ua1arn, то у меня опять "разрыв шаблона" .....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 20:11:12 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 6
Зарегистрирован: Вт май 08, 2012 23:15:45
Сообщений: 81
Откуда: Санкт - Петербург
Рейтинг сообщения: 0
0x12345678 - это 32-х разрядная константа. Для avr-gcc её тип signed long. Если написать 0xdeadbeaf - то unsigned long на этом же компиляторе. На arm-none-eabi-gcc её тип signed int, для второй unsigned int.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 20:16:45 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Почему тогда этот пример:
Код:
uint32_t var = 0x12345678;
UartTransmitHexLong (var & (0x0000ffff << 16));
дает результат 0x00000000 ?
Т.е. константа 0x0000ffff трактуется как 16-ти разрядная... (о... чет подумалось... может не представление числа а его значение играет роль, скольки разрядным оно будет... т.е. в данном случае 0x0000ffff помещается в 16 разрядов, поэтому и назначается 16-ти разрядным... не?)

Компилирую в AVRSTUDIO4...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн сен 15, 2014 20:26:02 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Да... ua1arn прав...


этот вариант не работает
Код:
uint32_t temp = 0x12345678;
UartTransmitHexLong (temp & (0x0000ffff << 16));
т.к. тут константа 0x0000ffff не превышает 16 разрядов, соответственно константе и отводится 16 разрядов.....


а этот вариант работает
Код:
uint32_t temp = 0x12345678;
UartTransmitHexLong (temp & (0x000fffff << 16));
т.к. тут константа 0x000fffff превышает 16 разрядов, соответственно константе назначается 32 разряда...


Вроде разобрались, всем спасибо :) ...
В общем, если нужно гарантированно обеспечить 32 разряда константе, лучше это указать явно или так UL или так (uint32_t)...


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

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


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

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


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

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


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