Передача данных ацп на пк

Измеритель напряжения с передачей данных на ПК по USB

Представленное устройство предназначено для измерения входного напряжения амплитудой от -10 до +10В. Измеренный уровень сигнала в цифровом виде передаётся на ПК по USB. Питается устройство непосредственно от шины USB.

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

Единственная сложность с которой может столкнуться начинающий радиолюбитель – монтаж СМД компонентов. Видео по монтажу СМД компонентов можно посмотреть у меня на сайте, перейдя по ссылке (уже скоро…). Это не измерительный прибор, это «показометр» он не может гарантировать какой либо точности измерений.

Тем не менее, вольтметр на AVR может быть интересен начинающим радиолюбителям, осваивающим микроконтроллеры AVR, так как в данном устройстве используются АЦП и USART модули микроконтроллера.

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

Единственным требованием преподавателя было — диапазон измеряемых напряжений от -10 до 10В. Так как демонстрация должна была быть из серии: «светим на фотодатчик, напряжение выросло. Накрыли его от источника света, напряжение уменьшилось» и всё в таком духе, то точность измерений не является основной задачей.

Следовательно, я старался упростить устройство и для себя я сформировал ещё несколько требований:

  • Устройство должно питаться от USB порта. (мне не хотелось городить дополнительный блок питания)
  • Устройство должно измерять переменное входное напряжение относительно общего провода питания устройства (для возможности измерять напряжение на каком либо другом устройстве также питающимся от USB)

В итоге было разработано радиоэлектронное устройство схема которого представлена на рисунке.

При сигнале от -10 до +10В, размах напряжения на входе получается 20В. Для того, чтобы подать данный сигнал на АЦП его нужно пропорционально уменьшить, то есть поделить. В данной схеме входной сигнал делится резистивным делителем состоящим из R9, R10 (верхнее плечё) и R8 – нижнее плечё.

