Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

2 минуты назад, my504 сказал:

Данные сразу будут знаковыми при нуле в середине шкалы.

 Мне не обязательно знаковые данные, если я буду знать что 6 бит это отрицательное, мне по сути все равно где график рисовать на экране, от нижнего левого угла идет все в положительном направлении. Так что мне даже лучше получить значение умножить на масштаб и вывести)

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

Ээээ, нет. Все не так просто.

Попробуйте увеличить масштаб на экране по вертикали, например, в 2 раза? :crazy:

Если тип данных unsingned, то Вы получите ОШИБКУ. Центр улетит.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Математику чтоли в школе не учили? Берём и масштабируем... и относительно центра и относительно чего угодно. Это вам не тупо умножать отсчеты на масштабирующий коэфициент.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@my504 не совсем понял Вас.

Я так понял что ADC даст мне 12 бит? То есть это не число 12 битное а 1 бит 1 шаг? В данном случае 0.3В?

То есть допустим я получаю 0.9В 0b111

Я могу посчитать сколько бит 

while (ads & (1 << Y++));

выходит в Y я получу значение 3.

всего под график выделено допустим 120 точек, как раз по 10 на 1 бит. 120 >> 1  будет середина, там рисуем луч графика X

а точку просто Y * 10

число от 0 до 120 легко влезет в  uint8 :)

4 минуты назад, Alexeyslav сказал:

Это вам не тупо умножать отсчеты на масштабирующий коэфициент.

почему нет?)

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Alexeyslav сказал:

Берём и масштабируем... и относительно центра и относительно чего угодно. Это вам не тупо умножать отсчеты на масштабирующий коэфициент.

А что это еще?

Кто то тут пропагандировал стандартный подход? :lol:

Вообще то формирование картинки на экране НИКАКОГО отношения к сигнальной части не имеет. На экране сигнал - это ОБЪЕКТ привязанный нулем к условной горизонтальной линии.

Поэтому ДА, именно умножение на коэффициент знакового массива и будет масштабированием.

1 минуту назад, DrobyshevAlex сказал:

@my504 не совсем понял Вас.

Я так понял что ADC даст мне 12 бит? То есть это не число 12 битное а 1 бит 1 шаг? В данном случае 0.3В?

То есть допустим я получаю 0.9В 0b111

Вы же вроде программист? :unknw:

0,9 вольт при опоре 3,3 вольта даст код 0,9*4096/3,3=1117 (0x045D=0b0000 0100 0101 1101)

6 минут назад, DrobyshevAlex сказал:

.всего под график выделено допустим 120 точек, как раз по 10 на 1 бит.

Если на график выделено 120 точек, то данные всего диапазона АЦП придется масштабировать делением на  35  (4096/120=34,1 - округляем вверх, чтобы влезло)

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

35 минут назад, my504 сказал:

0,9 вольт при опоре 3,3 вольта даст код 0,9*4096/3,3=1117 (0x045D=0b0000 0100 0101 1101)

так я ж писал что с ацп не работал. и по этмоу предположил вот тут еще

6 часов назад, DrobyshevAlex сказал:

Я думал что это будет 3.6/12 = 0.3В.

Просто про разрядность такие спорты были несколько страниц, я и решил что видимо 12 бит почему то всего лишь 12 шагов)

а если так  то другое дело, при чем толькоч то увидел Ваш пост

6 часов назад, my504 сказал:

  (Uвх/Uопорн)*2^N, где N - разрядность.  2 в 12 степени

Тогда мне на оборот делить надо)) пару сдвигов вправо)

38 минут назад, my504 сказал:

придется масштабировать делением на  35

ну или не пару)

Ссылка на комментарий
Поделиться на другие сайты

26 минут назад, DrobyshevAlex сказал:

пару сдвигов вправо

Деление на целое число - это умножение на целое число и деление сдвигом.

То есть деление на 35 - это умножение на 1872 (65536/35) и сдвиг вправо на 16 разрядов (отбрасывание младших 16 разрядов).

