Многоканальный логический анализатор на логических м/с

Недорогой USB логический анализатор — Сообщество «Электронные Поделки» на DRIVE2

Собственно в разработках очень часто не хватает не столько осциллографа, сколько логического анализатора. Сначала хотел сделать сам, но написание своего софта под комп показалось довольно трудоемким и сложным, и по сути изобретением велосипеда.

Поэтому стал искать на китайских сайтах недорогой USB логический анализатор — и нашел (например вот)
Через месяц это чудо пришло — но как анализатор работать не хотело ) Тогда стал искать в нете инфу по этому поводу и нашел вот эту статью, где все довольно хорошо расписано. Все сделал как в ней и было описано.

На всякий случай повторю все и здесь, мало ли тот ресурс закроют, а драйв будет жить ))Итак на самом деле то, что китайцы продают под видом логического анализатора на самом деле является отладочной платой для микроконтроллера CY7C68013A фирмы Cypress.

Его основная фишка в том, что у него нет своей памяти (кроме RAM) и программу а также VID и PID он считывает с внешней памяти. Таким образом его можно выдать за любое устройство (в том числе и за Saleae и USBee).

Первая проблема в том, что прошивки адаптеров Saleae и USBee требуют работы с внешней памятью меньшего размера чем устанавливают китайцы на плату (у меня она шла с памятью 128К). Итак нужно поставить микросхему памяти 24LC02B (2k) взамен стоящей AT24C128 (128к).

Несмотря на то, что одна микруха Атмеловская, а вторая Микрочиповская, расположение выводов у них одинаковое, так что одна выпаивается и вторая впаивается на ее место без проблем.Следующим шагом нужно сделать так чтобы можно было подключать микроконтроллер к компу с отключенной внешней памятью. Это нужно для того чтобы он вместо того чтобы считать VID и PID и программу с памяти и определиться как то, что там записано, определился как сам контроллер. Это нужно чтобы с помощью специальной программы от Cypress использовать этот микроконтроллер для прошивки этой самой внешней памяти.

Для того чтобы контроллер не мог общаться с внешней памятью автор статьи предлагает подключить линию SDA через ненужный для анализатора джампер J1. Что собственно я и сделал.

схема отладочной платы

Итак выпаиваются резисторы R7 и R8 (1), режется линия от джампера J1 к VCC (2)(4), припаивается перемычка (3) от 5-ой ноги (SDA) микросхемы памяти к паду резистора R8, который соединен с джампером J1.

Далее режется линия SDA (5) и прокладывается перемычкой новая (6) от контакта джампера, который сидел на VCC, до микроконтроллера.

Далее устанавливаем программу CySuiteUSB (есть в архиве в конце). Затем подключаем девайс с отключенной перемычкой. Если Винда семерка, то до подключения надо перезагрузиться и нажимая F8 выбрать пункт отключения проверки цифровой подписи драйверов.

Драйверы нужно ставить из папки Drivers (в архиве). Для семерки нужно указывать папку Driverwlh.
После установки драйвера появится устройство Cypress EZ-USB FX2LP No EEPROM. Далее возвращаем перемычку на место (не отключая устройства от компа) и запускаем USB Control Center.

Там выбираем Program FX2->Small EEPROM и выбираем файл saleae.iic или usbee.iicв (тоже в архиве) зависимости от того какой девайс хотим получить. После записи внизу в строке состояния появится Programming succeeded.Я прошил себе saleae.

Отключаем девайсДалее ставим программу Saleae Logic и подключаем девайс. В программе появится надпись Connected.

Сам контроллер питается от 3.3 вольт, но входы у него толерантны и к 5-и вольтам, но на всякий случай я всеже решил сделать буфферную плату на микросхеме 74lvc245 (печатка ее лежит в архиве)

она одевается на отладочную платку и получается такой бутербродик

Данный анализатор может распознавать следующие протоколы

ну и просто данные по 8-и каналам с частой до 24 Мгц. На счет 24 мегагерц я не проверял, но 200 килогерцовый шим при сважности 1% (т.е импульс длительностью 0,05 мкс что по сути соотвествует 20МГц) было видно.

Ссылка на Архив

Обновлено 07.09.14
Время идет вперед (свой анализатор я покупал 2-а года назад) и теперь есть за те же деньги клон логического анализатора Saleae , работающий без всяких доработок. За ссылку спасибо EXEcutorXS

Источник: https://www.drive2.ru/c/1299506/

Многоканальный логический анализатор

СОЮЗ СОВЕТСНИХ

СОЦИАЛИСТИЧЕСНИХ

РЕСПУБЛИН

