Fun Electronic

Электронные поделки, программирование микроконтроллеров, и прочая белиберда|Electronic Basteleien, Mikrokontroller Programmierung und anderes Quatsch

RSS
people

Мои инструменты: Logic Analyzer|Meine Werkzeuge: Logic Analyzer

[lang_ru]Сегодня мы поговорим об инструментах, которые могут нам пригодиться в столь интересном и увлекательном деле, как изобретение чего-нибудь интересного и увлекательного, и в данный момент речь пойдет об одном из моих самых свежих инструментов — логическом анализаторе.[/lang_ru]

[lang_de]Heute werden wir über die Werkzeuge sprechen, die uns in der so spannenden und interessnanten Sache wie Erfinden von etwas interessantes und spannendes helfen können. Und gerade jetzt sprechen wir über einen meiner letzten Werkzeuge — Logikanalysator[/lang_de]

[lang_ru]Старая добрая Википедия говорит нам,  что логический анализатор — это такое устройство, которе  предназначено для записи и анализа цифровых последовательностей. Вот, собственно, этим мой анализатор и занимается — записывает цифровые последовательности. [/lang_ru]

[lang_de]Alte gute Wikipedia sagt uns, dass «Ein Logikanalysator (engl. Logic Analyzer) ist ein elektronisches Gerät, das den Zeitverlauf von Signalen aus einer digitalen Schaltung bildlich darstellt.» Genau das mach mein Analysator — zeichnet die Signale auf, und später stellt die bildlich dar. [/lang_de]

[lang_ru]Так вот он, значит, выглядит с наружи:[/lang_ru]

[lang_de]So sieht das Gerät von Aussen: [/lang_de]

Логический анализатор - общий вид

[lang_ru]В принципе — ничего особенного — 8 проводов с щупами — зацепками (крассные) для снятия сигнала и 9-й — земля (черный).[/lang_ru]

[lang_de]Eigentlich — nichts besonderes — 8 Leitungen mit Tastköpfen für die Signale selbst (rot) und 9. Leitung für GND (schwarz) [/lang_de]

[lang_ru]Подключается этот чудный приборчик к USB порту и распознается как обычный последовательный порт, так как я использовал микросхему фирмы FTDI — FT232BM. Если взглянуть на схему прибора, то мы увидим, что там ничего особенного нету. Один микроконтроллер ATMega 128, и USB контроллер FT232BM.[/lang_ru]

[lang_de]Man schließt das Wundergerät an USB Port am PC an. Und das wird als virtuelles COM-Port erkannt. Weil ich hier einen USB <-> Seriellen Konverter benutzt habe. FTDI FT232BM. Wenn wir die Schaltung anschauen, dann werden wir nicht viel da sehen. Einen Mikrokontroller ATMega 128 und USB Kontroller FT232BM. [/lang_de]

[lang_ru]Светодиоды около USB порта показывают текущее состояние работы прибора.[/lang_ru]

[lang_de]Die LEDs, die neben dem USB Konnektor platziert sind, zeigen uns, was das Gerät gerade macht. [/lang_de]

  • [lang_ru]P — Power — Ну тут все ясно — питание есть — уже хоршо.[/lang_ru]
  • [lang_de]P — Power — Hier ist alles klar — Strom gibt es, habe Sache ist erledigt.[/lang_de]
  • [lang_ru]A — Armed — На взводе — ждем нужное событие, что бы продолжить — об этом дальше.[/lang_ru]
  • [lang_de]A — Armed — Bereit — warten auf den bestimten Erreignis, um weiter zu arbeiten.[/lang_de]
  • [lang_ru]T — Triggered — Дождались — нужное событие произошло — пошла запись.[/lang_ru]
  • [lang_de]T — Triggered — Erreignis ist passiert — die Aufzeichnung läuft.[/lang_de]
  • [lang_ru]S — Send — Шлем посылки — запись закончилась — отсылаем.[/lang_ru]
  • [lang_de]S — Send — Senden die Pakete — die Aufzeichnung ist zu Ende — senden[/lang_de]