1/35=0.028571... = 0x0750 (fractional)

 

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Я бы не трогал исходный массив, а масштабировал бы непосредственно вывод на экран. Во первых, если отмасштабировать входные данные прямо там же на месте, дальше с ними будет трудно что-то сделать из-за накапливающегося округления, а один раз написанная процедура масштабирования под прямоугольник экрана(задаётся значение верхней и нижней границы экрана в единицах буффера исходного сигнала, и величину области вывода в пикселях) может пригодится в будущем для навигации по буфферу и рассматривания подробностей сигнала, плавное масштабирование и все дела. Тем же алгоритмом можно масштабировать метки шкалы.

 

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

22 минуты назад, Alexeyslav сказал:

Я бы не трогал исходный массив, а масштабировал бы непосредственно вывод на экран. 

А кто то предлагал формировать масштабированный массив?

Речь шла о том, В КАКОМ ФОРМАТЕ иметь данные с АЦП.

Исходный массив с АЦП знаковый и соответствует РЕАЛЬНОМУ двухполярному сигналу. При выводе массива В ЭКРАННЫЙ ОБЪЕКТ он (точнее ДАННЫЕ из него) масштабируется по масштабу напряжений экрана.

Формирование объекта и его привязка к координатам экрана - это СОВСЕМ ДРУГОЙ ПРОЦЕСС.

ЗЫ. Буфер АЦП вообще не соответствует экранному изображению  по масштабу ОБЕИХ ОСЕЙ. Там даже количество точек другое. Придется не только масштабировать, но и прореживать. А если требуется даунсемплинг, то,  по любому, массив АЦП должен быть знаковым, поскольку он должен быть определенным образом отфильтрован, чтобы получить исходную синусоиду, а не набор хаотичных точек.

 

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, DrobyshevAlex сказал:

какая разница как я их назвал?) работать не будет?)

Для вашего сигнала - не будут. Они начнут работать заведомо после выхода сигнала за измеримые границы, и на деле дадут напряжению расти +0.5В над питанием и -0.5В ниже земли, где АЦП уже заведомо не работает. Со стабилитроном ситуация иная - его используют когда напряжение надо ограничить на меньшем уровне чем напряжение питания, и то его не применяют в аналоговых цепях, только с дискретными сигналами ибо у него имеется препаршивое свойство проводить ток заведомо раньше чем пороговое напряжение, а это внесёт искажение во входной делитель.

17 минут назад, my504 сказал:

Исходный массив с АЦП знаковый и соответствует РЕАЛЬНОМУ двухполярному сигналу.

Он никогда не будет соответствовать, это простое удобное совпадение. А потом при масштабировании всё та же математика... и смысл тогда в знаке для внутреннего хранения этих данных? Просто для красоты. В осциллографах уровень нуля - это величина переменная и может меняться в пределах всего диапазона АЦП.

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

17 минут назад, Alexeyslav сказал:

у него имеется препаршивое свойство проводить ток заведомо раньше чем пороговое напряжение

Ну и что?  Стабилитрон и не нужно выбирать внутри диапазона измерений. Точка начала тока лавинного пробоя должна быть вне ДД АЦП. А небольшое превышение напряжения спокойно ограничат паразитные диоды на ноге МК. Ток все равно ограничен резистором делителя. Далее откроется стабилитрон и ток пойдет через него.

Зато при слишком высоком входном напряжении стабилитрон (а вообще то супрессор) выполнит свою задачу.

17 минут назад, Alexeyslav сказал:

Он никогда не будет соответствовать, это простое удобное совпадение. А потом при масштабировании всё та же математика... и смысл тогда в знаке для внутреннего хранения этих данных? Просто для красоты. В осциллографах уровень нуля - это величина переменная и может меняться в пределах всего диапазона АЦП.

Попробуйте отфильтровать беззнаковый сигнал в буферном окне, а я посмеюсь....

Я уже не говорю, что через пару минут  Вы запутаетесь в сдвигах на экране.

Парадокс, Вы так рьяно агитировали за стандартные решения, а по факту Вы ПОНЯТИЯ О НИХ НЕ ИМЕЕТЕ, пытаясь действительно изобрести деревянный велосипед с квадратными колесами.

Процесс самостоятельного синтеза алгоритмов должен параллельно исследовать имеющиеся велосипеды... А то проку с такого колхоза будет ноль.

 