А1 (19) (11) (Я>1С 06 Г ОО

ОПИСАНИЕ ИЗОБРЕТЕНИЯ

Н ABTOPCHGMV СВИДЕТЕЛЬСТВУ

ГОСУДАРСТВЕННЫЙ НОМИТЕТ СССР

ПО ДЕЛАМ ИЗОБРЕТЕНИЙ И ОТНРЫТИЙ (21) 3747195/24-24 (22) 30.05.84

:(46) 15,12.87. Бюл, № 46 (72) A.Н.Бучнев, И.П.Васильев, В.P.Ãoðoíoé, Е.И.Карпунин и Ю,П.Крылатых (53) 68 1.3(088.8) (56) Авторское свидетельство СССР

¹ 608126, кл. С 05 В 23/02, 1978.

Патент ClllA ¹ 4040025,кл .364-900, опублик. 1977. (54) (57) 1, МНОГОКАНАЛЬНЫЙ ЛОП1ЧЕСКИЙ

АНАЛИЗАТОР, содержащий блок запуска, блок управления, блок памяти, блок формирования адреса, мультиплексор, блок коммутации и преобразования уровней, группа выходов которого соединена с группой информационных входов блока памяти, разрешающим входом блока управления и первой группой информационных входов блока запуска, выход которого соединен со стробирующим входом блока управления, управляющий выход режима записи которого соединен с управляющим входом блока коммутации и преобразования уровней, выход выбора режима блока управления соединен с разрешающим входом блока формирования адреса, первая группа адресных выходов которого соединена с группой адресных входов блока памяти, выход переполнения памяти блока формирования адреса соединен с входом выбора режима блока управления, вторая группа адресных выходов блока формирования адреса соединена с группой адресных входов мультиплексора, группа информационных входов которого соединена с группой выходов блока памяти, а группа управляющих входов мультиплексора соединена с группой, разрешающих выходов блока управления, группа выходов управления блоком памяти которого соединена с группой входов выбора режима блока памяти, груп-. па выходов мультиплексора является группой информационных выходов анализатора, отличающийся тем, что, с целью расширения функциональных возможностей за счет обеспечения режима быстрого асинхронного анализа, он содержит блок временного контроля, группа информационных входов которого соединена с группой входов задания режима блока управления, группой информационных входов блока формирования адреса, группой инфбрмационных входов блока запуска, второй группой информационных входов мультиплексора и является группой входов задания режима анализатора, группа тактовых входов мультиплексора соединена с группой информационных выходов блока временного контроля, управляющий выход которого соединен с синхровходом блока управления, при этом блок временного контроля содержит счетчик-делитель, регистр выбора частоты, дешифратор, блок совпадения и кварцевый генератор, выход которого соединен с входом счетчикаделителя, группа выходов которого со- единена с первой группой входов блока совпадения, выход регистра выбора частоты соединен с входом дешифратора, группа выходов которого соединена с второй группой входов блока совпадения, выход которого является управляющим выходом блока временного контроля, группа выходов регистра выбора частоты является группой йнформационных выходов блока временного контроля, а группа входов регистра выбо13597 ра частоты является группой информационных входов блока временного контроля.

2. Анализатор по п.

1, о т л и— ч а ю щ и O с я тем, что блок запуска содержит каналы управления началом записи и концом записи и триггер разрешения записи, каждый из каналов управления содержит регистр маски, группой выходов соединенный с первой группой входов первого узла элементов И-НЕ, группа выходов которого подключена к первой группе входов узла сравнения, вторая группа входов которого соединена с группой выходов регистра начала записи и регистра конца записи соответственно, группа выходов узла сравнения подключена к группе входов второго узла элементов И-HE группа выходов которого соединена с группой входов элементов ИЛИ-НЕ, вторая группа информационных входов блока запуска соединена с группами входов регистров начала записи и конца записи и регистров маски начала записи и конца записи каналов управления началом и концом записи соответственно, первая группа информационных входов блока запуска соединена с второй группой входов первого узла элементов

И-НЕ каждого иэ каналов, выходы элементов ИЛИ-HE являются соответствующими входами триггера..

3. Анализатор по п.

1, о т л и— ч а ю шийся тем, что блок управления содержит узел захвата сигналов, узел выбора вида работ, узел управления началом и концом записи, узел переполнения памяти, узел выбора режима записи, первый вход которого является синхровходом блока управления, а второй вход — входом разрешения блока управления и соединен с вторым входом узла захвата сигналов, первый вход которого соединен с вторым выходом узла выбора режима записи и четвертым входом узла выбора вида работ, первая группа выходов кото рого соединена с первыми группами . выходов узла выбора режима записи, узла управления началом и концом записи, узла переполнения памяти и является группой разрешающих выходов блока управления, второй выход узла выбора вида работ является выходом

79 выбора режима блока управления, четвертая группа входов узла выбора ре-.

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

1 13597

Изобретение относится к вычислительной технике, а именно к устройствам контроля и диагностики ЭВМ.

Целью изобретения является рас—

5 ширение функциональных возможностей анализатора за счет обеспечения режима быстрого асинхронного .анализа, На фиг.1 изображена блок-схема многоканального логического анализатора; на фиг,2 — блок-схема блока временного контроля; на фиг.3 — блоксхема блока запуска; на фиг.4 блок-схема блока управления;на фиг.

5— блок-схема узла переполнения памяти; на фиг.6 — блок-схема узла управления началом и концом записи; на фиг.7 блок-схема узла выбора режима записи; на фиг.8 — блок-схема узла захвата сигналов; на фиг.9 — блок-схема узла выбора вида работ;на фиг.10временная диаграмма записи; нафиг.11временная диаграмма чтения.

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

2 памяти, блок 3 управления, блок 4 запуска, блок 5 формирования адреса, мультиплексор 6 и блок 7 временного контроля. Управление работой анализатора осуществляется с пульта микропрограммного управления (условно показаны шины 8 управления).

Блок временного контроля (фиг.2) содержит кварцевый генератор 9,счетчик-делитель 10, схему 11 совпадения, регистр 12 вы(ора частоты и дешифратор 13.

Блок запуска (фиг.3) состоит из регистра 14 маски начала записи и регистра 15 маски конца записи, узлов элементов И-НЕ 16 и 17, узлов

18 и 19 сравнения, регистров 20 и

21.начала записи и конца записи соответственно, узлов элементов И-НЕ 22 и 23, элементов ИЛИ-НЕ 24 и 25 и

45 триггера 26 разрешения записи.

Блок управления (фиг.4) содержит узел 27 выбора режима записи, узел

28 захвата сигналов, узел 29 выбора

БО вида работ, узел 30 управления началом и концом записи и узел 3 1 переполнения памяти. разом;

Контролируемые сигналы проверяемого прибора (в частности микроЭВИ) поступают через блок 1 коммутации и преобразования уровней на вход блока

2 памяти. Эти же сигналы параллельно поступают на блок 4 запуска, в котором происходит совпадение кода,задаваемого с пульта микропрограммного управления, с кодом, который информирует о состоянии шин проверяемого. прибора,.в результате чего на выходах блока появляются либо не появляются сигналы разрешения записи

Узел 31 переполнения памяти (фиг.5) содержит триггеры 32 и элемент И 33.

Читайте также:  Управление rgb-прожекторами

Узел 30 управления началом и кон. цом записи (фиг.6) содержит тригге79 2 ры 34 и 35, элементы И 36 и 37 и элемент ИЛИ 38.

Узел 27 выбора режима записи (фиг.7) содержит триггеры 39, 40 и

41 и элементы И 42, 43 и 44.

Узел 28 захвата сигналов (фиг.8) содержит элементы И-НЕ 45 и 46, триггеры 47. и 48 и элементы И 49 и 50..

Узел 29 выбора вида работ (фиг.9) содержит триггер 51, элемент ИПИ 52, элементы И 53 и 54, буферный усилитель 55, элементы ИЛИ 56-59 и формирователь 60 импульса.

Пульт микропрограммного управления формирует два типа временных диаграмм (фиг.10 и 11).

Временные диаграммы, показанные на фиг.10, описывают процедуру записи в регистр состояния (триггеры .

32, 34, 35, 40, 41, 5 l в блоке 3 управления и регистр 12 в блоке 7 временного контроля), в регистр адреса (в блоке 5 формирования адреса), в регистр 14 маски начала записи, в регистр 15 маски конца записи и в регистры 20 и 21 начала и конца записи (в блоке 4 запуска).Для этого на информационных выходах пульта микропрограммного управления устанавливаются данные и выдается соответствующий строб ЗП.

Временные диаграммы на фиг.11 описывают процедуру чтения из блока 2 памяти регистра адреса и регистра состояния. Для этого с пульта микропрограммного управления выдаются два потенциальных сигнала С ЧТ I .ЧТ 2 и строб чтения ЧТ, управляющие мультиплексором 6. В течение действия строба ЧТ на входы блока микропрограммного управления поступают достоверные данные.

Анализатор работает следующим об3 13597 и запрещения записи, которые затем подаются в блок 3 управления, который может обеспечивать два режима записи: запись временных соотношеI ний и логический анализ (диагностическая трассировка).

Первый режим записи осуществляется при наличии сигнала разрешения записи с блока 4 запуска по сигналу из блока 7 временного контроля с частотой, программно устанавливаемой по шине 8 °

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

Анализатор накапливает информацию о состоянии проверяемого прибора в

1024 тактах перед остановом, осущест- 25 вляемым по сигналу “Конец записи” из блока 4 запуска, по сигналу “Начало записи” из блока 4 запуска либо выборочно по двум этим условиям. Состояния проверяемого прибора определяются значениями сигналов на шинах и в дополнительных точках проверяемого прибора, доступных с помощью пробников (зондов).

Анализатор имеет два вида работы: запись-контроль сигналов с шин проверяемого прибора и пробников и, чтение-анализ записанной информации.

Переход в режим чтения-анализа о уществляется по сигналам, которые формируются в блоке 3 управления:

“Переполнение памяти”, “Конец записи”. Информация о состоянии диагностируемого прибора считывается иэ блока 2 памяти через мультиплексор

6, через который можно читать, и ре- 45 гистры логического анализа, доступные по чтению.

В блоке 7 временного контроля сигнал с кварцевого генератора 9 поступает на вход счетчика-делителя 10, на выходе которого получаются сигналы кратной частоты, которые подаются на схему 11 совпадения, на другой вход которой с дешифратора 13 поступает сигнал, соответствующий коду, записанному в регистр 12 выбора частоты. Таким образом:, на выходе схемы совпадения выделяется сигнал

АД 3г PrNH О РгНАД

Сос Y QPrNH Q PrHY

АД „PrNK 9 РгКАД

Сос 73, PrMK g PrKY сигналы н а линиях адрес— данные проверяемого устройства; сигналы на управляющих шинах проверяемого устройства; регистр маски условия начала для линий адрес— данные проверяемого устройства; регистр маски условия на.чала для линий управления проверяемого устройства; регистр задания условия начала для линий адрес.— данные проверяемого устройства; регистр задания условия начала для управляющих линий проверяемого устройства; где АД—

Сос. Y—

РгМН, PrMH т

РгНАД—

PrHY

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

В блоке 4 запуска по сигналам, по-. ступающим по шине 8, происходит запись в регистры 14 и 15 масок, а также в регистры 20 и 21 начала записи и конца записи соответственно. Информация с шин проверяемого прибора поступает на входы узлов элементов

И-НЕ 16 и 17, где происходит поразрядное маскирование. Далее с выходов элементов И-НЕ 16 и 17 сигналы поступают на входы узлов сравнения 18 и 19, на вторые входы которых поступают коды начала записи и конца записи с шины 8 через регистры 20 и 2 1.

Далее происходит сравнение кодов, свертка на элементах И-НЕ и ИЛИ-HE

22, 23, 24 и 25 и на выходе элементов 24 и 25 вырабатываются два сигнала Разрешение записи” и “Запрещение эаписи”.Эти два сигнала имеют уровень логической единицы тогда, когда выполняются условия:

Таким образом, запуск анализатора может осуществляться не только по

PrMK

Ф

РгИК

РгКАД—

PrKY

5 135 регистр маски условия конца для линий адрес— данные проверяемого устройства; регистр маски условия конца для линий управления проверяемого устройства; регистр задания условия конца для линий адрес— данные проверяемого устройства; регистр задания условия конца для управляющих линий проверяемого уст-. ройства; конъюнкция для каждого разряда адресов — данных и линий управления.

9779

6 любому сигналу проверяемого прибора, но и по любому сочетанию контролируемых сигналов.

Многоканальный логический анализатор позволяет осуществлять поиск неисправностей не только функционального характера, но также и неисправностей, связанных с ошибками временного характера.

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

1359779

1359779

1359779

Фиг. 10

Н7

Составитель С.Старчихин

Редактор А.Лежнина Техред М.Ходанич Корректор И.Патай

Заказ 6154/50 Тираж 671 Подписное

ВНИИПИ Государственного комитета СССР по делам изобретений и открытий

113035, МОсква, Ж-35, Раушская наб;,,д.4/5

Производственно-полиграфическое предприятие, r.Óæãoðîä, у . р л.П оектная 4

        

Источник: http://www.FindPatent.ru/patent/135/1359779.html

Многоканальный логический анализатор. Часть 1 – Характеристики и схемотехника

» Схемы » Измерения

13-05-2012

В статье мы рассмотрим характеристики и устройство дешевого и простого многоканального логического анализатора для радиолюбителей и полупрофессионалов.

Аппаратная часть прибора представляет собой модуль, который подключается к персональному компьютеру или ноутбуку.

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

Основные характеристики прибора:

  • до 32 входных каналов;
  • память 128 КБайт на каждый канал;
  • частота дискретизации до 100 МГц;
  • вход внешнего тактирования;
  • все входы совместимы с 3.3 В и 5 В логикой;
  • настраиваемый размер буфера предвыборки/поствыборки кратный 8 КБайт;
  • 16 битный генератор внутренней синхронизации;
  • несколько режимов внутренней синхронизации;
  • программируемая задержка синхронизации;
  • программируемый счетчик событий синхронизации;
  • вход внешней синхронизации;
  • коммуникация с ПК по LPT (EPP режим) или USB интерфейсу;
  • несколько версий приложений для ПК под различные операционные системы.

Основным элементом логического анализатора является ПЛИС XC95288XL, производства компании Xilinx, которая и выполняет все основные функции. Принципиальная схема прибора изображена на Рисунке 1.

Рисунок 1. Принципиальная схема многоканального логического анализатора (версия 1.1)

В качестве источника тактовой частоты для ПЛИС используется осциллятор IC4 (IC6), позаимствованный со старой материнской платы компьютера. Несмотря на то, что осциллятор рассчитан на работу при напряжении 5 В, проблем в работе прибора при питании его напряжением 3.3 В выявлено не было.

Для хранения выборок используется внешнее быстродействующее ОЗУ – микросхема AS7C33128.

Для питания прибора используется внешний источник с выходным напряжением до 15 В. ПЛИС и ОЗУ имеют напряжение питания 3.3 В, поэтому установлен регулятор напряжения 3.3 В серии LD1117DT33.

Коннектор параллельного порта K7 размещен на плате логического анализатора и подключен непосредственно к ПЛИС. Печатная плата логического анализатора двухсторонняя, используются компоненты для поверхностного монтажа и обычные компоненты с выводами. Вид печатной платы показан на Рисунке 2.

Рисунок 2. Вид печатной платы логического анализатора (версия 1.1)

Замечание. Вместо вывода 40 (Vss) микросхемы SRAM к «земле» подключен вывод 39 этой микросхемы. Решение: соединить на печатной плате вывод 39 и 40 вместе (вывод 39 не используется в микросхеме SRAM).

Для подключения к персональному компьютеру по интерфейсу USB необходимо использовать специальный адаптер, схема которого изображена на Рисунке 3.

Рисунок 3. Принципиальная схема адаптера USB интерфейса для логического анализатора (версия A 1.1)

Адаптер USB интерфейса для логического анализатора собран на микросхеме серии FT2232C производства компании FTDI. Данная микросхема объединяет в себе функциональность двух отдельных микросхем FT232BM и FT245BM. Она имеет два канала ввода/вывода, которые конфигурируются отдельно.

Основные моменты конфигурации FT2232C для применения в составе прибора – это питание от USB интерфейса и режим эмуляции шины микроконтроллера (MCU Host Bus Emulation mode). Этот режим конвертируется в протокол EPP посредством мультиплексора IC3 74HCT4053D.

Так как непосредственное декодирование сигналов /DST, /AST и RD/WR может вызывать конфликты таймингов, используется дополнительный сигнал A8, который используется в качестве сигнала RD/WR (чтение/запись) в периоды передачи данных по EPP протоколу.

Коннектор JTAG (CON2) используется для конфигурирования ПЛИС – это для будущих разработок, на текущий момент данный интерфейс не используется.

Микросхема EEPROM серии 93LC56 (IC2) хранит конфигурационные данные для микросхемы FT2232C и является обязательным элементом для правильного функционирования программируемого интерфейса. Для программирования данной микросхемы используется утилита FT_Prog (ранее она имела название MProg). Данная утилита и драйвера FT2232C доступны для скачивания на сайте компании FTDI.

Печатная плата адаптера разработана односторонней, что упрощает ее изготовление.

Рисунок 4. Вид рисунка печатной платы адаптера USB интерфейса (версия A1.1).

Существует также версия B 1.0 адаптера USB интерфейса (Рисунок 5). Данная версия отличается отсутствием коннектора JTAG и печатной платой, которая выполнена с учетом встраивания ее в корпус коннктора CANNON 25. Внешний вид собранных адаптеров а Рисунке 6.

Рисунок 5. Схема и печатная плата адаптера USB интерфейса для логического анализатора (версия B 1.0).
 a) b)