[lang_ru]Ну и вот так вот прибор выглядит изнутри:[/lang_ru]

[lang_de]Und so sieht das Gerätchen innen drin: [/lang_de]

Внутренности логического анализатора - вид сверху
Внутренности логического анализатора - вид снизу

[lang_ru]Естественно, что для работы данного устройства необходима прошивка — программа, которая для нас будет записывать состояния сигналов и отправлять их нам.[/lang_ru]

[lang_de]Natürlich, für die richtige Funktionierung braucht das Gerät eine Frimware — das Programm, das für uns die Aufzeichnungen der Signalen machen wird und an uns senden wird. [/lang_de]

[lang_ru]Писал я эту программку, что называется, на коленке, по этому там довольно мало комментариев, но на основным моментах мы сейчас остановимся.[/lang_ru]

[lang_de]Das Programm habe ich, wie man sagt, «auf der Schnelle» zusammen gebaut. Desswegen gibt es da nicht so viel Kommentaren. Aber die wichtigste Puntknte werden wir jetzt durchgehen.[/lang_de]

[lang_ru]Основная часть программы, которой вы скорее всего заинтересуетесь, это сама процедура записи сигнала с пробников.[/lang_ru]

[lang_de]Das wichtigste Teil des Programms, über die Sie sich wahrscheinlich interessieren werden, ist die Funktion der Aufzeichnung der Signale[/lang_de]

[lang_ru]На схеме эта часть выглядит вот так:[/lang_ru]

[lang_de]Auf dem Schaltplan sieht das Teil so aus: [/lang_de]

Схема логических входов

[lang_ru]В принципе — ничего сложного. Многие читатели заметят — что на входах нет никакой защиты. Да — нету. И на это есть у меня пара отговорок. 1 — делалось все побыстрому, хотелось поскорее посмотреть сигнал на одной из платок моих. 2 — я то знаю, что там нету защиты никакой, поэтому не пихаю куда попало.[/lang_ru]

[lang_de]Im Prinzip — nichts kompliziertes. Manche Leserinen und Leser werden merken — es gibt keinen Eingangsschutz. Ja — gibt es keine. Aber dafür gibt es von mir einpaar Aussagen: Erstens — ich habe den Werkzeug «auf der Schnelle» gemacht, um eine andere Projekt zu untersuchen. Und zweitens — ich weiss, dass da keine Eingangsschutz gibt, und deswegen stecke ich die Tastköpfe nirgenwo rein, wo ich nicht weiss, was da für eine Spannung ist.  [/lang_de]

[lang_ru]Так вот — схема простая — и все, что нам надо — считывать порт PORTC в программе. Процесс считывания происходит в функции прерывания таймера.[/lang_ru]

[lang_de]Also, die Schaltung ist ganz einfach. Alles was wir brauchen ist im Programm nur den PORTC auslesen. Das Lesevorgang ist in der Timer-Funktion passiert.[/lang_de]

[codesyntax lang="c" lines_start="96" container="div" title="Probe reading part" ]

SIGNAL(SIG_OVERFLOW1)
{
 u08 register bByte;
 outp(AnalyzerConfig.u16TimerCounter.bytes.high, TCNT1H);	// load counter value hi
 outp(AnalyzerConfig.u16TimerCounter.bytes.low,  TCNT1L);	// load counter value lo
 if (!gFlags.bDataHere)
 {
   // PORTB = PINB | 0x02;
   bByte = ANALYZER_PINS;
   if (!gFlags.bTrigger && !gFlags.bStopTriggering)
   {
     if (AnalyzerConfig.bTriggerType != TT_NO_TRIGGER)
     {
       if (AnalyzerConfig.bTriggerType == TT_FALLING_EDGE)
       {
         if (
                (bOldByte & bTrigMask)
             && ((bByte & bTrigMask) == 0)
            )
         {
            gFlags.bTrigger = 1;
         }
       }
       else
       {
         if (
                 ((bOldByte & bTrigMask) == 0)
              && (bByte & bTrigMask)
            )
         {
            gFlags.bTrigger = 1;
         }
       }
     }
     else
     {
       gFlags.bTrigger = 1;
     }
     bOldByte = bByte;
   }
   bAnalyze[wAnWriteIndex] = bByte;
   if (gFlags.bTrigger && !gFlags.bStopTriggering)
   {
     LED_TRIGGER_ON;
     LED_ARMED_OFF;
     if(wAnWriteIndex < AnalyzerConfig.wMaxBytesToStore - 1)
       wAnWriteIndex++;
     else
     {
       gFlags.bDataHere = 1;
       gFlags.bStopTriggering = 1;
     }
   }
   else
   {
     LED_TRIGGER_OFF;
   }
   // PORTB = PINB & ~0x02;
 }
}