ЗЫ. В догон, по поводу стабилитрона. Его, есличо, ставят не на ноги МК...

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, my504 сказал:

Ток все равно ограничен резистором делителя. Далее откроется стабилитрон и ток пойдет через него.

Так ведь в схеме нет стабилитрона. А встроенные диоды защитные в микросхеме работают только на малых токах, если превысить ток через него - может возникнуть эффект тиристорного защелкивания. Поэтому, вешают внешние диоды. И падение напряжения на них должно быть меньше чем на внутренних, но почему-то это редко где соблюдается и схемы ЧУДОМ работают. И там кстати между точкой соединения диодов и входом микросхемы должен быть резистор сопротивлением 10...100 Ом для того чтобы ограничить ток через встроенные диоды. Но всем плевать, и так работает.

2 часа назад, my504 сказал:

при слишком высоком входном напряжении стабилитрон (а вообще то супрессор) выполнит свою задачу.

Ну, супрессор это другое дело, но он задачу не всегда выполнит как следует(внезапно при определённых условиях напряжение на нём может быть в 2 раза больше номинала), а стабилитроны в этом качестве бывает сгорают позже чем защищаемая схема.

 

2 часа назад, my504 сказал:

Попробуйте отфильтровать беззнаковый сигнал в буферном окне, а я посмеюсь....

О какой фильтрации речь? Почему она не будет работать с беззнаковыми числами? как быть с однополярными сигналами? Осциллограф показывает то что есть в буффере. И что если условный ноль сигнала находится у нижней границы диапазона? Я же и говорю - ноль для АЦП это условность, а то что он совпадает с серединой шкалы диапазона АЦП - это удобство, чтобы исследовать симметричные периодические сигналы. Потому никакой знак мешать фильтрации не должен.

2 часа назад, my504 сказал:

Вы так рьяно агитировали за стандартные решения

За стандартные функции а не решения. Не надо путать! Не будете же вы реализовывать функцию умножения в своём проекте, вы берёте и пользуетесь готовой, а вот как её применять - уже другой вопрос. Или что касается алгоритмов сортировки, переизобретать их каждый раз в каждом новом проекте? Какие-то у вас постоянные крайности. Если существующее решение полностью устраивает то почему его нельзя использовать? А вот своё изобретать - только в случае когда никакое другое не устраивает.

2 часа назад, my504 сказал:

Я уже не говорю, что через пару минут  Вы запутаетесь в сдвигах на экране.

А через 4 минуты решу проблему и забуду про неё.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

42 минуты назад, Alexeyslav сказал:

Так ведь в схеме нет стабилитрона.

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

42 минуты назад, Alexeyslav сказал:

О какой фильтрации речь? Почему она не будет работать с беззнаковыми числами?

О фильтрации после даунсемплинга, чтобы наблюдать периодические сигналы с частотой больше, чем частота семплирования. Поскольку массив не бесконечный, начало будет эквивалентно наличию постоянной составляющей со всеми вытекающими из этого последствиями. Если в сигнале будет постоянная составляющая, то проблем не будет, ибо результат будет соответствовать входному сигналу.

42 минуты назад, Alexeyslav сказал:

ноль для АЦП это условность

Даладна... :crazy: А как быть с тем, что в диапазоне 12-разрядного АЦП в целочисленном представлении ВООБЩЕ НЕТ отрицательных значений. Вы, милейший, совсем не знаете ничего про отрицательные числа в дополнительном коде. Проблем бы не было, если бы АЦП был 16 разрядный.  И, чтоб Вы знали, попробуйте умножить положительное и отрицательное число, но без знакового представления.... :bye:

42 минуты назад, Alexeyslav сказал:

За стандартные функции а не решения....  А через 4 минуты решу проблему и забуду про неё.

Во первых, есть СТИЛЬ программирования, он включает в себя не только и не столько использование стандартных функций.

Когда говорят о говнокоде, понимают как раз безалаберную структуру программы.

А нащщет "за 4 минуты"... Это вряд ли. А если про "забуду про нее" - то это точно. И когда потребуется правка экранного интерфейса, Вы потратите вдесятеро больше...

 

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Прошу помощи,что выдаст функция?