Рисунок 6. Внешний вид адаптера USB интерфейса версия A 1.1 (а) и версия B 1.0 (b)

Также имеется еще одна версия схемы логического анализатора (Рисунок 7), в которую уже интегрированы интерфейсы USB и LPT. Автором этого варианта является Bob Grieb и при разработке схемы использовалась среда TinyCAD, печатная плата для него разрабатывалась в редакторе FreePCB.

 Рисунок 7. Принципиальная схема второго варианта логического анализатора с интегрированным коммуникацонным интерфейсом USB и LPT (версия Bob Grieb)

Часть 2 – Прошивка ПЛИС, программное обеспечение для ПК

Загрузки

Проект (схема, печатная плата) логического анализатора (версия 1.1) – скачать
Проект Bob Grieb (схема, печатная плата) – скачать
Проект адаптера USB интерфейса (версия A 1.1) – скачать
Проект адаптера USB интерфейса (версия B 1.0) – скачать

minila.sourceforge.net

Источник: https://www.rlocman.ru/shem/schematics.html?di=133194

Записки программиста

Допустим, мы хотим отлаживать цифровую электронику. В предыдущих статьях я рассказывал об осциллографе Rigol DS1054Z, логическом анализаторе SUMP2 на базе iCEstick, а также плате Bus Pirate. Каждое из этих устройств поможет справится с задачей, но не то, чтобы слишком успешно.