[/codesyntax]

[lang_ru]  Вся процедура чтения состоит из двух частей — с 103-й по 136-ю строку определяется событие, надо ли ждать его, если надо, то наступило ли оно или еще нет. И второая часть с 138-й по 153-ю строки — тут происходит, собственно, подсчет индексов массива,в который мы заранее сохранили значение порта на строке 137, которое, в свою очередь, считали еще раньше — в самом начале нашей функции прерывания, на строке 105.[/lang_ru]

[lang_de] Ganze Lesevorgang besteht aus zwei Teilen — von 103. bis 136. Zeilen wird auf das Ereignis gewartet wenn nötig ist. Und zweite Teil von 138. bis 153. Zeile — hier wird die Calculation des Indexes des Arrays statt finden, in dem wir früher (am Anfang der Funktion auf der Zeile 105.) den PORTC Wert gespeichert haben. [/lang_de]

[lang_ru]В первой части определяется событие срабатывания, но только в том случае, если мы этого еще не определили. На это нам указывает флаг gFlags.bTrigger. Если он еще не установлен — то мы проверяем условие срабатывания, которым выступает изменение какого — либо бита данных, изменение с 0 в 1 или наоборот — с 1 в 0.[/lang_ru]

[lang_de]In dem ersten Teil wird auf das Auslösungsereignis gewartet, aber nur dann, falls das noch nicht passiert. Darüber sagt uns der Flag gFlags.bTrigger. Fals der Flag noch nicht steht, dann prüfen wir die Auslöserbedinung — Änderung des Bits von 0 zu 1 oder von 1 zu 0.[/lang_de]

[lang_ru]Эти параметры срабатывания задаются нашему устройству управляющей программой с компьютера. Но об этом попозже.[/lang_ru]

[lang_de]Diese Parameters sind in dem Controlprogramm einzustellen. Darüber werde ich hier später erzählen. [/lang_de]

[lang_ru]Далее, когда мы определились с условием срабатывания, во второй части функции происходит, собственно, сохранение информации и вычисление следующего элемента массива, куда будем сохранять следующую порцию информации.  И если мы сохранили достаточное количетсво этой самой информации, то вывешивается флаг, что данные собраны, мы закончили:  gFlags.bDataHere = 1; и gFlags.bStopTriggering = 1;[/lang_ru]

[lang_de]Weiter, wenn wir die Beidenung des Auslösers definiert haben und die Bedienung ist eingetretten, wird eigentliche Speicherung der Daten passieren, und es wird der nächste Elementeindex kalkuliert. Wen es genug Daten gespeichert wurde, wird ein Flag gesetzt, dass die Daten da sind, und es die Zeit ist, die loszuschiecken: gFlags.bDataHere = 1; und gFlags.bStopTriggering = 1;  [/lang_de]

[lang_ru]А отправка самих данных происходит в основной функции main ():[/lang_ru]

[lang_de]Das Senden ervolgt in der main (): [/lang_de]

