Прежде всего изучите страницы прошлых лет. Здесь только отличия.
Для генерации функции обратного вызова отладка должна быть прекращена.
Шум имеется в виду белый; в частности, он не должен изменять среднее значение сигнала. Обоснуйте выбор пределов регулировки шума (в чём смысл отрицательного шума?).
Задание 1: функции ni6251Slot и ni6251Close следует вызывать лишь один раз за время работы программы, в функции main. То же касается регистров маски и записи: сами по себе они не меняются, не нужно постоянно перезаписывать одни и те же значения; маски всех портов и регистр записи порта 2 достаточно записать только в main.
Задание 1: на вопрос «А почему иногда горят верхние лампочки?» я отвечаю так: «Это неважно, но, раз спросили, сделайте так, чтобы не горели».
Задание 2: выберите необходимое количество знаков после запятой в интерфейсе (подсказка: посчитайте шаг ЦАП и АЦП). Почему введённое и измеренное число вольт, как правило, не совпадают? Почему при многократном нажатии кнопки измерения значения иногда получаются разные? Исследуйте пределы ЦАП и АЦП (ровно 10 В или в книжке округлено?).
Стр. 22: «Платы нумеруются с нуля слева направо...». Не платы, а разъёмы (включая пустые). То есть разъёму Slot 1 соответствует адрес 0, разъёму Slot 5 — адрес 4; адреса с 5 по 7 физически отсутствуют в терминальном модуле.
Задание 3-1: интерфейс должен содержать поля ввода адреса, субадреса и данных типа Numeric, тип данных int. Вы можете выбрать удобную для себя систему счисления (кнопка Format and Precision, поле Display Format).
Задание 3-1. Пошаговая инструкция для тех, кто вообще не понимает, что нужно сделать:
int avalon_init(void);
int avalon_deinit(void);
int avalon_write(unsigned char address, unsigned short subaddress, unsigned short data);
int avalon_read(unsigned char address, unsigned short subaddress, unsigned short *data);
return 0;
. Раскомментируйте строчку #include "avalon.h"
, скопируйте её в основной .c-файл проекта.
#define DEFAULT ... // состояние по умолчанию: ALE = 0, READ = 1, WRITE = 1
#define ALE ... // контроллер выставил адрес, модули должны его запомнить: ALE = 1, READ = 1, WRITE = 1
#define WRITE ... // контроллер выставил данные в цикле записи: ALE = 0, READ = 1, WRITE = 0
#define READ ... // модуль должен выставить данные в цикле чтения: ALE = 0, READ = 0, WRITE = 1
int avalon_address(unsigned char address, unsigned short subaddress);
вынесите общую часть в неё. Обратите внимание на ту часть получившейся функции, где устанавливаются маски и начальные значения портов. Эту часть кода достаточно выполнить лишь однажды за всё время работы программы, так что её лучше перенести в функцию avalon_init.
Задание 3-2: в связи с появлением стрелочных вольтметров теперь можно пользоваться ими вместо АЦП NI PXI. А ещё лучше — разрешить работу обоих каналов ЦАП Avalon и всегда записывать одни и те же данные в оба регистра данных.
Пишите на site@caesarion.ru чем больше, тем лучше: любые отзывы, пожелания, комментарии, исправления грамматических ошибок, предложения — всё, что связано с этим сайтом, как с содержанием, так и с технической стороной.
Последнее изменение этой страницы: January 06 2020 07:25:45 UTC