DS1054Z имеет всего 4 канала и его возможности по декодированию протоколов довольно скромны. Bus Pirate лучше может в протоколы, и каналов у него побольше, но он медленный. SUMP2 быстрый и имеет 16 каналов, но с ним вам придется самим считать единички и нолики.

Неужели никак нельзя объединить сильные стороны этих устройств? Разумеется, можно! Иначе стал бы я начинать пост таким введением?

Что такое Sigrok?

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

Sigrok состоит из следующих частей:

  • libsigrok, ядро проекта, написанное на языке C, и состоящее в основном из драйверов для поддерживаемых устройств;
  • libsigrokdecode, библиотека, которая реализует декодирование различных протоколов (декодеры пишутся на Python);
  • sigrok-cli, консольная утилита, являющаяся фронтэндом к предыдущим двум библиотекам;
  • pulseview, GUI-фронтэнд, написанный на C++ и Qt;
  • sigrok-meter, GUI-фронтэнд для более удобного отображения медленно изменяющихся данных, например, температуры;
  • sigrok-dumps, коллекция записанных сигналов (файлы .sr) для тестирования декодеров и прочих целей;
  • sigrok-test, регрессионные тесты;

В рамках этой заметки Sigrok будет интересен нам, главным образом, как ПО для работы с логическими анализаторами. Однако не следует забывать, что Sigrok также может работать с другими устройствами, если они отдают полезные данные, и если кто-то написал драйверы для этих устройств.

Выбираем логический анализатор

Sigrok поддерживает многие логические анализаторы. Вот некоторые интересные в смысле цены/качества устройства:

  • Noname Saleae Logic Clone. 8 каналов, частота дискретизации 24 МГц, не имеет встроенной памяти, триггеры не поддерживаются (Sigrok попытается эмулировать их программно). Может быть неплохим вариантом, если вы не работаете с высокочастотными сигналами (скажем, разрабатываете только под AVR), или, если если вам нужно 20 недорогих устройств для обучения студентов. На eBay можно найти по запросу «24mhz 8 channel logic analyzer». Цена составляет около 7$.
  • Mcupro Logic16 Clone. 16 каналов, до 100 МГц (в зависимости от числа используемых каналов), есть сжатие передаваемых данных, памяти и триггеров нет. На eBay можно найти по запросу «100mhz 16ch logic analyzer». Устройство обойдется вам где-то в 40$.
  • DreamSourceLab DSLogic. 16 каналов, до 400 МГц при использовании 4 каналов, встроенная поддержка триггеров, по 2 мегабайта памяти на канал. Устройство появилось благодаря кампании на Kickstarter и является открытым железом. На eBay вы найдете его по запросу «dslogic». Цены на железку начинаются от 70$.