[codesyntax lang="c" lines_start="72" container="div" title="Sending data"]

  if (gFlags.bDataHere)
  {
    LED_SEND_ON;
    uart_putchar(UART_SYNC_BYTE);
    uart_putchar(0xEF);
    uart_putchar(UART_SYNC_BYTE);
    uart_putchar(0x55);
    uart_putchar(wAnWriteIndex);
    uart_putchar(wAnWriteIndex >> 8);
    u16 i;
    u08 * bData = AnalyzerGetBuffer();
    for (i = 0; i <= wAnWriteIndex && gFlags.bDataHere; i++)
    {
      SWdtReset    = 1;
      uart_putchar(bData[i]);
    }
    wAnWriteIndex = 0;
    gFlags.bDataHere = 0;
    if (AnalyzerConfig.bTriggerType == TT_NO_TRIGGER)
    {
      gFlags.bTrigger = 1;
      gFlags.bStopTriggering = 0;
      LED_ARMED_ON;
    }
    else
    {
      if (AnalyzerConfig.bTriggerRepeat)
      {
        gFlags.bTrigger = 0;
        gFlags.bStopTriggering = 0;
        LED_ARMED_ON;
      }
    }
    LED_SEND_OFF;
  }

[/codesyntax]

[lang_ru]В самом начале мы отсылаем пару байт синхронизации, которые говорят управляющей программе, что сейчас пойдут данные, а не просто текст или что-либо еще. Затем мы так же отсылаем количество байт, чтобы на той стороне знали — сколько байт ждать. И затем, в цикле, отсылаем сами данные.[/lang_ru]

[lang_de]Hier werden erst einpaar Bytes weggeschickt, die werden der Kontrolporgramm sagen, dass gerade jetzt werden die Daten kommen, und nicht einen Text. Nach der Sync Bytes schicken wir die Länge der Daten, damit auf der anderen Ende wissen, wieviel Bytes von uns zu erwarten. Und dann, in einer Zyklus, werden die Daten geschickt.  [/lang_de]

[lang_ru]Вот собственно и вся функциональность самого прибора.[/lang_ru]

[lang_de]Dass ist die funktionalität des Gerätes. [/lang_de]

[lang_ru]Еще немного можно рассказать про установку параметров от управляющей программы.[/lang_ru]

[lang_de]Ganz kurz über die Einstellungen der Parameters bei dem Kontrolprogramm. [/lang_de]

[lang_ru]Прием данных сделан с использованием прерывания UART.[/lang_ru]

[lang_de]Datenempfang ist mit der Hilfe des UART Interrupts gemacht wurde. [/lang_de]

[codesyntax lang="c" lines_start="95" container="div" title="UART Interrupt"]

/* signal handler for receive complete interrupt */
SIGNAL(SIG_UART0_RECV)
{
    uart_rxd_buffer[uart_Write_in_Index] = UDR0;
    if (uart_rxd_buffer[0] == UART_SYNC_BYTE)
    {
      //*uart_rxd_in_ptr = ~(*uart_rxd_in_ptr);
      uart_Write_in_Index++;
      if (uart_Write_in_Index >= sizeof(TCommData))
      {
         LED2_OFF;
         LED3_OFF;
         LED4_OFF;
         ProcessData((TCommData *)uart_rxd_buffer);
         uart_Write_in_Index = 0;
         uart_rxd_buffer[0] = 0;
      }
      if(uart_Write_in_Index >= UART_BUF_SIZE)
       uart_Write_in_Index = 0;
    }
    else
    {
      uart_Write_in_Index = 0;
    }
}

[/codesyntax]

[lang_ru]Сдесь мы принимаем данные до тех пор, пока не забъется весь приемный буфер. Причем, прием начнется только тогда, когда мы примем байт синхронизации. Т.е. так мы отсекаем всякий мусор. Когда буфер набъется необходимым количеством байтиков — проводим разбор этих самых байтиков:[/lang_ru]

[lang_de]Hier empfangen wird die Daten bis der Buffer voll ist. Der Empfang startet nur, wenn wir ein Syncbyte empfangen werden. Damit wird jeglicher Mühl und Rausch aussortiert. Wenn Buffer voll wird, werden die empfangene Daten untersucht:[/lang_de]

[codesyntax lang="c" lines_start="222" container="div" title="Processing UART data"]

