Jump to content

    

AlexKoblov

Свой
  • Content Count

    72
  • Joined

  • Last visited

Community Reputation

0 Обычный

About AlexKoblov

  • Rank
    Участник
  • Birthday 03/21/1979

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

1381 profile views
  1. Заменил сжатие по горизонтали более простым алгоритмом, и время обработки сократилось с 56сек до 4сек То что закомментарено, это так было, а ниже как стало: // for (int j = 0; j < 65536; j++) { // if(j<data_in) SumArray[j]+=1; // } for (int j = 0; j < data_in; j++) { SumArray[j]+=1; }
  2. Вот сделал отображение графика как хотел, лишние иголочки не отображаются: Сверху как было, снизу как стало: Для вывода использовал компонент TeeChart - Color Grid - Color Range (у него обнаружилось ограничение в 32768 точек по горизонтали, поэтому мои 500тысяч точек пришлось сжимать под это размер, или в с случае pBitmap до ширины картинки, и именно 890точек) Но предварительно данные подготавливаются, сжимаются по горизонтали и вертикали в массив Map. В принципе можно выводить и в pBitmap->Canvas->Pixels[x][y] = RGB (Map[x][255-y], Map[x][255-y], Map[x][255-y]); а потом PaintBox1->Canvas->Draw(0,0,pBitmap); Вот отладочные куски может кому пригодится: первый это сжатие: второй это вывод на экран в двух видах, в картинку BitmapCanvas и в SeriesTeeChart:
  3. Всем Привет! Есть ли стандартные средства перемещения и масштабирования отдельных графиков в ТеeChart? С масштабированием группы графиков (например графики Series1, Series2, Series3 входящих в один Chart1) , проблем нет, меняются минимумы и максимумы по оси-Y у Chart1, и они и двигаются и масштабируются быстро. Но нужно сдвинуть только один, например красный сдвинуть вверх, но чтобы зеленый остался на месте: Понятно что можно математически: for(int i=0;i<Chart1->Series[1]->Count()-1;i++) Chart1->Series[1]->YValues->Value[i]+=Y; Но при больших графиках, например по оси-X 690тысяч точек, такой алгоритм откровенно тормозит. А если масштабировать, т.е. умножать на какойто коэффициент, то могут начальные данные портится (исходные значения не сохраняются), а очищать Series1 заполнять его из какого-то массива с умножением на коэффициент тоже не быстро будет. Уже два дня копаю TeeChart на эту тему, в нем много всего, но нужное не могу найти. Может типа какая нибудь локальная система координат для каждого отдельного Series? Есть еще один вопрос, по поводу стандартного масштабирования в TeeChart, например есть такой график: он имеет пики 1,2,3, они очень тоненькие, но при отдалении зума они сохраняются, видно на нижнем графике, и изза этого создается впечатление что сигнал на нижнем графике сильно зашумлен, хотя там всего маленькие иголочки были. Это похоже как в осциллографе есть режим PeakDetected, но его в осциллографе можно выключить и эти тонкие пики на отдаленном по зуму сигнале отображаться не будут. Вот вопрос: как в TeeChart тоже отключить этот режим PeakDetected, т.е. чтобы на отдаленном отображении графика эти иголочки вообще не отображались ? Вот еще картинка для примера: Может нестандартными средствами можно такое скрыть (без использования фильтра LowPass) ?
  4. Вообще то он 2017 года Embarcadero® C++Builder 10.2 Version 25.0.26309.314 Copyright © 2017 Embarcadero Technologies, Inc. All Rights Reserved.
  5. Работает. Спасибо! TCursorTool* t = NULL; t = dynamic_cast <TCursorTool*> (Chart1->Tools->Items[0]); t->FollowMouse = true;
  6. Добавил скобки и заработало. Спасибо! ((TCursorTool*)(Chart1->Tools->Items[0]))->FollowMouse = true; Итоговый вариант доступа к графику через Chart1, а не через Series1 и ChartTool1, после импорта из *.tee файла, выглядит так: void __fastcall TForm1::Chart1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { AnsiString str,str2; str=Chart1->Tools->Items[0]->Description(); str2="Cursor"; if((Chart1->Tools->Count>0)&&(CompareText(str, str2)==0)) { str="Х="; str+=(int)(((TCursorTool*)(Chart1->Tools->Items[0]))->XValue); str+=" Y="; str+=(int)(((TCursorTool*)(Chart1->Tools->Items[0]))->YValue); Label20->Caption=str; if(GLOBAL_DATA_LEN>(int)(((TCursorTool*)(Chart1->Tools->Items[0]))->XValue)) { str="VCNL="; str+=Chart1->Series[0]->YValues->Value[(int)(((TCursorTool*)(Chart1->Tools->Items[0]))->XValue)]; Label21->Caption=str; str="ACC X="; str+=Chart1->Series[1]->YValues->Value[(int)(((TCursorTool*)(Chart1->Tools->Items[0]))->XValue)]; Label22->Caption=str; str="ACC Y="; str+=Chart1->Series[2]->YValues->Value[(int)(((TCursorTool*)(Chart1->Tools->Items[0]))->XValue)]; Label23->Caption=str; str="ACC Z="; str+=Chart1->Series[3]->YValues->Value[(int)(((TCursorTool*)(Chart1->Tools->Items[0]))->XValue)]; Label24->Caption=str; } else { Label21->Caption="VCNL= выход за пределы"; Label22->Caption="ACC X= выход за пределы"; Label23->Caption="ACC Y= выход за пределы"; Label24->Caption="ACC Z= выход за пределы"; } } } Выдает ошибку на nullptr, хотя на экране это слово выделено как зарезервированное слово (типа как int или double) [bcc32 Error] bletest1.cpp(1585): E2451 Undefined symbol 'nullptr' Спасибо за подсказку! может тут тоже нужно было немного добавить и заработало бы, но я не понял что Да жив и на разных платформах работает (сайт TeeChart): Даже на iOS, правда еще не пробовал, но хочется :)
  7. Всем Привет! Подскажите плиз, как можно перевести данную строку на C++: (Chart1.Tools.Items[0] as TCursorTool).FollowMouse:=true; Chart1.Tools.Items[0] типа TTeeCustomTool, а обратиться к нему нужно как к TCursorTool Просто назначить тоже не получается ошибку выдает на такое присвоение ChartTool1=Chart1->Tools->Items[0]; [bcc32 Error] bletest1.cpp(1594): E2034 Cannot convert 'TTeeCustomTool *' to 'TCursorTool *' т.е. мне нужно получить координаты ChartTool1->XValue; но после импорта графика из файла *.tee, ChartTool1 пропадает, как и Series1. Как к сериям после импорта обращаться, я уже научился: Chart1->Series[9]->YValues->Value; а вот как к Тулсам обращаться через Chart1 непонятно. Нашел пример на делфи, но как его переделать на C++ не пойму. Вроде есть typeid, typeinfo, но как их переменить непонятно. p.s. Embarcadero® C++Builder 10.2, TeeChart Pro v2017.20.170306 32bit VCL
  8. Эх даже немного стыдно писать :) Прочитал кучу даташитов про АЦП, перепробовал RC цепи на входе АЦП, фронты только загнулись, но проблема со скачками не решилась. Потом начал проверять самое простое, то на что я и подумать не мог. Время свечения светодиода. Оказалось, что оно менялось скачками в какие-то моменты. Оказалось что эпизодически (на определенных задержках) срабатывало прерывание от АЦП именно в моменты свечения светодиода, и увеличивало его, а это прерывание вообще было добавлено только для отладки, чтобы на осциллографе было видно момент окончания работы АЦП. Отключил прерывание, все проблемы пропали :) Извините за беспокойство, Спасибо Всем откликнувшимся! :)
  9. Вообще у меня проблема в том, как мне кажется, что вот этот конденсатор который внутри АЦП, когда он возвращается в цепь, он в нее разряжается и приводит к скачку сигнала. Вот на видео где я увеличиваю длительность импульса подсветки, и происходит скачек, т.е. сначала я плавно меняю длительность импульса подсветки, и так же плавно меняется сигнал на линии АЦП, но потом он резко падает. Я думаю это из-за несогласованности входного сопротивления АЦП и выходного сопротивления усилителя. А может и нет? https://youtu.be/r_fnwDcV5IA
  10. т.е. вообще никакой разницы нет в наборах номиналов (1К и 8.2К) или (24К и 200К) ? хоть в чем то разница есть? понятно что коэффициент усиления одинаковый. Вообще, в принципе, какая-то разница есть используются низкоомные резисторы или высокоомные? А если (при сохранении коэффициента усиления) поставить резисторы (0.48К и 4К) тоже никакой разницы не будет ? или (0.33К и 2.77К) Я хочу понять, как вообще номиналы этих резисторов влияют на выходное сопротивление усилителя. А в принципе можно ли поднять выходное сопротивление усилителя? и нужно ли это делать для правильной работы АЦП, где рекомендуют 2.5К Может ответы на вопросы для кого-то и очевидны, заранее извиняюсь за свое невежество :) Вот из даташита на АЦП микроконтроллера:
  11. Как отразится изменение номиналов резисторов обратной связи с 1К и 8.2К на 24К и 200К, на выходном сопротивлении усилителя? выходное сопротивление усилителя увеличится или уменьшится? т.е. мне нужно сделать выходное сопротивление усилителя в пределах 2.5К В даташите на микроконтроллер написано, что выходное сопротивление источника должно быть 2.5К, но не более 10K. У Хоровица и Хилла: "Таким образом, с помощью обратной связи можно получить нужный выходной импеданс.", но как именно я не могу понять. Подскажите пожалуйста. Это осциллограмма сигналов до усилителя и после, с резисторами ОС 1К и 8.2К:
  12. помогли на сайте поддержки CCS В общем оказывается, что по умалчанию const у них используется для хранения переменных в ROM. А что бы был обычный си нужно было написать: #device ANSI //switch const meaning Так, сделал и все ошибки исчезли :) Вот дословный ответ c их сайта: By default in CCS, a 'const', is a ROM type to which a pointer can't be constructed. In ANSI C, a const is a variable in RAM, that is protected (if the hardware has such protection), against being modified. If ANSI is selected CCS attempts to switch the definition (but personally it is safer just to get rid of const).
  13. Похоже это косяк CCS C PIC Compiler. Установил MPLAB® XC Compiler, скомпилилось все нормально. Блин так неохота перелазить с одного компилятора на другой, когда уже написанна куча кода под CCS C PIC Compiler.
  14. Общение с BLE112 через RS232 с компом помощью BGLIB API наладил, приделал эти библиотеки к C++ Builder 6, с модулем общаюсь, тут все Ок. Но сделать тоже самое на PIC18F46J50 не получается, затык в компиляторе под этот PIC18, а именно CCS C PIC Compiler 5.049. Компилятор не хочет понимать следующую строку: typedef void (* ble_cmd_handler) (const void *); Она используется в исходниках BGLIB API. C++ Builder 6 эту строку воспринял нормально. уже сделал простой пример, он все равно не компилится, выдает такие ошибки: "Expecting an identifier" "Expecting a declaration" вот и вся программа: newmain22.c: ----------------------------------------------------------------------------- #include <18F46J50.h> typedef void (*ble_cmd_handler)(const void*); void main(void) { int a, b, c; a=2; b=2; c=a+b; } ----------------------------------------------------------------------------- "C:\Alex\PROGRAMS\PICC5049\CCSCON.exe" out="build/default/production" newmain22.c +FH +DF +CC +Y=9 +EA +DF +LN +T +A +M +J +EA +Z -P #__18F46J50=1 C:\Alex\MPLAB_PRJ_PCC\test_struct\test_struct.X\newmain22.c:3:59: Error#28 Expecting an identifier C:\Alex\MPLAB_PRJ_PCC\test_struct\test_struct.X\newmain22.c:3:64: Error#43 Expecting a declaration C:\Alex\MPLAB_PRJ_PCC\test_struct\test_struct.X\newmain22.c:3:65: Error#43 Expecting a declaration 3 Errors, 0 Warnings. Build Failed. Может кто знает как этому CCS C PIC компилятору объяснить что это за строка: typedef void (*ble_cmd_handler)(const void*); может ее можно както записать по другому? я честно ее не пойму
  15. Подскажите как нарисовать и поставить реперный знак на плату ? из поиска по форуму понял что для этого используется Fiducial, но как его ставить ? как компонент parts=symbol+cell в схему добавлять ? а в cell нарисовать как Fiducial ? P.S. DC/DV 7.9+EE7.9 Блин понял, Edit->Place, есть Fiducial, ставится так же как и дополнительные via. Спасибо :)