Профиль пользователя заблокирован сроком с 30 декабря 2015 г. и навсегда по причине: Подозрение на взлом аккаунта
  • Как реализовать до 40 ШИМ выходов с микроконтроллера?

    @Eddy_Em
    Для светодиодов необязательно аппаратный ШИМ использовать, там и софтового за глаза хватит → нужно лишь взять микроконтроллер с достаточным количеством ног.
    Я бы сделал так: основной таймер спокойненько щелкает, а в прерывании декрементирует все 40 счетчиков (массив), ищет нулевые значения, инвертирует соответствующие ноги и обновляет значение в счетчике. Т.е. понадобятся: массив из 40 счетчиков для таймера, массив из 40 значений для выхода == 1, массив для 40 значений для выхода == 0, массив из 40 флагов (это шустрей будет, чем битовые маски использовать, хотя, конечно, на 100-200Гц ШИМа все равно) для определения, откуда при обнулении счетчика заносить значение.

    Если нужно обеспечить частоту не хуже 100Гц с восьмибитным разрешением, то нам нужно будет настроить таймер на 25600Гц. За одно прерывание нужно будет обработать не меньше 40 значений, т.е. потратить, скажем, 1-2 тысячи тактов. Следовательно, простецкого STM32 на 72МГц (с кварцем 16МГц) за глаза хватит. А то и чего-нибудь послабее...
    Ответ написан
    Комментировать
  • Как парсить структуры с битовыми полями в С?

    @Eddy_Em
    Так не годится делать. Чуть только архитектуры будут различаться, как получится черт-те что!
    Битовые поля - это страшное наследие 8-битных микроконтроллеров! Только там им и место!!!
    А если хочется извращений, то хотя бы используйте стандартные типы (вместо unsigned надо писать uint16_t или uint32_t, смотря что под этим подразумевается) и обязательно упаковывайте структуру, т.к. по умолчанию gcc разместит ее члены с наилучшим выравниванием. Компилятор-то не в курсе, что вам подряд нужно..
    Ответ написан
  • Куда делся символ вертикальной черты?

    @Eddy_Em
    Если проблема связана с кривой настройкой клавиатуры в xorg.conf, то вот так решается:
    xmodmap -e "keycode 51 = backslash bar"
    Если в терминале, то тоже можно погуглить.
    Ответ написан
    Комментировать
  • Какой линукс поставить на нетбук Lenovo Ideapad S10-3?

    @Eddy_Em
    учу C#, поставлю Моно

    Однозначно мастдайку! Хрюнделя какого-нибудь.
    Ответ написан
    Комментировать
  • Считыватель + обычный ключ от домофона, возможно?

    @Eddy_Em
    Да, есть схемы. И на ибее я что-то подобное готовое видел с памятью на несколько ключей.
    Ответ написан
    Комментировать
  • Алгоритм получения n количества записей отличных от уже полученный, как?

    @Eddy_Em
    Вариант 1: для N объектов создаем массив из N байт, где каждому i соответствует 0/1. 0 - если объект уже использовался, 1 - если еще не использовался. Затем при помощи ГСЧ набираем нужное количество объектов. Минусы: чем меньше объектов, тем дольше мы их будем извлекать.
    Вариант 2: заводим связный список. Соответственно, для выбора i-го элемента нам придется пройти i-1 предшествующий. Зато не надо дергаться, когда остается мало элементов, т.к. уже использованные извлекаются из списка. Минусы: необходимость проходить по списку для извлечения объекта.
    Вариант 3: связный список + массив. Перед процедурой выбора мы пробегаемся по всему списку и заполняем масссив ссылок. Далее — обычная процедура выбора из массива по индексу с удалением соответствующего элемента из списка. Минусы: каждый раз перед использованием нужно перестраивать массив.
    Вариант 4: использовать дерево. Минусы: периодически придется перебалансировать его.

    Я рекомендую вариант 3: вроде бы, из предложенных он самый шустрый.

    P.S. В жабоскриптике возможен еще вариант: индексы элементов сразу загнать в массив, а как только мы используем какой-то индекс, удалять его из массива. Фактически это вариант 3 с немного меньшим потреблением памяти.
    Ответ написан
    Комментировать
  • Как нарисовать круг на с++?

    @Eddy_Em
    Вот - простой способ:
    #include <GL/glut.h>
    #include <math.h>
    // compile:
    // gcc -Wall -Wextra -Werror -lglut -lGL -lm -std=gnu99 -D_GNU_SOURCE opengl.c -o openglcircle
    
    #define _U_    __attribute__((__unused__))
    // exit by ctrl+q or escape
    void keyPressed(unsigned char key, _U_ int x, _U_ int y){
    	int mod = glutGetModifiers(); // window = glutGetWindow()
    	if(mod == GLUT_ACTIVE_CTRL && key == 'q') exit(0);
    	else if(key == 27) exit(0);
    }
    
    void DrawCircle(float cx, float cy, float r, int num_segments){
    	float theta = 2. * M_PI / (float)num_segments;
    	float c, s, t, x = r, y = 0.;
    	sincosf(theta, &s, &c);
    	glBegin(GL_LINE_LOOP);
    	for(int ii = 0; ii < num_segments; ii++){
    		glVertex2f(x + cx, y + cy);
    		t = x;
    		x = c * x - s * y;
    		y = s * t + c * y;
    	}
    	glEnd();
    }
    
    void display(){
    	glClear(GL_COLOR_BUFFER_BIT);
    	DrawCircle(0.,0.,0.5,100);
    	glFlush();
    }
    
    int main(int argc, char** argv){
    	glutInit(&argc, argv);
    	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    	glutInitWindowSize(400, 400);
    	glutCreateWindow("A Simple Circle");
    	glutDisplayFunc(display);
    	glutKeyboardFunc(keyPressed);
    	glutMainLoop();
    }


    А, извиняюсь, про С++ не заметил. Ну да ладно, все равно я С++ не знаю и знать не хочу!

    P.S. А вот - чистая консолька:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *drawCircle(int R, int geom){
    	if(R > 200 || R < 1) return NULL;
    	int S, i, Y = 2 * R + 2;
    	if(geom)
    		S = Y * (R + 1);
    	else
    		S = Y * (Y - 1);
    	char *buf = malloc(S+1);
    	if(!buf) return NULL;
    	memset(buf, ' ', S);
    	buf[S] = 0;
    	for(i = Y-1; i < S; i+=Y) buf[i] = '\n';
    	inline void DrawPixel(int x, int y){
    		if(geom){
    			if(y%2==0) buf[Y * y/2 + x] = '*';
    		}else{
    			buf[Y * y + x] = '*';
    		}
    	}
    	// Bresenham's circle algorithm
    	int x = R;
    	int y = 0;
    	int radiusError = 1-x;
    	while(x >= y){
    		DrawPixel(x + R,   y + R);
    		DrawPixel(y + R,   x + R);
    		DrawPixel(-x + R,  y + R);
    		DrawPixel(-y + R,  x + R);
    		DrawPixel(-x + R, -y + R);
    		DrawPixel(-y + R, -x + R);
    		DrawPixel(x + R,  -y + R);
    		DrawPixel(y + R,  -x + R);
    		y++;
    		if (radiusError < 0){
    			radiusError += 2 * y + 1;
    		}else{
    			x--;
    			radiusError += 2 * (y - x) + 1;
    		}
    	}
    	return buf;
    }
    
    int main(int argc, char **argv){
    	int i, R;
    	char *buf;
    	for(i = 1; i < argc; i++){
    		if(!(buf = drawCircle(R = atoi(argv[i]), 1))){
    			printf("Wrong parameter %s\n", argv[i]);
    			continue;
    		}
    		printf("\nCircle with R = %d:\n%s\n", R, buf);
    		free(buf); buf = NULL;
    	}
    	return 0;
    }

    Алгоритм Брезенхэма, второй аргумент функции drawCircle задает поправку на геометрию терминала: если у вас вдруг в терминале высота буквы равна ширине, то пишите 0, если же высота в 2 раза больше ширины, пишите 1.
    Ответ написан
    Комментировать
  • Как упорядочить кучу разных запчастей?

    @Eddy_Em
    Для SMD можно купить вот такие коробочки; для деталюшек покрупней есть побольше (но цены конские, да).
    Еще можно поискать что-то вроде таких ячеек или даже вот таких удобных штук. Но в чиподипе покупать не советую: у них цены завышены очень сильно. Разве что если больше вам негде найти и вы - бюджетная организация.
    Ответ написан
    1 комментарий
  • Как вы относитесь к возможности отмечать хорошие комментарии?

    @Eddy_Em
    Тостеру до SO очень далеко. Вот там — да, зачастую в комментарии приводится готовое решение. А здесь в 99% случаев вопросы совершенно глупые, ответ на них отыскивается на первой же странице выдачи гугола.

    Вот чего не хватает тостеру, так это удаления глупых вопросов.
    Ответ написан
    2 комментария
  • Звук в ubuntu 14.04 намного тише чем в Windows 7, почему?

    @Eddy_Em
    Настроить в mplayer softvol.
    softvol=yes
    softvol-max=500

    будет жесточайше орать.
    Ответ написан
  • Удаление шума на изображении с помощью php?

    @Eddy_Em
    Я не понимаю, при чем здесь пыхпых, но на конкретных примерах элементарный медианный фильтр отлично решил бы проблему!
    Ответ написан
  • WebGL или OpenGL, что лучше?

    @Eddy_Em
    Жесть-то какая! Явное непонимание разницы...
    > монетизировать
    Ога, ога. Проприетастам привет!
    Ответ написан
    1 комментарий
  • Как послать системе нажатие клавиш программно?

    @Eddy_Em
    man xdotool
    Ответ написан
    Комментировать
  • Это P_IN jumper connectors или нет?

    @Eddy_Em
    Обведенная перемычка позволяет вместо использования кренки подключить внешний источник 3.3В.
    Оставшиеся две перемычки можно замкнуть, если вместо внешнего опорного напряжения для АЦП и прочих аналоговых цепей будет использоваться то же самое нестабильное напряжение питания, что и для цифровых цепей.
    Ответ написан
    Комментировать
  • Чем плох LyX в Linux?

    @Eddy_Em
    Он везде плох. Как и любое WYSIWYG!

    Латех проще выучить самостоятельно, почитать раз 5 книжку Кнута "Все про ТеХ" и писать свои макросы.
    В итоге и скорость набора будет намного выше, чем во всякой погани вроде LyX, и качество кода будет прекрасным (т.е. не будет проблем потом это подредактировать), и всякими VCS можно будет организовать совместную работу над документом.

    P.S. И вообще, WYSIWYG во всех случаях является вредным и неудобным, лишая контроля на всех уровнях.
    Он нужен только тем, у кого палец к мышке прирос и нет никакого желания свое невежество светом знаний уничтожать.
    Ответ написан
    2 комментария
  • Как использовать функцию scanf (C)?

    @Eddy_Em
    Не советую scanf использовать, не очень это хорошая функция. Лучше преобразовать чем-нибудь вроде strtol, проверить допустимость диапазона и если все ОК, внести новый элемент.
    Сам массив "резиновым" создать не получится: нужно сначала выделить память подо все элементы. Если нужен действительно "резиновый" массив, то следует завести что-нибудь вроде связанных списков.
    Ну и как говорил Армянское Радио, читать поэлементно.
    Т.е. что-то вроде
    int main(int argc, char **argv){
       int i, L = argc - 1;
       if(!L) return -1;
       int arr = malloc(L*sizeof(int)); // в C11 можно и так: arr[L], но если L будет большим, получится "упс"
       if(!arr) return -2;
       for(i = 0; i < L; i++)
         arr[i] = check_and_get(argv[i+1]); // а в этой функции производится преобразование строки в число и проверка
       ...
       return 0;
    }
    Ответ написан
    3 комментария
  • Как отправить смайлики за минимальное количество операций?

    @Eddy_Em
    ceil(12/5) = 3 -> Npastes=3-1=2
    floor(12/3) = 4 -> copyOn = 4
    12-4*2=4 -> Ndeletes = 5-4 = 1

    Аналогично с любыми другими числами. Скажем, N=14, M=5:
    ceil(14/5) = 3 -> Npastes = 2
    floor(14/2) = 7 -> copyOn = 5 (т.к. мы до семи догнать не можем)
    14 - 5*2 = 4 -> Ndeletes = 1
    Ответ: CDVV
    Как определить, когда писать DC, а когда CD, понять несложно.
    А то ведь вообще получится, что я забесплатно домашнюю работу решил!
    Ответ написан
    3 комментария
  • Каков алгоритм и суть работы реально существующего скрипта 100% предсказания результата, загаданного человеком?

    @Eddy_Em
    Советую почитать "математические фокусы" Якова Исидоровича. Откроете для себя много новой "магии".
    Ответ написан
    Комментировать
  • Буквально сегодня начал знакомиться с микроконтроллерами, но не до конца понял суть, расскажите?

    @Eddy_Em
    Если в микроконтроллере есть bootloader, то программатор не нужен.
    Чтобы было понимание что и куда пихать, сначала литературу нужную почитать. Нахрапом не получится. Это не огород, который нахрапом вскопать можно!
    Раз отсутствует понимание, что можно сделать с МК, то не нужно с ними связываться.

    И да: если есть желание будучи совершенным невеждой сложить у себя самомнение о понимании электроники, можно купить ардуйню.
    Ответ написан
    3 комментария