По моим подсчётам, размах напряжения после делителя должен был составлять 2В  (от -1 до +1В). Так как АЦП данного микроконтроллера не может измерять отрицательное напряжение (относительно общего провода его питания (GND), необходимо каким либо образом сдвинуть диапазон (от -1 до +1В) в область положительных значений амплитуд, например  от 0 до 2В.

Значения из данного диапазона довольно просто измерить АЦП микроконтроллера. Есть несколько способов как правильно сдвинуть входное напряжение не потеряв в точности, а так как у меня не стояла задача сделать измерительный прибор, то я постарался всё упростить по максимуму. Смещение задаётся резисторами R5, R6, R7.

Это плохой вариант смещения входного напряжения, если рассматривать его с точки зрения получения высокой точности, но очень хороший вариант с точки зрения простоты. А простота это то, что и было мне нужно! На элементах DA1, R14, R15, R16 собран источник опорного напряжения на 3В.

На делителе R11, R12, R13 формируется напряжение 2 В для опорного напряжения АЦП, которое АЦП принимает за максимальное при измерениях. Сердцем устройства является микроконтроллер AtMega8. Я использовал микроконтроллер в TQFP корпусе, и номера выводов на схеме соответствуют данному корпусу для поверхностного монтажа.

 Микроконтроллер, при помощи встроенного АЦП, измеряет амплитуду входного сигнала, оцифровывает его и отправляет полученный 8-ми битный результат по USART в преобразователь USB-USART выполненный на микросхеме FT232R. Исходный код был написан на ассемблере. Вернее сказать не был написан, а был использован готовый код с сайта http://easyelectronics.

ru/, который я немного подправил под себя. В те времена, когда  я делал данное устройство, я плохо разбирался в микроконтроллерах, в ассемблере, и код правил методом проб и ошибок, так что вы не судите строго. Код корявый, но устройство работает. Скачать исходники проекта можно в конце статьи. Теперь немного пробежимся по коду:

.include “m8def.inc”              ; Используем ATMega8 ;Макрос ; Загрузка числа в порт .MACRO outi                ; Это описание макроса. Везде где outi встретится в коде, то заменяется на LDI        R16,@1       ; этот кусок кода, причем @0,@1 это параметры, они заменятся введенными параметрами OUT        @0,R16          ; макроса. Данный макрос тупо копирует введенное число сначала в регистр R16, а из него .ENDMACRO

Здесь всё просто, первым делом подключаем файл m8def.inc с описанием регистров ввода-вывода, и описанием других конфигурационных ячеек периферии микроконтроллера AtMega8.

Дальше описан макрос, который позволяет упростить работу программисту и переложить её на компилятор. Все мы знаем что записать сразу число в регистр ввода вывода в микроконтроллере AVR не получится, нужно использовать промежуточный регистр, например R16.

Хотя запись числа в регистр ввода вывода очень востребованная и часто используемая операция.

Для того чтобы в  PotrB установить число 10 необходимо написать следующее:

LDI          R16, 10 OUT        PortB, R16

Использование макроса (outi @0, @1) позволяет не писать каждый раз в тексте программы запись через данный промежуточный регистр, а просто написать к примеру outi PotrB, 10 всё остальное сделает компилятор. При данной записи компилатор сначала загрузит число 10 (операнд @1) в регистр R16 а затем из R16 в PotrB (операнд @0).

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

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

; Собственно код начинается отсюда .CSEG .ORG       0x0000                                   ; Проц стартует с нуля, но дальше идут вектора RJMP       Reset                                      ; прерываний, поэтому отсяюда сразу же прыгаем ; на начало программы. На метку Reset .ORG       INT0addr                ; External Interrupt Request 0 RETI .ORG       INT1addr                ; External Interrupt Request 1 RETI .ORG       OC2addr                 ; Timer/Counter2 Compare Match RETI .ORG       OVF2addr                ; Timer/Counter2 Overflow RETI .ORG       ICP1addr                ; Timer/Counter1 Capture Event RETI .ORG       OC1Aaddr                ; Timer/Counter1 Compare Match A RETI .ORG       OC1Baddr                ; Timer/Counter1 Compare Match B RETI .ORG       OVF1addr                ; Timer/Counter1 Overflow RETI .ORG       OVF0addr                ; Timer/Counter0 Overflow RETI .ORG       SPIaddr                 ; Serial Transfer Complete RETI .ORG       URXCaddr                ; USART, Rx Complete RJMP       UART_RX .ORG       UDREaddr                 ; USART Data Register Empty RETI .ORG       UTXCaddr                 ; USART, Tx Complete RJMP       UART_TX .ORG       ADCCaddr                 ; ADC Conversion Complete RJMP       ADC_OK .ORG       ERDYaddr                  ; EEPROM Ready RETI .ORG       ACIaddr                   ; Analog Comparator RETI .ORG       TWIaddr                   ; 2-wire Serial Interface RETI .ORG       SPMRaddr                  ; Store Program Memory Ready RETI

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

Из всей таблицы для данного проекта используется всего 3 прерывания: URXCaddr (приняли что-то по USART), UTXCaddr (предыдущий байт по USART отправился, теперь можно передавать новый), ADC_OK (ADC закончило преобразование, и можно забрать результат).

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

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

Так как из данного адреса мы не попадаем в обработчик прерываний (нет RJMP на нужный адрес), микроконтроллер начнёт выполнять следующую по счёту инструкцию, а именно SPIaddr, так как и тут также нет прыжка в нужное место, микроконтроллер перейдёт к выполнению следующей по счёту инструкции URXCaddr, и тут он уже перепрыгнет на обработчик UART_RX (приняли что-то по USART).

Хотя на самом деле микроконтроллер ничего не принял, а произошла ошибка, мы всего лишь ошиблись с 1 битом (случайно разрешили прерывание Timer/Counter0 Overflow)! Подобные неочевидные ошибки с прерываниями очень коварная штука, можно несколько часов потратить на понимая, почему устройство то работает нормально, то сбоит без видной причины.

Для того, чтобы избежать подобных нелепых ошибок, все неиспользуемые прерывания закрываются «заглушками» RETI. При попадании на данную заглушку (если сработало не нужное прерывание), микроконтроллер вернётся обратно по адресу, который он запомнил в стеке когда переходил на выполнение данного прерывания, и продолжит выполнение программы с места, с которого он «отвлёкся» на прерывание.

То есть не произойдёт ничего страшного, микроконтроллер потеряет немного времени на переход по прерыванию и обратно (всего несколько машинных тактов), но зато не сменит алгоритм работы.

Reset:     OUTI       SPL,low(RAMEND) OUTI       SPH,High(RAMEND) ;============================================================================= ; Все инициализации тут. RAM_Flush:            LDI ZL,Low(SRAM_START) LDI ZH,High(SRAM_START) CLR  R16 Flush:                ST Z+,R16 CPI ZH,High(RAMEND) BRNE  Flush CPI  ZL,Low(RAMEND) BRNE Flush CLR  ZL CLR  ZH

Дальше идёт инициализация стека. Это очень важная вещь! Без стека вы не сможете использовать прерывания или подпрограммы. Стек растёт с конца памяти к началу. Поэтому в стековые регистры SPL, SPH записывается адрес конца RAM памяти.

Дальше идёт очистка RAM памяти, или, если по другому сказать производится инициализация всех ячеек памяти значением 0. Лично я никогда не очищаю всю память, мне кажется это лишнее.

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

Зачем тратить микроконтроллерное время для очистки всей памяти? Более того, в данном проекте RAM память не используется, но я оставил всё так, как было у автора.

; Инициализация периферии ;======================================================================================== .equ XTAL           = 8000000 .equ baudrate       = 9600 .equ bauddivider    = XTAL/(16*baudrate)-1 OUTI       UBRRL,low(bauddivider) OUTI       UBRRH,high(bauddivider) OUTI       UCSRA, 0 OUTI       UCSRB,(1

Источник: http://www.elenblog.ru/izmeritel-naprjazhenija-s-peredachej-dannyh-na-pk-po-usb/

FAQ: Можно ли обрабатывать данные от АЦП на ПК в реальном времени, отсчет за отсчетом?

К сожалению, едва ли, если только речь не идет о медленном процессе (например, с характерным временем реакции в десятки или сотни миллисекунд).

Дело в том, что обычный персональный компьютер с обычной операционной системой не является системой реального времени, а передача данных через интерфейсы (USB, Ethernet) происходит блоками по определенным протоколам (с шинами PCI/PCIe несколько лучше, но тоже есть особенности).

Физический момент времени, когда АЦП измерил напряжение и сформировал отсчет цифрового сигнала, отстоит от момента, когда это числовое значение будет обработано программой на компьютере, на заметное время – а главное, что это время случайное.

Оно определяется как аппаратурой, так и программным обеспечением, зависит от логики операционной системы и драйверов, от загрузки процессора и от выполняемых параллельно программ. В многозадачной ОС всегда много процессов, даже если пользователь не запускает специально “посторонних” программ. Даже перемещение мыши может быть заметно.

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

Иначе говоря, время физического процесса, оцифрованного АЦП, лучше всего считать не связанным со временем исполнения программы.

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

Если нужно сихронизироваться с каким-то внешним событием, можно использовать специальные средства синхронизации (например, пуск АЦП от внешнего синхросигнала); в некоторых изделиях “Л Кард” (например, в крейтовой системе LTR) предусмотрены специальные механизмы для привязки отсчетов сигнала к реальному времени, в том числе синхронизированному с эталонным источником.

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

Это не обязательно означает разработку собственного прибора: например, некоторые изделия “Л Кард” предусматривают возможность такого перепрограммирования, то есть можно написать свою нестандартную “прошивку” к готовому прибору и использовать её вместо штатной.

Такой переделанный прибор может стать автономным (и из установки исключится ПК), либо можно сохранить (или сделать свой) протокол связи с ПК, чтобы оставить за ним диалог с оператором, визуализацию результатов, запись на диск и прочие задачи “нереального” времени.

В случае платы PCI или PCI Express с сигнальным процессором “на борту” при низкоуровневом программировании этого процессора получится подсистема реального времени внутри ПК, и на неё можно возложить задачи, требующие обработки и реакции в реальном времени.

Наконец, для некоторых нетребовательных задач (например, в лабораторном опыте, который при неудаче нетрудно повторить) можно попробовать несколько приблизиться к “условно реальному” времени и на обычном ПК, если читать поток данных небольшими порциями и надеяться на то, что случайные задержки не превысят некоторых “типичных для этой установки” значений.
При этом надо осознавать, что такая программа может получиться весьма нестабильной и сбиваться от случайных задержек, поэтому ещё раз повторим: такой подход можно считать приемлемым для неответственных задач – таких, где сбой не может привести к поломке, где допустимо отбросить неудачное измерение и повторить опыт, и т.д.

Тем не менее нас часто спрашивают, на какое “типичное” время отклика можно ориентироваться. На этот вопрос нельзя дать уверенного ответа, т.к.

всё зависит от интерфейса (как от его типа, так и конкретной реализации в ПК и в приборе), от конфигурации ПК, от операционной системы и т.д.

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

  1. USB (на примере E14-140-M): миллисекунды, десятки миллисекунд (Тестировалось с ПК на процессоре Celeron 2.6 ГГц, на ненагруженной системе, с высоким приоритетом выполнения программы.) – опрос цифровых входов: около 4 мс на цикл (250 чтений или 125 циклов чтение-запись в секунду); – повторитель сигнала с АЦП на ЦАП, 1 канал, частота дискретизации 100 кГц: запаздывание 6.4 мс;

    – компаратор (отслеживание уровня сигнала и индикация на цифровом выходе “выше/ниже порога”): случайное западзывание 3…4 мс.

  2. (продолжение следует…)

Источник: http://www.lcard.ru/support/faq/realtime_on_pc

AVR. Учебный Курс. Выдача данных с АЦП на UART. Мультиплексирование каналов АЦП

Несколько постов назад я заикнулся о том, что выдам на гора программу-пример для работы с АЦП. Пора за базар отвечать 🙂 Делать мы будем простенький цифровой вольтметр с замашками осциллографа. Точнее осциллографом это можно назвать с большой натяжкой, скорей самописец. Так, побаловаться.

Задача:
Получить по очереди напряжение с трех каналов АЦП и отправить его по последовательному порту в комп. По запросу с компа показвыать напряжение на каждом из измеряемых каналов. В компе полученный поток байт представить в виде графика.

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

Собираем схему на демоплате Pinboard.
Нам нужны три разных напряжения. Их проще всего получить с переменных резисторов, включенных потенциометрами. При этом средняя точка переменного резистора подключается к каналу АЦП, а крайние точки к +5 и GND питания.

При этом при вращении рукоятки резистора напряжение на его средней точке будет меняться от нуля до +5 вольт. Резистор, подключенный к каналу ADC0 уже так включен и никаких лишних движений не требует. А вот два других надо будет подключить.

На видео и на фотках хорошо видно что и куда идет.

Поглядеть крупнее

Теперь осталось написать код. Код я сделаю на прерываниях и конечных автоматах.

Вначале переменные:

1
2
3
4
5
; RAM ======================================================== .DSEG RX_sel: .byte 1 ; Переменная состояния отправки данных ADCH_sel: .byte 1 ; Переменная текущего канала АЦП ADCCH: .byte 8 ; Восемь байт под хранение результатов АЦП. По байту на канал.

; RAM ======================================================== .DSEG RX_sel: .byte 1 ; Переменная состояния отправки данных ADCH_sel: .byte 1 ; Переменная текущего канала АЦП ADCCH: .byte 8 ; Восемь байт под хранение результатов АЦП. По байту на канал.

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

Прерывание по приему байта. Работает просто. Принятый байт проверяет на код цифры 0, 1 или 2. Если совпадает — то выставляет соответствующую переменную и в терминал начинают валиться данные с этого канала АЦП. Если не совпадает — выставляет значение которое блокирует отправку любых данных.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
; Interrupts ============================================== RX_OK: PUSHF ; Сохраняем SREG и R16 в стеке IN R16,UDR ; Берем принятый байт   CPI R16,'0' ; Case 0 BREQ Ch_0 CPI R16,'1' ; Case 1 BREQ Ch_1 CPI R16,'2' ; Case 2 BREQ Ch_2   LDI R16,3 ; Defaul   RJMP EXIT_RX  
Ch_0: LDI R16,0 ; Если выбран 0 канал RJMP EXIT_RX  
Ch_1: LDI R16,1 ; Если выбран 1 канал RJMP EXIT_RX  
Ch_2: LDI R16,2 RJMP EXIT_RX ; Если выбран 2 канал  
 
EXIT_RX: OUT UDR,R16 ; Даем эхо и инициируем передачу. STS RX_sel,R16 ; Сохраняем выбраное значение канала POPF ; Достаем регистры из стека RETI

; Interrupts ============================================== RX_OK: PUSHF ; Сохраняем SREG и R16 в стеке IN R16,UDR ; Берем принятый байт CPI R16,'0' ; Case 0 BREQ Ch_0 CPI R16,'1' ; Case 1 BREQ Ch_1 CPI R16,'2' ; Case 2 BREQ Ch_2 LDI R16,3 ; Defaul RJMP EXIT_RX Ch_0: LDI R16,0 ; Если выбран 0 канал RJMP EXIT_RX Ch_1: LDI R16,1 ; Если выбран 1 канал RJMP EXIT_RX Ch_2: LDI R16,2 RJMP EXIT_RX ; Если выбран 2 канал EXIT_RX: OUT UDR,R16 ; Даем эхо и инициируем передачу. STS RX_sel,R16 ; Сохраняем выбраное значение канала POPF ; Достаем регистры из стека RETI

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
;——————————————————————– TX_OK: PUSHF ; Сохраняем флаги и R16   LDS R16,RX_sel ; Смотрим какой канал надо слать   CPI R16,0 ; Case 0 BREQ Send0   CPI R16,1 ; Case 1 BREQ Send1   CPI R16,2 ; Case 2 BREQ Send2   ; Default RJMP EXIT_TX  
Send0: LDS R16,ADCCH ; Шлем выбраный канал в UART OUT UDR,R16 ; Смещение адреса канала задается относительно базы ADCCH RJMP EXIT_TX  
Send1: LDS R16,ADCCH+1 ; Тут лежат данные первого канала OUT UDR,R16 RJMP EXIT_TX  
Send2: LDS R16,ADCCH+2 ; А тут второго. Адреса все фиксированные. OUT UDR,R16 RJMP EXIT_TX  
EXIT_TX: POPF ; Достаем все из стека, выходим. RETI

;——————————————————————– TX_OK: PUSHF ; Сохраняем флаги и R16 LDS R16,RX_sel ; Смотрим какой канал надо слать CPI R16,0 ; Case 0 BREQ Send0 CPI R16,1 ; Case 1 BREQ Send1 CPI R16,2 ; Case 2 BREQ Send2 ; Default RJMP EXIT_TX Send0: LDS R16,ADCCH ; Шлем выбраный канал в UART OUT UDR,R16 ; Смещение адреса канала задается относительно базы ADCCH RJMP EXIT_TX Send1: LDS R16,ADCCH+1 ; Тут лежат данные первого канала OUT UDR,R16 RJMP EXIT_TX Send2: LDS R16,ADCCH+2 ; А тут второго. Адреса все фиксированные. OUT UDR,R16 RJMP EXIT_TX EXIT_TX: POPF ; Достаем все из стека, выходим. RETI

Прерывание готовности АЦП работает несколько сложней. Суть в том, что работа АЦП у нас идет по такому алгоритму: Запускаем одиночное АЦП преобразование и ждем прерывания готовности АЦП. В прерывании забираем данные. Сохраняем данные. Переключаем канал с которого мы снимали показания. Запускаем следующее преобразование (уже для другого канала)

Выходим из прерывания и ждем следюущего прерывания.

Данный алгоритм хорош тем, что все делается автоматически, в режиме конечного автомата. В результате у нас в памяти, в массиве ADCCH, всегда лежат 8 свежих значений, снятых с 8ми каналов АЦП. Остается их только считать и использовать. При этом главный цикл крутится по своим делам и не парится, зная, что свежие значение всегда его ждут.

В самом прерывании активно используется работа с масками. Для того, чтобы сменить номер канала. Номер канала лежит в последних трех битах регистра ADMUX и может иметь значение от 0 до 7 (000 и 111 соотвествтенно).

И нам надо в каждом вызове увеличивать значение канала, перебирая их по очереди. Просто так икрементировать ADMUX нельзя, т.к. кроме номера канала там лежат еще и быти управления АЦП, выравнивания и опорного напряжения — они могут сбиться.

Приходится изощряться с масками, чтобы их не задеть.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
ADC_OK: PUSHF PUSH ZL PUSH ZH PUSH R17   IN R16,ADMUX ; Берем ADMUX ANDI R16,0x07 ; Маской отрезаем лишние биты. Получаем номер канала ; С которого было снято измерение.   MOV R17,R16 ; Cохранили копию номера канала   LDI ZL,low(ADCCH) ; Берем адрес начала массива с будущими данными. LDI ZH,High(ADCCH)   ADD ZL,R16 ; Прибавляем к адресу наш номер канала. ; Если было переполнение, то будет флаг С CLR R16 ; Флаг важен, а значение в R16 уже нет. Но нам нужен ноль ; Возьмем и сделаем его из R16. ADC ZH,R16 ; Сложим флаг возможного переполнения с ZH ; Т.о. у нас получается в Z = адрес (ADCCH+номер канала) ; И значения из разных каналов ложатся в разные переменные массива ; с адресом базы ADCCH   IN R16,ADCL ; Младшее значение нам не надо. Но считать его нужно. IN R16,ADCH ; Берем в R16 значение из АЦП ST Z,R16 ; Сохраняем его в массив по нужному адресу  
  IN R16,ADMUX ; Опять взяли ADMUX ANDI R16,0xF8 ; На этот раз обнулили номер канала. Оставив остальные биты нетронутыми   INC R17 ; Увеличили на 1 заныченный ранее номер канала ANDI R17,0x07 ; Обрезали лишние биты, чтобы не было переполнения. ; Число по маске 0х07 в принципе не может быть больше 7. ; А каналов у нас от 0 до 7. То что надо.   OR R16,R17 ; Слепили старое значение из ADMUX c новым значением номера OUT ADMUX,R16 ; Канала. Т.е. по факту сделали MUX = MUX+1 выбрав следующий канал ; Спихнули его в регистр ADMUX. Все, следующий канал выбран. Можно запускать ; Следующее преобразование.   OUTI ADCSRA,(1

Источник: http://easyelectronics.ru/tretya-programma-vydacha-dannyx-s-acp-na-uart.html

Возможные схемы подключения модулей АЦП ЦАП к ПК

Главная » Новости » Возможные схемы подключения модулей АЦП ЦАП к ПК и работа в автономном режиме

Модули АЦП ЦАП ZET подключаются к персональному компьютеру по шине USB 2.0, Ethernet 10/100, Wi-Fi. Также модули АЦП ЦАП могут работать в автономном режиме.

Подключение по USB Для подключения к ПК модулей АЦП ЦАП используется кабель USB 2.0. Питание модулей осуществляется по шине USB.

Подключение по Ethernet (опция) Подключение по Ethernet позволяет размещать измерительную часть на большом расстоянии от ПК и создавать распределенные системы.

Создание рапределенной системы позволяет существенно сокращать длину аналоговых линий от датчиков до АЦП. При использовании прямого кабеля UTP (витая пара), расстояние между ПК и АЦП может составлять до 100 м.

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

При подключении модулей АЦП ЦАП по шине Ethernet 10/100 питание может осуществляться по шине Ethernet 10/100, от преобразователя 220→5 В или блока аккумуляторов.

Подключение по Wi-fi (опция) Подключение по Wi-fi позволяет проводить измерения на подвижных элементах различных конструкций, а так же измерения на больших расстояниях.

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

При подключении модуля АЦП ЦАП по шине Wi-Fi питание может осуществляться от преобразователя 220→5 В или блока аккумуляторов.

Работа в автономном режиме (опция)
При работе модулей АЦП ЦАП в режиме автономного регистратора существуют следующие возможности:

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

Сценарий работы задаётся при подключении модуля АЦП ЦАП к компьютеру. После проведения записи, модуль АЦП ЦАП подключается к ПК и с помощью программы «Автономный регистратор» с флэш-накопителя данные переписываются на накопитель ПК.

Затем с помощью программ воспроизведения сигналов и других программ ZETLAB проводится анализ сигналов.

При работе в режиме автономного регистратора питание модулей АЦП ЦАП может осуществляться от преобразователя 220→5 В или блока аккумуляторов.

  • Процессор типа: Intel Pentium 4, D; Celeron D; Core 2 Duo.
  • Оперативная память не менее: 1 Гб.
  • Операционная система не ниже: Microsoft Windows XP ServicePack 3.
  • Тип системы: 32 или 64-разрядная.
  • Шина USB: HighSpeed USB 2.0.

Цены действительны для резидентов Российской Федерации.
1992 — 2018 © (ООО «ЭТМС»)

Источник: https://zetlab.com/vozmozhnyie-shemyi-podklyucheniya-moduley-atsp-tsap-k-pk-i-rabota-v-avtonomnom-rezhime/

Ацп с интерфейсом usb

Источник: http://www.6kr.ru/other/52-acp-s-interfeysom-usb.html

Реализация последовательной асинхронной передачи данных в микроконтроллерах PIC

Введение.
Серия PIC16Cxx от Microchip Technology, Inc. – это второе поколение высокопроизводительных восьмиразрядных микроконтроллеров на базе EPROM. Некоторые микроконтроллеры из этой серии (например PIC16C71 и PIC16C84) не имеют встроенного последовательного асинхронного порта.

Эта статья содержит описание последовательного асинхронного интерфейса ( полудуплексное RS-232 соединение ) с программной обработкой прерывания для микроконтроллеров PIC16Cxx. Эти микроконтроллеры могут работать на очень большой скорости, с минимальной длительностью такта 250нс ( при частоте 16МГц ).

Для тестирования RS-232 режима предлагается использовать простой цифровой вольтметр / систему опроса данных ( Digital Volt Meter / Analog Data Acquisition Systems ) выполненный на PIC16C71, Этот прибор принимает команды от ПК и передает обратно восмибитные значения с выбранного АЦП канала.

Реализация.

Ниже приведено подробное описание реализации полудуплексного RS-232 интерфейса с программной обработкой прерывания для PIC16C71.

В программе примера в качестве передающего выхода используется RB7, а для приема – RTCC/RA4. Конечно, и вход и выход соединяются через соответствующий преобразователь уровней сигнала RS-232 / ТТЛ.

Описание преобразователя уровней напряжения дано в разделе Аппаратная часть.

Режим передачи.

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

Счетчик машинных циклов микроконтроллера ( RTCC ), вместе с определенной предустановкой может быть использован для генерации прерывания при переполнении RTCC. Это прерывание, вызванное переполнением счетчика, может быть использовано как сигнал для передачи очередного бита.

В представляемой здесь программе рабочая частота микроконтроллера ( '_ClkIn' ) и скорость передачи ( '_BaudRate' ) программируются пользователем. В общих временных установках по этим значениям вычисляется таймаут счетчика ( длительность одного передаваемого бита в машинных циклах ).

Предустановка для счетчика может быть указана или нет, это тоже определяется в общих временных установках. Вычисления выполняются в заголовке файла 'rs232.h'. Обратите внимание, что наиболее высокая скорость передачи может быть достигнута, если вместо использования прерываний применять паузы, формируемые программой. Конечно, в этом случае процессор будит занят только этой работой.

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

Последовательный порт свободен, если оба бита '_txmtProgress' и '_rcvOver' очищены ( смотри описание регистра состояния/управления, которое приведено ниже ).Основные моменты применения функции 'PutChar'.1) Убедитесь, что биты '_txmtProgress' и '_rcvOver' очищены.2) Загрузите передаваемые данные в 'TxReg'.3) Вызовите функцию 'PutChar'.

