0
кстати, почему выбор пал на MF4 а не на M3? Совсем нереально в целых числах реализовать? Или просто чтоб не заморачиваться?
  • avatar
  • scaldov
  • 08 марта 2016, 11:38
0
в видеодемке автор как раз показывает удержание (как серва)
аналог есть у китайцев на али — клон ESC32. но там cortex M3. Серву тоже поддерживает, но пишут, что серва должна быть высокоомной. Есть тоже открытая прошивка.
  • avatar
  • scaldov
  • 07 марта 2016, 13:07
0
потрясно. хочу повторить, но не нашёл схемы и pcbшки в репах.
  • avatar
  • scaldov
  • 07 марта 2016, 10:10
0
Насчёт экселя. Освойте мэпэл. Если вы против ворованного мэпла, освойте октаву. Если вам надо работать с уравнениями — есть Wolfram Mathematica (если не хотите её воровать, есть maxima).
  • avatar
  • scaldov
  • 06 марта 2016, 18:18
0
что-то я не понял. какбэ W_{lim}\geq\frac{U^2}{R} — весьма очевидное следствие закона Джоуля-Ленца, который в правой части…
  • avatar
  • scaldov
  • 06 марта 2016, 18:11
0
не думаю, что сейчас существуют процессоры, где у float — MSB, а у integer — LSB. Они не прошли естественный отбор из-за этого геморроя.

а AVR — 8-битка, там родной int — 2 байта, а double == float, думаю, из-за невозможности вменяемо это реализовать на 8 битах.
Но плавающая точка на 8битках — это какое-то извращение в наши дни.
  • avatar
  • scaldov
  • 03 марта 2016, 23:18
0
а вообще, да, фиксед-поинт для обработки значений с датчиков — самое то. и алгоритмов вагон, всё уже придумано.
  • avatar
  • scaldov
  • 03 марта 2016, 19:31
0
будучи загруженными в регистры, порядок байт уже не имеет никакого значения (непонятно, почему для многих это непонятно:).
размерность дабла IEEE754 — 64 бит, расположение описано в стандарте, то же верно и для single precision (float, 32бит).
это даже не оптимизация, а пруф оф консепт. Я хотел просто показать, что над стандартом поработали хорошие инженеры, и стандарт позволяет сделать довольно простую аппаратуру / софтовую эмуляцию для работы с действительнвми числами.
  • avatar
  • scaldov
  • 03 марта 2016, 19:27
0
это особые случаи. одно inf, а другое -NaN, они элементарно распознаются :)
  • avatar
  • scaldov
  • 03 марта 2016, 00:56
0
возможно, компилятор так делает в каких-то случаях, не обращял внимания.
Вобщем, смотрите сами мою магию для примера:

	for(int k = 0; k < 10000; k ++) {
		double phi = M_PI * (double)k * 2.l / 10000.l;
		double x = cos(phi);
		double y = sin(phi);
		int64_t ix= *reinterpret_cast<int64_t*>(&x);
		int64_t iy= *reinterpret_cast<int64_t*>(&y);
		int c = x < y ? 1 : 0;
		int ic = ix < iy ? 1 : 0;
		if (ix & iy & 0x8000000000000000) ic ^= 1;
		//printf("%d%d\t%.12g\t%.12g\n", c, ic, x, y);
		if(c != ic) {
			printf("%.12g\t%.12g\n", x, y);
		}
	}

результаты сравнения как целых и как double совпадают.
  • avatar
  • scaldov
  • 01 марта 2016, 21:14
0
если я правильно помню, то числа IEEE 754 сконструированы так, что они монотонны в бинарном представлении, т.е. их можно сравнивать целочисленным сравнением, загрузив в целочисленные регистры.
  • avatar
  • scaldov
  • 27 февраля 2016, 13:16
+1
про SDK и дотнетное говно согласен на 146%, а вот про качество свистков не соглашусь. Если мало, то можно прикрутить МШУ к нему.
  • avatar
  • scaldov
  • 20 февраля 2016, 21:55