Меня напрягает что это работает,но как,в инете пояснение найти не могу.

int x = 1 ;

printf ( "%c" , x["abc"]  )

Изменено пользователем BiBOX
Ссылка на комментарий
Поделиться на другие сайты

57 минут назад, Lexter сказал:

Пояснение есть во встроенном "Хэлпе" по функции printf.

Не уверен что дело в функции printf. Это пояснение скорей будет в описании оператора [].

6 часов назад, BiBOX сказал:

Меня напрягает что это работает,но как,в инете пояснение найти не могу.

Думаю вам сюда http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

Раздел Array subscripting

E1[E2] = (*((E1)+(E2)))

думаю это то же что 

(*((E2)+(E1)))

то есть E2[E1]

то есть "abc"[x]

то есть "abc"[1] = "b"

как то так)

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

Хотя лично я бы убивал тех, кто пишет так "разнообразно".

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Подскажите, есть аттини13 на 9.6МГц. Настраиваю предделитель на 64. 9600 000 / 64 = 150 000. Ставлю совпадение 150. Должно же быть 1 тик таймера 1 мс? Но у меня выходит что 1 тик таймера 10 мс) Тестирую в протеусе с его осциллографом) Как будто мк работает на 1 Мгц. Или я считаю не верно?) В мк указана константа с частотой, и в протеусе выбрано 9.6МГц.

Ссылка на комментарий
Поделиться на другие сайты

Фьюз CKDIV8 в каком состоянии?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Включен) По умолчанию)) Я даже не думал что он включен по умолчанию) Я всегда при прошивке на сайте ставил галочки какие надо) А в протеусе ума ж нет глянуть :) Спасибо!

 

Ссылка на комментарий
Поделиться на другие сайты

Есть функция вывода текста:

extern const uint8_t* const Font_16_array[]PROGMEM;
extern const uint8_t* const Font_32_var []PROGMEM;
void TFT_String(uint16_t x, uint16_t y, uint16_t color, uint16_t fon,char *str, uint8_t size)
{	uint16_t h=size*8;
	uint8_t Width=0;


	
	while (*str)
	{	
		switch(size)
		{
			case 1: return;
			case 2: if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(&Font_16_array[(uint8_t)*str-97]));}
					else				  { Width=pgm_read_byte(pgm_read_word(&Font_16_array[(uint8_t)*str-32]));}		break;
			case 4: if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(&Font_32_var[(uint8_t)*str-97]));}
					else				  { Width=pgm_read_byte(pgm_read_word(&Font_32_var[(uint8_t)*str-32]));}		break;
		}
		
	
		if ((x+Width)>X_SIZE)//следим за окончанием строки
		{
			x = 0;
			y = y + h;
		}
		RM68140_Print_char(x,y,color,fon,*str,size,Width);
		x += Width;
		str++;
	}
}

Для вывода разного шрифта приходиться писать одно и тоже условие в цикле switch. Как сделать, чтобы функцию привести к такому виду:

extern const uint8_t* const Font_16_array[]PROGMEM;
extern const uint8_t* const Font_32_var []PROGMEM;
void TFT_String(uint16_t x, uint16_t y, uint16_t color, uint16_t fon,char *str, uint8_t size)
{	uint16_t h=size*8;
	uint8_t Width=0;


	while (*str)
	{	
		switch(size)
		{
			case 1: return;
			case 2: /* здесь выбрать массив указателей Font_16_array*/		break;
			case 4: /* здесь выбрать массив указателей Font_32_var*/		break;
		}
		if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(/* здесь подставить выбранный массив*/[(uint8_t)*str-97]));}
					else	  { Width=pgm_read_byte(pgm_read_word(/* здесь подставить выбранный массив*/[(uint8_t)*str-32]));}
	
		if ((x+Width)>X_SIZE)//следим за окончанием строки
		{
			x = 0;
			y = y + h;
		}
		RM68140_Print_char(x,y,color,fon,*str,size,Width);
		x += Width;
		str++;
	}
}

 

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, Demonrostov сказал:

/* здесь выбрать массив указателей Font_16_array*/

А в первом варианте у Вас что делается ? Не выбирается что-ли ?
В зависимости от размера, делается выбор из соответствующего массива.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...