Режим приема.

Реализация приемного режима немного отличается от передающего. В отличии от передачи ( в программе примера в качестве выхода TX используется выход RB7, но это может быть и любой другой выход ) приемный вход должен быть соединен только с RTCC/RA4 входом. Это связано с тем, что при приеме первый стартовый бит должен быть детектирован в асинхронном режиме.

Для детектирования стартового бита в режиме приема, RTCC модуль конфигурируется в режим счетчика. Регистр OPTION конфигурируется так, что RTCC модуль переходит в режим счетчика ( увеличивается на 1 по заднему фронту сигнала на входе RTCC/RA4 ). После такой установки в RTCC записывается значение 0xFF.

Задний фронт сигнала на входе RTCC изменяет состояние счетчика RTCC с 0xFF на 0x00, что вызывает прерывание, сигнализирующее о стартовом бите. После этого RTCC/RA4 вход проверяется еще раз, чтобы быть уверенным, что изменение на входе не было помехой.

Когда стартовый бит детектирован, RTCC модуль перенастраивается на увеличение от внутреннего генератора, а предустановка счетчика при этом зависит от частоты тактового генератора и скорости передачи, ( конфигурируются так же, как в передающем режиме ). Программа последовательного порта переходит в режим приема при вызове функции 'GetChar'.