Fun fact! Еще есть проект очень маленького и полностью открытого логического анализатора Fx2grok. В готовом виде он нигде не продается, но вы можете изготовить его самостоятельно. Устройство имеет 8 каналов и частоту дискретизации 24 МГц. Как и Noname Saleae Logic Clone, устройство основано на чипе Cypress FX2.

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

Эксперименты с DSLogic

Итак, нам понадобятся следующие пакеты:

yaourt -S libsigrok-git sigrok-cli-git pulseview-git
  sigrok-firmware-dreamsourcelab-dslogic

Здесь приведены названия пакетов для Arch Linux. В других операционных системах и дистрибутивах Linux установка может отличаться. В крайнем случае, Sigrok не сложно собрать из исходников.

Важно! Приведенные пакеты могут быть не очень стабильны, поскольку они собираются из master-веток. Я лично решил собрать их в не самый удачный момент, в результате чего PulseView часто крэшился. Но уже через пару дней все починили. В случае чего попробуйте собрать чуть более старый код или попросите помощи в рассылке.

Далее подключаем логический анализатор по USB и проверяем, что Sigrok его видит:

В моем случае ответ был следующим:

sr: dreamsourcelab-dslogic: Failed to open potential device with
  VID:PID 2a0e:0021: LIBUSB_ERROR_ACCESS.

Для решения проблемы говорим:

sudo sh -c “echo 'SUBSYSTEMS==”usb”, ATTRS{idVendor}==”2a0e”, “
“ATTRS{idProduct}==”0021”, MODE:=”0666″' > “
“/etc/udev/rules.d/99-dslogic.rules”

Переподключаем устройство и проверяем, что теперь все работает.

Для просмотра всех доступных опций конкретного устройства (оно должно быть подключено) говорим:

sigrok-cli –driver dreamsourcelab-dslogic –show

Хорошо, давайте уже наконец запишем каких-нибудь сигналов! Я решил начать с сигналов, передаваемых между отладочной платой Nucleo-F411RE и OLED-экранчиком на базе SSD1306, работающего по 4-wire SPI:

Как видите, устройства и провода зафиксированы на столе при помощи изоленты. Это существенно снижает вероятность того, что какой-то проводочек где-то случайно отойдет, и потом придется час разбираться, почему вместо ожидаемого сигнала мы видим какой-то мусор.

Впервые этот прием я увидел на YouTube-канале OpenTechLab. Канал, к слову, совершенно топовый, и я всячески рекомендую на него подписаться. В частности, про Sigrok я узнал из этого канала. Что не удивительно, так как канал ведет Joel Holdsworth, автор PulseView.

Для записи сигналов я бы советовал использовать sigrok-cli. PulseView это тоже умеет, но не слишком хорошо (есть некоторые баги), во всяком случае, на момент написания этих строк. Уверен, со временем его доведут до ума, но пока проще сделать запись с помощью sigrok-cli и посмотреть результат в PulseView.

Выполняем следующую команду:

sigrok-cli –driver dreamsourcelab-dslogic
  –config 'voltage_threshold=1.6-1.6:samplerate=10MHz:continuous=on'
  –channels '0=CLK,1=MOSI,2=DC,3=CS' –continuous
  –output-file ~/temp/ssd1306-spi.sr

Пока она выполняется, нажимаем Reset на плате Nucleo, чтобы перезапустить код. Затем останавливаем команду с помощью Ctr+C и смотрим результат:

pulseview ~/temp/ssd1306-spi.sr

Видим следующее:

Сразу после открытия PulseView он не будет пытаться декодировать SPI. Соответствующий декодер нужно включить, кликнув по иконке с желтым и зеленым сигналами (справа от иконки с красным щупом).

Смотрите, как здорово! Больше не нужно считать битики — программа все делает за нас.

Само собой разумеется, если вы откроете код библиотеки, использованной для общения с экранчиком, то именно эти байты и увидите в коде процедуры ssd1306_Init.

А что, если мы хотим сохранить декодированные данные или, скажем, скормить их какому-то скрипту? Эту задачу можно решить с помощью sigrok-cli таким образом:

# список доступных опций смотри в:
# sigrok-cli -P spi –show
sigrok-cli -i ~/temp/ssd1306-spi.sr
  -P 'spi:mosi=MOSI:clk=CLK:cs=CS' -A 'spi=mosi-data'

Пример вывода:

spi-1: AE spi-1: 20 spi-1: 10 spi-1: B0

Само собой разумеется, если бы экранчик использовал протокол I2C, с задачей мы справились бы ничем не хуже. Запись данных:

sigrok-cli –driver dreamsourcelab-dslogic
  –config 'voltage_threshold=1.6-1.6:samplerate=2MHz:continuous=on'
  –channels '0=SCL,1=SDA' –continuous
  –output-file ~/temp/ssd1306-i2c.sr

Просмотр полученных данных в PulseView:

Декодирование при помощи sigrok-cli:

# список доступных опций смотри в:
# sigrok-cli -P i2c –show
sigrok-cli -i ~/temp/ssd1306-i2c.sr
  -P 'i2c:scl=SCL:sda=SDA' -A 'i2c=address-write:data-write'

Пример вывода:

… i2c-1: Address write: 3C i2c-1: Data write: 00 i2c-1: Data write: AE i2c-1: Write i2c-1: Address write: 3C i2c-1: Data write: 00 i2c-1: Data write: 20 i2c-1: Write i2c-1: Address write: 3C i2c-1: Data write: 00 i2c-1: Data write: 10 i2c-1: Write

Легко убедиться, что это те же самые данные, что передавались по SPI.

Наконец, посмотрим на данные, передаваемые между платой Nucleo и SPI flash чипом AT45DB161E:

sigrok-cli –driver dreamsourcelab-dslogic
  –config 'voltage_threshold=1.6-1.6:samplerate=10MHz:continuous=on'
  –channels '0=CLK,1=MOSI,2=CS,3=MISO' –continuous
  –output-file ~/temp/spi-flash.sr

Данные в PulseView:

Заметьте, что здесь был декодирован протокол SPI, после чего был декодирован работающий поверх него протокол SPI flash. То есть, декодеры можно объединять. Сделать это можно в свойствах протокола (в данном случае SPI), в выпадающем списке Stack Decoder.

Интересно, что декодер SPI flash не понимал некоторые команды данного конкретного чипа. Однако мне не составило большого труда написать патч, добавляющий поддержку недостающих команд (UPD: патч приняли). Писать декодеры оказалось весело, советую попробовать!

Заключение

