Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

то есть вы хотите сказать, что 8-битный МК работает с памятью 16-битными словами, и в процессе обмена байтами прерывания не могут произойти? я верно понимаю архитектуру STM8?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 960
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

Пересылка 16-ти битного слова в STM8 выполняется одной командой за два такта. Если прерывания могут произойти при выполнении половины процессорной команды, то я ничего не понимаю :)
Контактная информация:
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

ARV писал(а):то есть вы хотите сказать, что 8-битный МК работает с памятью 16-битными словами, и в процессе обмена байтами прерывания не могут произойти? я верно понимаю архитектуру STM8?
In case of simultaneous accesses to the same memory area both in execution stage (write)
and decoding stage (read), the decode stage is stalled till the execution stage releases the
resource.

PM0044
Programming manual
"Я не даю готовых решений, я заставляю думать!"(С)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Нифига не понял: где здесь о "неразрывности" тактов многотактовой инструкции говорится?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Only DIV and DIVW instructions are interruptable.
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Добрый день, есть 24 битное АЦП которое выдаёт один бит по каждому возростающему фронту.
Подскажите как сохранить эти данные.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

А покажите, как Вы это делаете, чтобы все поняли, что конкретно у Вас не получается.

Вопрос сформулирован абсолютно неконкретно. Если имеется в виду, что выход у АЦП последовательный, и весь результат за 24 такта (фронта) выдаёт - то в чём проблема записывать очередной бит в некую переменную на 0-ю позицию и сдвигать эту переменную влево?
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Не писал что не получается, спрашивал как сделать.
Да у АЦП последовательный выход и по фронту выдаются данные.
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

baghear писал(а):как сделать.
по фронту выдаются данные.
Ну так и делать — по фронту забирать данные.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

baghear писал(а):Не писал что не получается
Дак напишите. Почему всё вытягивать нужно из людей :facepalm:
Вопрос какой-то странный. Что значит "как сохранить данные" ? Можно на диск записать, или на флешку - долго будут храниться...

Ваш вопрос звучит примерно так :
У меня есть в огороде яблоня. По каждому стуку по ней, яблоки падают по одному.
Подскажите, как сохранить эти яблоки ?
Вот теперь попробуйте ответить мне на мой вопрос.

А вот Ваш пост :
Добрый день, есть 24 битное АЦП которое выдаёт один бит по каждому возростающему фронту.
Подскажите как сохранить эти данные.
Не находите ничего общего с моим ? :)
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Хотел бы просто сохранить в переменую.
Приведите пожалуйста пример кода на си.
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

baghear, если вы не понимаете как оно должно работать, то как вы разберётесь в том что вам могут написать? К тому же процедура будет зависеть от схемы (от подключения АЦП к МК). Ну напишут вам код - будете просить объяснить как он работает? Можете не отвечать. Это, практически, риторический вопрос. :)
Если хотите, чтобы написали код за вас - это в другую тему.

А если по делу, то вам надо ознакомиться с битовыми операциями и сдвигами в Си.
Можете поискать программную реализацию SPI. Думаю, это то что вы ищите. Если разберётесь как она работает, то и со считыванием с вашего АЦП разберётесь.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

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 раз.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Спасибо большое!!!
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Недавно опять у меня ступор был с этими странными стандартами Си...


Долго не мог понять почему не работает одна функция, вроде перепроверял, все должно быть ОК...
Потом разобрался, оказывается следующий вариант -

Код: Выделить всё

uint32_t var = 0x12345678;
UartTransmitHexLong (var & (0x0000ffff << 16));
Дает в результате 0x00000000... хотя логично было получить 0x12340000...


А вот такой вариант -

Код: Выделить всё

uint32_t var = 0x12345678;
UartTransmitHexLong (var & (0xffffUL << 16));
Дает нормальные 0x12340000...


Почему в первом случае компиль не понимает 0x0000ffff как UL ?.... я же ему явно задаю количество знаков.....
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678.

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

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

ARV писал(а):в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678.
А точнее - константы 0x0000FFFF...
ARV писал(а):все числовые константы, если явно не указан их тип, имеют размерность int. поэтому даже число 0x23498579834759823476982347982347 все равно будет типа int.
Интересно, а чем продиктован такой подход?
Логично же что если константа разрядностью больше 16 бит, то компиль мог бы сформировать 32-х битное число...
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

ARV писал(а):в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678.
Ан нет... именно в случае со сдвигом проблема проявляется...

Вот так делаю - нормально получается - 0x12340000...

Код: Выделить всё

uint32_t temp = 0x12345678;
UartTransmitHexLong (temp & 0xffff0000);
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

варнинги при компиляции прочтите - будет видно, в каком месте трабл.

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

во втором примере суффиксом UL вы указали, что константа 32-битная, поэтому проблемы и нет
Последний раз редактировалось ARV Пн сен 15, 2014 17:38:36, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»