Перед вызовом этой функции необходимо убедиться, что порт свободен ( в '_txmtProgress' и '_revOver' битах статуса должны быть 0 ). После завершения приема байта данные сохраняются в регистре 'RxReg', и бит '_revOver' обнуляется.Основные моменты применения функции 'GetChar'.

1) Убедитесь, что биты '_txmtProgress' и '_rcvOver' очищены.2) Вызовите функцию 'GetChar'.3) Принятый байт сохраняется в в регистре 'RxReg', после чего бит '_revOver' обнуляется.

Генерация четности.

Проверка четности может быть разрешена в общих временных установках переводом флага '_PATITY_ENABLE' в состояние TRUE. Если четность разрешена, она может быть выбрана 'EVEN' или 'ODD' ( проверка на нечетность или на четность ).

В режиме передачи, если проверка на четность разрешена, вычисляется и передается девятым бит четности. В режиме приема четность вычисляется из принятого байта и сравнивается с девятым принятым битом. Если эти значения не совпадают, в регистре Состояния / Управления ( RS-232 Status / Control Register ) будет установлен бит '_ParityErr'.

Бит четности вычисляется по алгоритму, указанному на рис. 1. Для реализации этого алгоритма очень эффективно использовать команды PIC16Cxx 'SWAPF' и 'XORWF' ( со способностью сохранять результаты операций как в том же регистре, так и в W регистре ).