Я в восторге как от Sigrok, так и от логического анализатора DSLogic. Это совершенно незаменимые инструменты, если вам часто приходится разрабатывать / отлаживать цифровую электронику.

Есть, конечно, некоторые шероховатости. Sigrok определенно нельзя назвать зрелым, стабильным проектом. Чтобы все работало, как надо, нужно уметь «держать его правильно».

С другой стороны, здесь открываются большие возможности в плане самореализации!

А пользуетесь ли вы логическим анализатором, и если да, то каким?

Дополнение: Основы написания декодеров для Sigrok на языке Python

Источник: https://eax.me/sigrok/

Работа с логическим анализатором Saleae Logic Analyzer

Логический анализатор – незаменимый помощник при отладке цифровой схемотехники. Давайте рассмотрим основные приёмы работы с логическим анализатором Saleae Logic Analyzer и его китайскими аналогами.

Логический анализатор – это инструмент для временного анализа цифровых сигналов. Это незаменимый, действительно незаменимый инструмент при отладке цифровой электроники.

Оригинальные анализаторы от именитых производителей стоят больших денег. У наших китайских друзей можно купить такое устройство за копейки. Поэтому если у вас его ещё нет – обязательно приобретите.

Возможности данного небольшого устройства весьма внушительны.

В таблице перечислены основные параметры логического анализатора, моей китайской копии анализатора фирмы Saleae.

ПараметрЗначение
число цифровых каналов 8
частота оцифровки на канал до 24 МГц
количество сэмплов в выборке до 1G (зависит от количества памяти ПК)
входное сопротивление 100 кОм
диапазон рабочих напряжений –0,5…5,25 В
напряжение логического «0» –0,5…0,8 В
напряжение логической «1» 2,0…5,25 В
защита от статики
защита по превышению напряжения +/−15 В

2Установка драйверадля логического анализатора Saleae

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

Скачиваем программу и драйверы для логического анализатора Saleae Logic Analyzer

Если у вас копия другой фирмы, например, USBee AX Pro, то с большой долей вероятности для него также подойдут драйверы от производителя анализатора-оригинала.

3Примеры работы с логическим анализатором

Для первого эксперимента возьмём преобразователь USB-UART на микросхеме FTD1232. Подключим анализатор к порту USB. Выводы каналов с 1 по 6 подключим к выводам USB-UART преобразователя.

По большому счёту, больше всего нас интересует только две линии – Rx и Tx, можно обойтись только ими. Преобразователь определился в системе как COM-порт.

Запустим любую терминалку (вот, например, неплохая программа для работы с COM-портом) и подключимся к порту.

Подключение USB-UART конвертера на микросхеме FTD1232 к логическому анализатору

Запускаем программу Saleae Logic. Если драйверы для анализатора установлены корректно, в заголовке программы будет указано Connected – подключено.

Допустим, мы не знаем на каком канале будет сигнал, а на каком нет, поэтому не будем выставлять триггер для начала захвата сигнала. Просто нажмём на стрелки большой зелёной кнопки Start (Старт) и выставим в поле Duration (Длительность), скажем, 10 секунд.

Это время, в течение которого логический анализатор будет собирать приходящие по всем 8-ми каналам данные после нажатия кнопки «Старт». Запускаем захват и одновременно отправляем в COM-порт какое-нибудь сообщение. Через 10 секунд анализатор закончит сбор данных и выведет результат в поле просмотра сигналов.

В данном случае сигнал будет лишь на одном канале, который присоединён к выводу Tx (передатчик) USB-UART преобразователя.

Последовательный сигнал, захваченный логическим анализатором

Для наглядности можно настроить декодер перехваченных данных. Для этого в правом столбце находим поле Analyzers, нажимаем иконку в виде плюса – «Добавить», указываем тип – Async Serial. Появится окно с выбором настроек. В первое поле вводим номер канала, на котором у вас данные.

Остальное оставим как есть. После нажатия кнопки Save (Сохранить), над полем соответствующего канала появятся метки голубого цвета с отображением значений байтов, которые были перехвачены. Нажав на шестерёнку в данном дешифраторе, можно задать режим отображения значений – ASCII, HEX, BIN или DEC.

Если вы передавали в COM-порт строку, выберите режим ASCII, и увидите тот текст, который был вами передан в порт.

Настройки декодера данных

Тут же, в правом столбце программы Saleae Logic, можно добавлять к перехваченным данным закладки, проводить измерения задержек и длительностей, выставлять всевозможные маркеры и даже проводить поиск по данным для декодированных протоколов.

Аналогичным образом подключим логический анализатор к преобразователю USB-RS485. Линии данных всего две, поэтому можно установить триггер срабатывания по фронту любого из каналов: сигнал в протоколе RS-485 дифференциальный и фронты импульсов появляются одновременно на каждом из каналов, но в противофазе.

Подключение конвертера USB-RS485 к логическому анализатору

Нажмём кнопку «Старт» в программе анализатора. С помощью нашей терминалки подключимся к USB-RS485 конвертеру и передадим какие-нибудь данные. По срабатыванию триггера программа начнёт собирать данные, по завершению выведет их на экран.

Последовательный сигнал RS485, захваченный логическим анализатором

Программа Saleae Logic позволяет экспортировать сохранённые данные в виде изображений и текстовых данных, сохранять настройки программы, аннотации и декодеры каналов.

Последний пример в данном небольшом обзоре – захваченный кадр данных, переданный по последовательному протоколу SPI. В канале 2 виден сигнал выбора ведомого, в канале 0 – тактовые импульсы, а в канале 1 – собственно данные от ведущего устройства к ведомому.

Последовательный сигнал SPI, захваченный логическим анализатором

Выводы

Логический анализатор может быть очень полезен при разработке и настройке всевозможных электронных устройств, при написании программного обеспечения, работающего в связке с железом, при работе с микроконтроллерами, ПЛИС и микропроцессорами, для анализа работы различных устройств и протоколов обмена данными, и для многих других применений. Кроме того, он портативен и не нуждается в отдельном питании.

Скачать инструкцию по работе с программой для логического анализатора Saleae

Источник: https://soltau.ru/index.php/themes/elektronika/item/414-saleae-logic-analyzer

Лаборатория юного радиолюбителя. “Toy Logic Analyzer”

Наверняка каждый попадал в ситуацию, когда пытаешься отладить какую-нибудь цифровую схему, а она ну ни как не работает должным образом. Особенно неудобно в Arduino IDE, где тебе для отладки доступны лишь вывод в COM-порт какой либо информации или светодиодик 🙂 Кто пробовал — тот знает.

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

