Прежде всего изучите страницы прошлых лет. Здесь только отличия.

Оглавление

Lab 1. Изучение среды программирования LabWindows/CVI

Практическое задание 1 (парабола)

Существует две трактовки задания. Согласно первой, ещё до вызова функции CalculateRoots проверяем a == 0. Если это так, то функцию вообще не вызываем, а просто сообщаем, что уравнение не является квадратным.

Вторая трактовка состоит в том, что функцию вызываем всегда. После её вызова для вывода корней (но не для расчёта вершины) работаем только с тремя числами: D, X1, X2. Эти три числа должны закодировать все возможные варианты: 2 разных действительных корня (D > 0), 2 разных комплексных корня (D < 0), 2 одинаковых действительных корня (D = 0), 1 корень, любые корни, нет корней. На мой взгляд, единственный способ сделать это, придерживаясь задания (то есть не изменяя прототип функции CalculateRoots и не вводя глобальных переменных, которые бы изменялись в этой функции), — использовать спецзначения «не число» (NaN) или «бесконечность». В «LabWindows/CVI» можно использовать функцию NotANumber() (предварительно #include "toolbox.h"). В языке Си до версии C99 стандартного способа сделать это не было.

В любом случае вывод на экран должен быть человекопонятным. То есть в случае двух действительных корней должно быть что-то вроде printf("X1 = %lf\nX2 = %lf\n", X1, X2), а в случае мнимых printf("X1 = %lf + i*%lf\nX2 = %lf - i*%lf\n", X1, X2, X1, X2).

Lab 2. Магистрально-модульные системы автоматизации

Задание 2-2: пределы ставить ±11 В (как сказано в тексте. Рисунок неправильный).

Смысл сигнала ALE: «Внимание всем модулям! Я, контроллер шины, уже выставил на шине адрес. Запомните его!». У модулей есть 4 мкс после опускания сигнала.

Смысл низкого уровня сигнала WRITE: «Внимание всем модулям! Я, контроллер шины, уже выставил данные. Пусть тот, к кому была адресация, запомнит их!». У модуля есть 4 мкс после опускания сигнала.

Смысл низкого уровня сигнала READ: «Внимание всем модулям! Я, контроллер шины, готов читать шину и хочу, чтобы модуль, к которому была адресация, выставил данные!». У модуля есть 6 мкс после опускания сигнала на выставление данных, после чего он обязан держать шину неизменной до поднятия сигнала, после чего модуль должен отпустить шину AD.

опечатка стр. 27, алгоритм, пункт 1: не ЦАП, а АЦП.

Задание 3: под библиотекой имеется в виду набор .h- и .c-файлов. Эти библиотеки будут нужны для выполнения следующей работы, так что в ваших интересах сразу написать их аккуратно.

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

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

Перед изучением регистра данных ЦАП поэкспериментируйте с любым регистром пустого слота (адрес 3), а ещё с регистром таймера АЦП (должны читать то, что записали, но при записи 0 читается 1).

Задание 3-2: функция, принимающая код, должна иметь тип аргумента int, а не unsigned char.

Мысли на следующий год

Что-то лекции не прижились...

Не знают слова «commit». Боятся всего незнакомого. Даже если оно описано в книжке.

Проблемы с языком Си (вообще не знают switch, ?:), приоритетами операций (не уверен — ставь скобки).

Не читают задание. Или читают часть и пытаются написать программу в соответствии с ним, не прочитав задание до конца.

Не усваивается пройденный материал: в работе 2-1 не понимают, что такое таймер (делают бесконечный цикл с Delay(.25)), хотя он был в работе 1-2.

До начала выполнения 2-1 (наверное, надо дополнить работу 0) должно быть понимание битовых операций: как занулить (&), как установить (|), как инвертировать (^) определённые биты числа, не изменяя остальные (понятие маски). Если про числа a и b известно, что у них нет одновременно установленных битов, то a + b = a ^ b = a | b. Должны понимать и уметь писать конструкции вроде (a — unsigned char; 0 <= i, j <= 7):

Должно быть понимание функции main (что делают функции LoadPanel, DisplayPanel, RunUserInterface, в каком месте нужно писать свой код).

Предлагается упростить задание Lab2-1: единственнове, что должны узнать все — как работать с портами (функция PortOut). Разрешается даже не работать с индикаторами во время бегущего огня и не уметь выходить из него. Всё остальное (одна функция обратного вызова на все кнопки; фукция, аналогичная PortOut, для индикаторов) — для желающих (задание со звёздочкой).

Задание Lab3-2 предлагаю переформулировать следующим образом: необходимо написать 2 программы. 1-я должна только сохранять передаточную характеристику в файл. Файл должен содержать 2 столбца (через пробел): в первом напряжение, поданное ЦАПом NI; во втором код, прочитанный АЦП Avalon. Программа должна содержать 3 настройки (можно в виде #define или определения глобальной переменной): 1) минимальное генерируемое напряжение; 2) шаг генерации напряжения; 3) максимальное генерируемое напряжение. 2-я программа должна анализировать этот файл. Она не знает настроек предыдущей программы, даже не знает количества строк в файле (разрешается ввести ограничение сверху: 10 000). Она знает только следующие числа (их тоже нужно сделать через #define или определения глобальной переменной): минимальное напряжение АЦП (0), максимальное напряжение АЦП (2,6 В), разрядность (10).


Пишите на site@caesarion.ru чем больше, тем лучше: любые отзывы, пожелания, комментарии, исправления грамматических ошибок, предложения — всё, что связано с этим сайтом, как с содержанием, так и с технической стороной.

Сайт в «Архиве интернета»

Valid HTML 4.01 Strict Valid CSS!

Последнее изменение этой страницы: October 10 2017 06:44:30 UTC