Подпрограмма генерации четности называется 'GenParity' находится в файле 'txmtr.asm'.

Рис.2 Алгоритм вычисления значения четности.

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

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

Технические характеристики

  • Разрядность АЦП, дв. разрядов….. 12
  • Минимальный период повторения отсчетов, мкс….. 300
  • Интервал входных сигналов (без делителя), В….. -1.25…+1.25
  • Входное сопротивление, МОм….. 1
  • Входная емкость, пФ….. 30

Указанные значения входного сопротивления и емкости дают возможность подавать входной сигнал с помощью стандартного щупа — делителя напряжения для обычного осциллографа. Подходят, например, щупы PROBE60S, НР-9060.Разработанная для работы с приставкой программа обеспечивает наблюдение осциллограмм сигналов на экране монитора при скорости временной развертки 0.3… 100 мс/дел. В режиме регистратора программа ведет запись отсчетов сигнала с максимальным периодом повторения 100 с в текстовый файл (кодировка ASCII), пригодный для анализа с помощью других программ.
Схема приставки-АЦП изображена на рис. 1. Исследуемый сигнал поступает на разъем XW1 На ОУ DA1.2 выполнен повторитель, а на DA1.1 — узел сдвига уровня, необходимый для превращения биполярных (-1,25…+1,25 В) сигналов в однополярные (0…+2.5), которые способен обрабатывать АЦП DA2 Образцовое напряжение +2,5 В подано на узел сдвига с соответствующего выхода АЦП через повторитель на ОУ DA1.3.Использован 12-разрядный АЦП AD7495 [1] с последовательным интерфейсом Сигналом начала цикла преобразования служит смена высокого уровня на входе CS АЦП низким при высоком уровне на входе SCLK. Затем на вход SCLK подают 16 импульсов низкого уровня. На выходе SDAT в ответ на четыре первых импульса будет установлен низкий уровень, а на каждый из 12 последующих — уровень соответствующий значению очередного разряда результата преобразования, начиная со старшего. Завершают цикл установкой высокого уровня на входе CS.Для передачи результата преобразования в компьютер применен интерфейс USB, реализуемый с помощью микросхемы FT232BM — преобразователя USB—RS-232 [2] Эта микросхема способна работать в режиме Bit Bang [3] в котором линии ее порта RS-232 образуют восьмиразрядную параллельную шину данных с индивидуальной настройкой разрядов на ввод или вывод. Программную поддержку режима Bit Bang в компьютере обеспечивает драйвер D2XX |4|. бесплатно распространяемый разработчиками микросхемыЧтобы сформировать нужную временную диаграмму сигналов управления АЦП. компьютерная программа заполняет выходной буфер USB байтами, несущими в соответствующих разрядах значения этих сигналов в каждом такте. Для одною цикла работы АЦП требуется сформировать и передать 34 байта (по два на каждый тактовый импульс и еще два для управления сит -налом CS). Темп выдачи значении из этих байтов на выходы DTR и RTS преобразователя интерфейса, с которыми соединены входы CS и SCLK АЦП. зависит от настройки внутреннего синтезатора тактовой частоты преобразователя. Настройку изменяют командами от компьютера, регулируя таким образом скорость работы АЦП. а вместе с ней и частоту дискретизации входного сигнала.Последовательный выход АЦП соединен с входом CTS преобразователя интерфейса, благодаря чему результаты работы АЦП поступают в буфер преобразователя интерфейса, а из него по USB — в компьютер В связи с особенностями протокола обмена по USB передача информации в компьютер происходит с довольно большой, а главное, непредсказуемой задержкой Чтобы решить проблему на вход DSR преобразователя интерфейса подан тот же сигнал, что и на вход CS АЦП Получая информацию об уровнях на входе CS и на выходе SDAT АЦП одновременно, ком-пьютерная программа имеет возможность найти в полученной последовательности начало и конец каждого цик-ла преобразования и правильно декодировать его результат.В приставке реализовано важное преимущество интерфейса USB — как уже сказано, ей не требуется отдельный источник питания Напряжение +5 В поступает на микросхемы с контакта I розетки XS1 через развязывающие LC-и PC- филыры Напряжение 5 В, необходимое для питания ОУ DA1. получено с помощью преобразователя напряжения DC-101 фирмы YCL. Аналогичный можно наити на плате неисправного компьютерного адаптера сети Ethernet, предназначенного для связи по коаксиальному кабелю Пригодны и друг ие модули преобразователей постоянного напряжения 5 В в 5. 9 В с гальванической развязкойПриставка смонтирована на макетной плате, на которой расположены все элементы, за исключением разъема XW1 Мон I аж выполнен проводом МГТФ Выводы малогабаритных микросхем соединены с контактными площадками макетной платы отрезками луженого провода диаметром 0.2 мм.
Коаксиальный разъём XW1 — СР-50-73ФВ (BNC Jack) XS1 — розетка USB-В для печатного монтажа, ее стандартным кабелем соединяют с одной из розеток USB-А компьютера. Приставка (ее внешнии вид вместе с USB кабелем и щупом-делителем показан на рис. 2) собрана в пластмассовом корпусе от телефонной розетки RJ-11