Logic Analyzer) — электронный прибор, который может записывать и отображать последовательности цифровых сигналов. Он используется для тестирования и отладки цифровых электронных схем, например, при проектировании компонентов компьютеров и управляющих электронных устройств.

В отличие от осциллографов, логические анализаторы имеют значительно больше входов (обычно от 16 до нескольких сотен), но при этом часто способны показывать лишь два уровня сигнала («0») и («1»), к которым иногда добавлено состояние «Z».

Ну что же, наверняка стоящая штука. Понятное дело, что покупка фирменного изделия (USBee, Saleae и т.п.) — не наш метод. Закажем клон в Китае ().

А пока заказанная посылка была в пути (да и время позволяло), я решил попробовать реализовать функции логического анализатора на Ардуино. Как говорит мой приятель Иванович: «Используй то, что под рукою и не ищи себе другого» 🙂

Задумка «в крупную клетку» выглядела так: к входным пинам Ардуино подключаем анализируемые линии, быстро-быстро читаем состояние этих пинов собирая данные (чем больше данных — тем лучше) и выводим полученный результат в неком удобоваримом виде на экран.

Всего делов то! Я к этому моменту был уже немного «подкован» и знал, что для того что бы получилось «быстро-быстро» — явно не подходит. Почему? Потому что МЕ-ДЛЕ-ННО!!! Вот тут по этому поводу. Так что остается самый быстрый и удобный способ — соответствующего порта.

На тот момент мне казалось, что реализация моего проекта «Toy Logic Analyzer» — буквально «вечер-другой» работы. Вот как я представлял себе «изюминку» этого анализатора (оставалось только дорисовать «рюшечки»):

void loop() { Serial.println(PINC); //выводим состояние битов порта } Но, по мере погружения в проект я понял, что все не так просто. Сразу же встал вопрос насчет «Чем больше данных-тем лучше». Для поиграться/пощупать, мне вполне будет достаточно 4-х каналов. Только нужно определиться с пинами подключения анализируемых линий. Посмотрим на распиновку Ардуино:
Наиболее подходящими мне показались порты D (Pin8..Pin11) и C (A0..A3). Во первых, пины идут подряд и во вторых — являются младшими битами соответствующего порта, что очень даже удобно. Свой окончательный выбор я остановил на порту C. При таком варианте, прочитав состояние порта и обнулив старшие 4-ре бита, мы получаем значения логических уровней на каждом из подключенных каналов (далее по тексту я буду использовать термин СОСТОЯНИЕ ШИНЫ). Читая таким образом состояние шины через некие промежутки времени мы будем получать числовые значения BUS_DATA:

Каналов четыре, каждый канал представлен состоянием «0» или «1», в итоге мы получаем некую комбинацию чисел в диапазоне от 0 до 0xF. Вполне очевидно, что набор чисел не очень удобен для наглядного представления об изменениях на каналах. Как же должны выглядеть эти данные в человеческом виде? Для первого замера мы получаем значение 0хA, в двоичном представлении это b1010. При выводе результатов для каждого канала мы рисуем верхнюю черточку — если «1» и нижнюю — если «0», а переходы соединяем вертикальными линиями.
Солидные программы примерно так и выводят результаты своих замеров, попутно декодируя данные, разбирая протоколы и еще куча плюшек… Но у нас же запланирован МЕГАдешевый и МЕГАпростой вариант :), поэтому у нас результат будет представлен несколько упрощенно (как минимум, без вертикальных линий), примерно вот так:

Небольшое отступление в HARDWARE часть 🙂

Честно признаюсь, что практически до финальной версии я подключал анализируемые линии прямо к пинам Arduino. Знаю, что так делать не стоит.

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

Схема анализатора:Печатная плата:Ну и собственно готовое изделие:Ну, не знаю… Как по мне, плата придает некую «солидность» этой поделке 🙂

Сохранение данных замера. Компрессия.