0
всегда в вантузе улыбала простыня из COM0 COM1 COM2 COM3 COM4 COM5 COM6 COM7… А потом ещё тыкать в проге, пытаясь угадать, в тот девайс попали или не :)
  • avatar
  • scaldov
  • 19 февраля 2016, 20:18
0
точно! Просто пока не нарывался :)
wait_mark
wait_until — для задержек внутри потока. сразу после переключения контекста systick достаточно большой, пожтому ошибки и не было.
особенно приколно wait_mark — вы ждёте отсчётов типа 5000 4900 4800 4500 итд, тем самым ваши действия пляшут слева около желаемых временных отметок и общаяя временая диаграмма не растягивается.
просто wait — работает в связке с begin end, которые заправляют счётчик максимально, чтоб отследить очень длинные интервалы.
  • avatar
  • scaldov
  • 16 февраля 2016, 07:31
0
я делаю задержки вот так:

constexpr uint32_t operator "" _ns(unsigned long long t) {
	return t;
}

constexpr uint32_t operator "" _us(unsigned long long t) {
	return t * 1000;
}

constexpr uint32_t operator "" _ms(unsigned long long t) {
	return t * 1000000;
}

class systick {
public:
	static uint32_t systick_ctrl;
	static constexpr uint32_t ns(uint32_t ns, const uint32_t coreclk){
		return (uint32_t)((double)coreclk * (double)ns / 1e9);
	}
	static int wait_mark(uint32_t tick) {
		__disable_irq();
		uint32_t v, start, end;
		start = SysTick->VAL;
		if(start < (tick + 30)) return -1;
		end = start - tick + 12;
		v = start;
		while(v > end){
			v = SysTick->VAL;
		}
		__enable_irq();
		return -0;
	}
	static void wait_until(uint32_t systick_val) {
		uint32_t v;
		v = SysTick->VAL;
		while(v > systick_val){
			v = SysTick->VAL;
		}
	}
	static void wait(uint32_t tick)
	__attribute__ ((noinline))
	__attribute__ ((__section__(".data")))
	{
		SysTick->LOAD = tick;
		SysTick->VAL = 0;
		SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
		while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
	}

	static inline uint32_t get() {
		return SysTick->VAL;
	}
	static void begin() {
		systick_ctrl = SysTick->CTRL;
		SysTick->LOAD = 0xFFFFFF;
		SysTick->VAL = 0;
		SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
	}
	static inline void end() {
		SysTick->CTRL = systick_ctrl;
	}
};
  • avatar
  • scaldov
  • 15 февраля 2016, 22:26
0
тоже когда-то использовал такую технологию. но практика показала, что сложность конструкции растёт нелинейно. в итоге пришёл к тому, что надо RTOS и несколько потоков в ней. Да, расход на стек. Но в автоматах та же память расходуется под сохранение контекста.
  • avatar
  • scaldov
  • 05 февраля 2016, 22:16
0
одного не пойму — нафига это всё на мк городить.

и потом — 8битный буфер под один глиф, только при загрузке шрифта, да и это можно сделать на компе.
  • avatar
  • scaldov
  • 04 февраля 2016, 21:28
0
ну всмысле, не стирается — где в маске 1 — там ставится цвет обрамления, где 0 — просвечивает фон. Потом поверх рисуется глиф.
  • avatar
  • scaldov
  • 03 февраля 2016, 20:26
0
это делается ооочень просто. берётся ЛЮБОЙ монохромный шрифт, глиф рендерится в 8-битный буфер. В буфере делается блюр, потом по нему делается монохромная маска: где пиксель !=0 — там 0, иначе 1. При отрисовке на экран маской стирается фон, потом накладывается исходный глиф.
  • avatar
  • scaldov
  • 03 февраля 2016, 20:24
0
чем же он сырой?
  • avatar
  • scaldov
  • 02 февраля 2016, 23:23