Подключенную к разъему USB приставку операционная система компьютера автоматически опознает как новое USB-устроиство.

Прочитав его идентификаторы (микросхеме FT232BM по умолчанию присвоены VID=0x0403 и PID: 0x6001), она пытается наити в памяти компьютера и установить подходящий программный драйвер устройства.

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

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

Кнопками на панели TIME/DIV — Scope изменяют скорость “развертки”, а на панели INPUT DIVIDER устанавливают соответствие показаний вольтметра измеряемому напряжению при использовании щупа-делителя.

Органами управления, расположенными на панели Syncro, выбирают вид синхронизации развертки и управляют условиями ее запуска. Синхронизация реализована программно и основана на поиске отсчета, удовлетворяющего заданным условиям, в буфере принятых от АЦП данных. Выбрав в меню “File” пункт “Save Image…”, можно записать наблюдаемую осциллограмму в графический файл.

В режиме регистратора, в который входят, нажав на панели TIME/DIV — Recorder одну из кнопок, задающих период повторения отсчетов в секундах, программа записывает принятую от АЦП информацию в текстовый файл практически неограниченного размера. По умолчанию будет создан файл data.txt, но это имя можно изменить, выбрав в меню “File” пункт “Save Data As…”.

В окне Options, открывающемся при выборе одноименного пункта главного меню, можно задать Device ID — имя, по которому программа ищет приставку-АЦП в списке подключенных к компьютеру устройств. Оно должно совпасть с заданным при установке драйвера, по умолчанию — “USB Serial”.

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