Считанные данные нужно где-то хранить. Соответственно, нам нужен буфер или массив. От его размера напрямую зависит обьем анализируемых данных. Самый быстрый компонент для хранения данных — это ОЗУ (RAM или память). Памяти у Atmega328 всего два килобайта. Мало, очень мало. Попробуем ужаться. Для хранения одного замера с 4-х каналов необходимо 4-ре бита или пол-байта. Значит в одной ячейке массива (1 байт) могут разместиться два замера. Т.е., массив на 512 байт способен уместить 1024 замера. Как же это сделать?В массив будем производить запись ДВУХ считанных замеров (текущий и предыдущий).Array[x]=((prev_data «0» (FALL)
— любое изменение на любом канале (BURST)
— определенное состояние шины (PATTERN).
Чтобы упростить себе жизнь, я решил, что первые два триггера (RISE и FALL) я реализую только для одного канала (типа МАСТЕР-канал), если понадобиться, то можно будет просто перекоммутировать клипсу-зажим на нужную линию. Вполне очевидно, что для поиска изменений состояния шины потребуются две переменные: текущее состояние (cur_data) и предыдущее (prev_data).

Триггер BURST (любое изменение на шине).

Для приведенного примера первые два замера абсолютно идентичны, а вот на третьем произошло изменение состояния канала Ch2. Это наверное, самый простой в плане реализации триггер. Просто проверяем каждый раз данные на предмет того, что текущее состояние шины не равно предыдущему 🙂
if (prev_data != cur_data)

Триггер RISE (переход из «0» в «1»).

Как проверить, что состояние канала поменялось с «0» на «1»?В первом приближении я делал такими проверками «Если первый битик предыдущего замера был равен „0“ И первый битик текущего замера равен „1“ — то считаем что условие триггера выполнено.

//первый вариант if (((prev_data & 1)==0) && (cur_data & 1)==1)Однако после общения с моим приятелем Александром и получением от него дельных ЦУ, данная проверка стала выглядеть так:
//второй вариант if (~prev_data & cur_data & 1)Помимо лаконичности такой проверки, надеюсь, что скорость выполнения тоже возросла 🙂 Я рассуждал примерно так (поправьте если ошибаюсь): 1 вариант. — выделяем младший бит из prev_data — сравниваем его с 0 — выделяем младший бит из cur_data — сравниваем его с 1 — делаем логическое AND с полученными результатами

ИТОГО: 5 операций

2 вариант. — инвертируем prev_data — побитовое сложение с cur_data — выделяем младший бит из результата

ИТОГО: 3 операции

Триггер FALL (переход из «1» в «0»).

Несложно догадаться, что для триггера FALL проверка будет такая:if (prev_data & ~cur_data & 1)

Триггер PATTERN (определенное состояние на шине).

Оказалось — самый сложный триггер. Для данного режима нужно указать маску по которой будет происходить сравнение. Причем, помимо определенных „0“ или „1“, можно указать, что для данного канала состояние не важно. Например, для маски 0?1? — подходят следующие варианты: 0010; 0011;0110;0111; Первый вариант реализации этой проверки выглядел вот таким образом:volatile byte pattern_mask[4]; // массив-маска для события // Значения в массиве-маске: 0 – и есть ноль, 1 – 1, и 2 – это неопределенное состояние volatile byte pattern_mask[4]; // массив-маска для события byte flag = 0; // Результат сравнения. 1 – совпало for (byte i=0; i> i)&1) == pattern_mask[i]) // Сдвигаем значение cur_data на i шагов вправо, потом умножаем на 1 тем самым обнуляя все биты кроме первого, затем сравниваем с соотв. значением маски { flag = 1; // значение совпало, устанавливаем флаг } else { flag = 0; // не совпало – не чего ловить – выходим из цикла break; } } else flag = 1; } // конец цикла iПолучилось хоть и работоспособно, но очень громоздко. А это сказывается на равномерности считывания данных. И тут опять же, благодаря вмешательству Александра… была произведена СУЩЕСТВЕННАЯ оптимизация этой проверки. А именно,

вместо 4-х байтового массива patterm_mask заводим 2 переменные: pattern_mask и pattern_value.

pattern_value хранит собственно сам паттерн состояния шины, который ищется. Если бит должен игнорироваться, то в нем „0“, например: ищем 0000 — pattern_value=0x0 ищем 0101 — pattern_value=0x5 ищем xx10 — pattern_value=0x2

pattern_mask должна хранить „1“ в тех разрядах, которые сравниваются, и „0“ в тех, которые игнорируются, используя пример выше:

ищем 0000 — pattern_mask=0xf ищем 0101 — pattern_mask=0xf ищем xx10 — pattern_value=0x3 В этом случае весь вышеприведенный код проверки заменяется одной строчкой:if ((cur_data & pattern_mask) == pattern_value)Просто СУПЕР! Я реально офигел от такого лаконичного и красивого решения!

Вывод результатов.

Как считывать состояние шины мы уже разобрались, как будем хранить результаты — тоже определились. Какие события будем отслеживать — выделили. Теперь что же с этими результатами делать? В каком виде их выводить? С какого момента? При отладке полезно знать, что предшествовало появлению того или иного триггера, так называемая история.

Для случая на картинке, до появления условия описанного триггером, мы все равно записываем считанные данные в массив. На десятом замере условия триггера (Event) выполнилось. Высчитываем значение StartIndex. И далее мы „тупо“ производим запись состояний шины в массив (уже не делая проверку на триггер) до момента начала истории (StartIndex).

А вот выводить на экран результаты сканирования нужно от начала истории и до конца…Таким образом, мы получаем некое понимание того, что было на шине пока не появился триггер. Вот как будет выглядеть реальная осциллограмма замера:
В нашем варианте анализатора конец истории и начало замера указывается маленькой стрелочкой вверх „^“.

Дабы придать солидность выводимым результатам, я нарисовал снизу некое подобие шкалы разметки. Тут же присутствует расчетная цена одного деления (Time:) (я использовал штатную ардуиновскую . Сохраняем значение millis() в начале замера и в конце. Высчитываем сколько же по времени длился собственно замер. Ну и далее делим это время на количество замеров).

Если есть необходимость, то результаты замера можно посмотреть в виде дампа:Правда вывод дампа начинается не с истории, а с начала буфера.

Управление.

Реализовано в диалоговом режиме. Обмен командами происходит через терминал. Доступны следующие команды:

Практически все команды получились однобуквенными. Если бы не режим PATTERN, то все было бы сверхтривиально. Команды R,F,B,P — запуск сканирования с указанным триггером.

Для триггера P дополнительно нужно указывать четыре параметра для каждого канала (»0″, «1», “?” (или «х»)). Для того, чтобы остановить ожидание появления триггера, просто подаем новую команду и она отменит старую. Команда S (Show buffer)- повторный вывод осциллограммы. От отладки осталась команда D (Dump out) — вывод результатов в виде дампа.

Перечень доступных команд можно всегда получить если ввести H (или ?).

В настройках терминала необходимо установить скорость 115200 и режим «Новая строка». ======================================== Основной скелет программы теперь выглядит так: — ждем команду указание триггера; — очищаем буфер; — сканируем шину, записываем данные в буфер и попутно отслеживаем появление заданного триггера; — при появлении данных в CОМ-порту, прерываем сканирование; — если условие триггера выполнилось — пишем данные в буфер, при этом сохранив историю состоянии шины до сработки триггера; — выводим результаты на экран в виде осциллограммы; =========================================

Оценка скорости выборки.

В какой-то момент времени меня очень заинтересовала скорость захвата данных полученного логического анализатора… Я попробовал несколько вариантов измерения: — с помощью замеров времени выборки (с помощью millis().

Читай выше); — при каждом считывании состояния шины я инвертировал значение на одном из пинов (debugPin) и замерял частоту переключения; — внешним генератором; Последний способ опишу (просто у меня остался скрин этого варианта).На внешнем генераторе установил частоту 496 Hz.

И подобрал размер буфера таким образом, чтобы целиком уместилась одна «ступенька» в замер. Вышло что количество замеров равно 240.

Дальнейшие рассуждения: Частота 496 Гц — значит период 1/496 = 2,016 мс Половина периода — 1,008 мс В эту половину периода укладывается 240 замеров, значит частота дискретизации 240/1,008= 238,08 кГц Следовательно период дискретизации 4,2 мкс Все остальные способы оценки давали близкие результаты (около 4 мкс), что очень даже хорошо.

Примеры работы.

4-х битный счетчик 74ls161Получилось весьма правдоподобно, буквально пару неточностей 🙂 Захват протокола I2C:=========================================

Достоинства.

— «дешево и сердито». (Кроме Arduino вообще ничего не нужно);
— 100% OpenSource. (Бери исходники и делай с ними все, что посчитаешь нужным); — позволяет без затрат оценить необходимость анализатора для ваших нужд; — достаточно гибкая система настраиваемых триггеров;

— вполне приемлемая скорость оцифровки (по меркам Ардуино). («Медленный» обмен данными через СОМ-порт происходит ТОЛЬКО после захвата данных);

— дополнительный вывод результатов в виде дампа значений;

— легкая переносимость на другие платформы (например на );

Недостатки описывать не буду :), так как считаю, что само название «Toy Logic Analyzer» (рус. «Игрушечный логический анализатор») в значительной мере их наличие оправдывает.

Забрать весь материал по этому проекту можно .

Всем спасибо за уделенное время на прочтение и удачи!

Источник: http://robocraft.ru/blog/3637.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}