void ProcessData(TCommData * CommData)
{
  if (CommData->bSyncByte == UART_SYNC_BYTE)
  {
    switch (CommData->bCmd)
    {
      case UART_TRIGGER_RESET:

      break;
      case UART_TRIGGER_SET:
        AnalyzerConfig.bTriggerBit           = CommData->AnCfg.bTriggerBit;
        AnalyzerConfig.bTriggerType          = CommData->AnCfg.bTriggerType;
        AnalyzerConfig.bTriggerRepeat        = CommData->AnCfg.bTriggerRepeat;
      break;
      case UART_TIMER_SET:
        AnalyzerConfig.bTimerPrescaler       = CommData->AnCfg.bTimerPrescaler;
        AnalyzerConfig.u16TimerCounter.value = CommData->AnCfg.u16TimerCounter.value;
      break;
      case UART_SET_WIDTH:
        if (CommData->AnCfg.wMaxBytesToStore <= AN_MAX_ANALYZES_BUFFER)
        {
          AnalyzerConfig.wMaxBytesToStore      = CommData->AnCfg.wMaxBytesToStore;
        }
      break;
      case UART_SET_ALL:
        AnalyzerConfig.bTimerPrescaler       = CommData->AnCfg.bTimerPrescaler;
        AnalyzerConfig.u16TimerCounter.value = CommData->AnCfg.u16TimerCounter.value;

        AnalyzerConfig.bTriggerBit           = CommData->AnCfg.bTriggerBit;
        AnalyzerConfig.bTriggerType          = CommData->AnCfg.bTriggerType;
        AnalyzerConfig.bTriggerRepeat        = CommData->AnCfg.bTriggerRepeat;

        if (CommData->AnCfg.wMaxBytesToStore <= AN_MAX_ANALYZES_BUFFER)
        {
          AnalyzerConfig.wMaxBytesToStore      = CommData->AnCfg.wMaxBytesToStore;
        }
      break;
    }
    AnalyserSetupTimer();
  }
}
[/codesyntax]

[lang_ru]Ну тут особого ничего нету — обычное присваивание с одной структуры в другу. [/lang_ru]

[lang_de]Hier gibt es nichts besonderes, nur Zuweisungen aus einer Strukt in eine andere. [/lang_de]

[lang_ru]Но это все происходит в нашей маленькой черненькой коробочке и не так захватывающе, потому, что нашему глазу мало чего видать. А теперь поговорим об управляющей программе, Front end, так сказать.[/lang_ru]

[lang_de]Das Ganze ist aber nur in diesem kleinen schwarzen Körbchen passiert und nicht so spanned, wiel man sieht nicht viel. Und jetzt erzähle ich über das Kontrolprogramm, das Frontend [/lang_de]

[lang_ru]Вот так выглядит основное окошко программы:[/lang_ru]

[lang_de]So sieht das Hauptfenster des Programms aus: [/lang_de]

Главное окно программы

[lang_ru]В принципе — все довольно просто. Слева внизу выставляется количество каналов, которые будем смотреть. Сама программа расчитана на максимум 16 каналов, но наша маленькая коробочка пока что шлет нам всего 8.[/lang_ru]

[lang_de]Im Prnizip — alles ist einfach. Links unten kann man die Anzahl der Kanäle einstellen. Maximale Anzahl bei dem Programm ist 16, aber unser Gerät unterstützt und sendet nur 8 dafon. [/lang_de]

[lang_ru]Чуть ниже можно увеличить или уменьшить представление сигналов. Правее идет группа установки события — Trigger. В ней можно выбрать номер канала, на котором ждать события, выбрать вид события — с 0 в 1 — Rising edge, с 1 в 0 — Falling edge, или вообще не ловить события. Галочка Repeat triggering говорит программе, что неплохо было бы за одним пойманным событием сразу ждать следующего.[/lang_ru]