Кнопки Power ON/OFF служат для логического включения и выключения АЦП. При отключении приставки от компьютера программа автоматически переходит в режим OFF.

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

_ClkIn Тактовая частота генератора микроконтроллера.
_BaudRate Описание скорости передачи. Могут быть использованы любые обоснованные значения. Максимальная скорость зависит от тактовой частоты генератора микроконтроллера. При частоте 4Мгц возможна передача со скоростями 600 .. 4800 Бод. Для скорости 600 .. 19200 Бод необходимо, чтобы микроконтроллер работал на частоте 10МГц. С повышением частоты может быть достигнут больший темп. Если '_ClkIn' и '_BaudRate' заданы, программа автоматически определяет все соответствующие временные настройки.
_DataBits Может быть определено от 1 до 8.
_StopBits Ограничено одним стопбитом. Может быть установлено в 1.
_PARITY_ENABLE '_PARITY_ENABLE' флаг. Может быть установлен в TRUE или в FALSE. Если четность проверяется – установите TRUE, иначе – FALSE. Смотрите ниже описание флага '_ODD_PARITY'.
_ODD_PARITY Устанавливается TRUE или FALSE. Если TRUE, значит выполняется проверка на четность, иначе – на нечетность. Этот флаг игнорируется если '_PARITY_ENABLE' установлен в FALSE.
_USE_TRSCTS TRS и CTS – сигналы аппаратного контроля передачи. Если это бит установлен в FALSE – аппаратный контроль не используется. Если в TRUE – TRS и CTS линии используют еще два выхода PORTB.

Установки регистра Состояния / Управления ( Serial Status / Control Register ).

Бит # Имя Описание
_txmtProgress 1 – говорит о том, что выполняется передача. 0 – передающая линия свободна.
1 _txmtEnable При инициализации этот бит устанавливается в 1 для разрешения передачи. Этот бит может быть использован для прерывания передачи. Передача будит прервана если во время ее выполнения ( когда '_txmtProgress' находится в 1 ) установить бит '_txmtEnable' в 0. Этот бит устанавливается автоматически когда вызывается функция 'PutChar'.
2 _rcvProgress Это бит находится в 1 во время приема байта. Он сбрасывается в 0 когда прием байта закончен и устанавливается в 1 когда в режиме приема детектируется стартовый бит.
3 _rcvOver 0 говорит о том, что прием байта закончился. Ваша программа может опрашивать этот бит после вызова функции 'GetChar' и проверять установлен ли он. Если сброшен в 0, значит, принятый байт находится в 'RxReg'. Другие биты состояния также должны быть просмотрены, чтобы проверить не было ли ошибок при приеме.
4 _ParityErr 1 говорит о том, что есть ошибка четности в принятых данных ( независимо ото того, что выбрано – проверка на четность ( 'ODD' ) или на нечетность ( 'EVEN' ) ) Не используется если проверка четности отключена.
5 _FrameErr 1 говорит о наличии ошибки кадра при приеме.
6 Не используется.
7 _parityBit Девятый бит при приеме и передаче. В передающем режиме в этот бите передается информация о четности передаваемого байта. В режиме приема в этом бите сохраняется девятый бит принятого байта. Не используется если проверка четности отключена.

Аппаратная часть.
Аппаратная часть – это в первую очередь решение проблемы совместимости уровней RS-232 с уровнями ТТЛ. Ниже приведены три схемы, и пользователь может выбрать ту из них, которая для него лучше подходит. Основное отличие между предложенными вариантами – это соотношение цены и количества элементов. Схемы на рис.3 и рис.4 очень дешевы, но имеют больше элементов по сравнению со схемой, представленной на рис.2. В схеме на рис.2 в качестве интерфейса RS-232 используется одна микросхема (MAX232) и один источник питания +5В. Схема на рис.2 имеет более дешевый интерфейс RS-232, но требует две микросхемы при одном источнике питания +5В.
На рис.4 представлен очень дешевый RS-232 интерфейс, не требующий внешнего источника питания. Схема питается от порта RS-232 ( выход DTR ) и потребляет не более 5мА. При этом необходимо, чтобы на линии DTR был установлен высокий уровень, а на линии RTS – низкий. Напряжение на выходе DTR должно быть не менее +7В. Отрицательное напряжение, необходимое для питания LM339, снимается с выхода RTS, оно должно быть в пределах -5 ..-10В. Применение такой схемы возможно по тому, что PIC16C71 имеет низкое потребление ( обычно 2мА ).
Рис.2 Интерфейс RS-232 на одной микросхеме ( один источник питания +5В ).
Рис.3 Дешевый интерфейс RS-232 ( две микросхемы, один источник питания +5В ).
Рис.4 Дешевый интерфейс RS-232 с низким потреблением ( питается от порта RS-232 ).
Тестевая программа.
Для тестирования передающего и принимающего модулей используется программа 'rs232', написанная для PIC16C71. При запуске программа ждет, когда от ПК через RS-232 порт поступит команда. При приеме байта ( возможны команды 0x00, 0x01,0x02 и 0x03 ), принятые данные воспринимаются как номер АЦП канала PIC16C71. После выбора соответствующего канала, выполняется АЦП преобразование, и затем ( примерно через 20мс ) данные в цифровом виде ( 8 бит ) передаются назад в ПК. Программа DVD.exe работает на IBM PC под Windows. Она работает как сборщик АЦП данных, читаемых из PIC16C71 через RS-232 порт. Программа работает в фоновом режиме и отображает АЦП данные в небольшом окне ( похожее на окно с часами в Windows 3.1 ). Программа и PIC16C71 вместе работают как опрашивающая система или цифровой вольтметр ( DVM ). Следует использовать следующие настройки: частота генератора – 4МГц, параметры RS-232: 1200 Бод, 8Бит.

 Рис.5 Программа, отображающая АЦП данные, принятые от PIC16C71 через RS-232.
Исходный код.
 Программа для PIC16Cxx вместе с тестевой программой DVM доступны здесь Вы не можете скачивать файлы с нашего сервера Вы не можете скачивать файлы с нашего сервера . Программа на ассемблере для PIC16Cxx должна быть ассемблирована с помощью Microchip's Universal Assembler – MPASM. Эта программа не может быть ассемблирована старым ассемблером. Поэтому пользователи, использующие старую версию MPASM, должны его обновить.Программа DVM работает в фоновом режиме, не имеет ни каких меню, она выполнена как небольшое окно, в котором отображаются АЦП данные. Ниже приведены несколько команд программы, запускаемых из командной строки.- Px : x – номер COM порта ( например P2 выбирает порт COM2 ). По умолчанию – COM1- Cy : y – номер отображаемого АЦП канала. По умолчанию первый канал.

– Sz : z определяет формат отображения данных.


Источник: http://pic16f84.narod.ru

Обсудить на форумеДанная статья описывает конфигурацию драйвера Uni-Telway – способ подчиненного дублирующего последовательного порта с удаленным устройством. PIC — микроконтроллеры Гарвардской архитектуры, производимые американской компанией Microchip Technology Inc. Название PIC является сокращением от Peripheral Interface Controller, что означает «периферийный интерфейсный Микроконтроллеры AVR имеют гарвардскую архитектуру (программа и данные находятся в разных адресных пространствах) и систему команд, близкую к идеологии RISC. Процессор AVR имеет 32 8-битных регистра общего назначения, объединённых в регистровый файл. Большинство микроконтроллеров ATtiny не имеют аппаратного модуля UART из-за ограниченного количества выводов. Ядра Arduino tiny используют класс TinyDebugSerial, который обеспечивает только передачу данных, для приема данных нужно писать HY -> Hynix Memory, говорит о том, что микросхема произведена компанией Hynix AA -> Указывает тип памяти, принимает одно из следующих значений… A -> Указывает тип памяти, принимает буквенные значения от А до Z, каждому из которых соответствует определенный тип памяти. На памяти видеокарт вы можете встретить следующие буквы…

Источник: https://ingeneryi.info/radio-kom/rd-kom/ms-kom/3860-realizaciya-posledovatelnoy-asinhronnoy-peredachi-dannyh-v-mikrokontrollerah-pic.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}