[lang_de]Ein bisschen unten sind die Vergrößerungs- und Verkleinerungsknöpfe. Weiter rechts ist die Gruppe der Ereignissenstellungs — Trigger. In der Gruppe kann man den Kanal wählen, auf welchem auf das Ereignis gewartet wird, den Ereignistype wählen — von 0 zu 1 - Rising edge oder von 1 zu 0 Falling edge oder überhaupt nicht darauf warten. Häckhen Repeat triggering sagt dem Gerät, dass es nicht schlechе wäre, nach dem gefangenen Ereigniss, auf einen weiteren zu warten.[/lang_de]

[lang_ru]Кнопочка Set в этой группе посылает команду прибору на установку только этого параметра.[/lang_ru]

[lang_de]Knopf Set in der Gruppe sendet den Befehl zu dem Gerät und setzt nur diesen Parameter. [/lang_de]

[lang_ru]Следующая группа Sampling устанавливает параметры сэмплирования — частоты чтения пробников. Sample time — это время задержки, с которой будет происходить счетние сигналов. Его можно установить грубо с помощью ползунка, что чуть ниже, и более точно с помощью кнопочек вверх/вниз, что справа. Диапазон значений от 5 микросекунд до 10 секунд.[/lang_ru]

[lang_de]Die nächste Gruppe  Sampling setzt die Paramers des Samplings — die Frequenz des Auslesen der Tastköpfe. Sample time ist die Wartezeit, nach dem das nächste Lesen passiert. Die kann man grob mit der Hilfe des Schiebers einstellen, der ein Stuck nach unten ist, oder genauer, mit der Tasten «Nach Oben» und «Nach Unten», auf der rechten Seite des Eingabefeldes. Minimaler Wert ist 5 Mikrosekunden. und maximaler ist 10 Sekunden[/lang_de]

[lang_ru]Кнопочка Set Timer в этой группе посылает команду прибору на установку только этого параметра. Причем в программе происходит расчет регистров таймера самого микроконтроллера, и прибору уже посылаются именно эти значения.[/lang_ru]

[lang_de]Knöpfhen  Set Timer in der Gruppe sendet den Befehl zu dem Gerät und setzt nur diesen Parameter. Interessant ist, dass die Kalkulation der Werte des Timers passiert in dem Programm, und gesendet werden schon nur die Registerwerte, die im Gerät direckt übernommen werden.[/lang_de]

[lang_ru]Samples — количество чтений в одной посылке данных, которое будет прочитано, прежде чем данные будут посланы прибором в программу. Диапазон значений от 1 до 3072.[/lang_ru]

[lang_de]Samples — Anzahl der Auslese in einer Sendung, die erst gelesen werden, und anschließend vom Gerät zum Programm gesendet. Minmal is 1, maximal ist 3072.[/lang_de]

[lang_ru]Значения можно вбить с клавиатуры или выставить кнопочками вверх/вниз.[/lang_ru]

[lang_de]Die Werte kann man vom Tastatur eintippen, oder mit der Tasten «Nach Oben» und «Nach Unten», auf der rechten Seite des Eingabefeldes ändern. [/lang_de]

[lang_ru]Ну и большая кнопка, мимо которой просто не промахнуться — Set All. Позволяет установить все параметры сразу одним махом.[/lang_ru]

[lang_de]Und die ganz große Taste - Set All. Sended alle Parameters zu dem Gerät in einem Rutsch. [/lang_de]

[lang_ru]Чуть правее находится информационное поле Time/Div, в котором выводится текущее разрешение экрана каналов, т.е. цена одного деления в секундах.[/lang_ru]

[lang_de]Weiter rechts ist ein Informationsfeld Time/Div, in dem gegenwärtige Auflösung des Kanalbildschirmes angezeigt wird. Sekunden pro Kästchen. [/lang_de]

[lang_ru]И еще чуть правее — просто различная отладочная информация, что бы знать, где искать ашипки.[/lang_ru]

[lang_de]Und ganz recht — einige Debugmeldungen für mich. [/lang_de]

[lang_ru]В меню ничего особенного нету, разве что только настройки — Communication Settings:[/lang_ru]

[lang_de]Im Menü gibt es nicht viel interessantes, nur die Einstellungen der Kommunikation — Communication Settings: [/lang_de]

Настройки последовательного порта

[lang_ru]Ну тут все понятно. Для нашего прибора надо выбрать сам порт. Его номер узнаем, когда, открыв в «менеджере устройств» компьютера ветку Com ports, воткнем наш прибор в USB порт. Он должен распознаться и появиться в этой ветке. Вот его номер и заносим сюда. Скорость — 128000. 1 стоповый бит, без четности. 8 бит на байт. Вот собственно и все.[/lang_ru]

[lang_de]Hier ist alles klar. Man mus für unseren Gerät einen Port wälen, dessen Nummer bringt uns der Gerätemanager. In dem muss man den Punkt «Anschlüße (COM und LPT)» wälen. Hier taucht unser USB <-> Seriel Converter auf, wenn wir das Gerät an dem PC's USB Port anschließen.[/lang_de]

[lang_ru]В сам текст программы особо вдаваться не будем, так как это уже программирование под виндовс, в котором я особо не силен. Но если будут вопросы у вас — то готов их освятить в следующих выпусках.[/lang_ru]

[lang_de] In den Programmtext werden wir uns nicht vertiefen, da es schon Programmierung unter Windows ist, in dem ich nicht so stark bin. Aber wenn jeman eine Frage darüber hat, gerne würde ich die in weiteren Folgen und Artikeln auf meiner Seite antworten. [/lang_de]

[lang_ru]Программа написана на Borland C++ Builder 5, и может так получиться, что без некоторых библиотек не запустится, поэтому рекомнедую их скачать тоже.[/lang_ru]

[lang_de] Das Programm wurde mit der Hilfe des Borland C++ Builder 5 erstellt, und es kann passieren, dass das einige Bibliotheken verlangen wird. [/lang_de]

[lang_ru]Ну и как обычно — список файлов, описанных в этом выпуске:[/lang_ru]

[lang_de]Und wie immer, am Ende der Story, die Liste der Dateien, die hier erwähnt wurde:  [/lang_de]

15 комментариев to “Мои инструменты: Logic Analyzer|Meine Werkzeuge: Logic Analyzer”

  1. vesel Says:

    Спасибо за конструкцию,отличная вещь. Давно хотел подобное сварганить да только вот программирование для «большого брата» останавливало. Максимум что могу так это на VBA под SQL «морду» сделать. Обидно что не прочитал сразу отзывы а развел плату без кварца (посмотрел что 8мгц на схеме) и включил внутренний генератор. Пришлось внешний генератор подключать ))

    То что на 128 меге построено — отлично. Не задумывались добавить и считывание АЦП ? Удобственно выглядело бы еще и видеть например напряжение или еще что либо )) Удачи. Еще раз спасибо за конструкцию.

  2. MasterAlexei Says:

    Классно, что железка оказалась полезной.

    Про АЦП — хм. Пока не думал, так как все же АЦП — это уже немного другой прибор, другая схемотехника должна быть и т.д. Вот чего я сейчас с этим анализатором делаю — так это SPI докручиваю. Теперь он у меня будет как SPI логгер, тестер. Т.е. можно будет либо послать пару тройку байт в SPI либо считать их. Все, что нужно будет — это добавить проводок до PB1 (SS) пина, да и то, это если нужна возможность работы в режиме Slave.

    Ну и перепрошить контроллер. GUI тоже изменится немного, но не сильно. Так что ждите, скоро будет!

  3. vesel Says:

    ЫЫЫЫ )))

    Видать не зря я при разводке платы вывел SPI разьемчик ))) Не зряяя)))

  4. Мои инструменты: Logic Analyzer V. 2.0 | Fun Electronic Says:

    [...] Ну я не долго думал и малость усовершенствовал свой Логический анализатор и добавил к нему новую [...]

  5. Новая версия Логического Анализатора, с возможностью добавления плагинов | Fun Electronic Says:

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

Leave a Reply

You must be logged in to post a comment.