Микропроцессорные устройства и системы (А.В. Шарапов, 2008 г., 152 с.)ЛАБОРАТОРНАЯ РАБОТА № 1. Микроконтроллер ATtiny15LЦель работы. Целью лабораторной работы является отладка прикладных программ для микроконтроллера AVR семейства Tiny с помощью персонального компьютера и программных средств отладки. Программа работы 1. Загрузить для отладки в AVR Studio программу преобразования целых 16-битных чисел в двоично-десятичные числа. Алгоритм программы bin16BCD5 заключается в следующем. Предположим, что имеется целое беззнаковое 16-битное число (диапазон от 0 до 65535). Очевидно, что необходимо найти 5 десятичных цифр. Способ преобразования заключается в том, чтобы, вычитая из исходного числа число 10000, сначала определить десятичную цифру десятков тысяч. Затем находится цифра тысяч последовательным вычитанием числа 1000 и т.д. Вычитание каждый раз производится до получения отрицательной разности с подсчетом числа вычитаний. При переходе к определению каждого следующего десятичного разряда в регистрах исходного числа восстанавливается последняя положительная разность. После того, как будет найдена десятичная цифра десятков, в регистрах исходного числа останется десятичная цифра единиц. Проследить выполнение программы в пошаговом и автоматическом режиме, записав предварительно в регистры r16 и r17 шестнадцатеричное число , где N — номер варианта, рассчитанный по методике ТМЦ ДО (число от 1 до 9). В окне I/O раскройте содержимое Register 1—31, Processor, I/O ATTINY15 (CPU, WATCHDOG). Какие команды программы влияют на флаги регистра статуса SREG? Зафиксируйте в отчете результат преобразования. В программе часто используются команды вычитания константы из регистра. Есть ли в системе команд AVR аналогичные команды сложения регистра и константы? Как будет работать программа, если в ней удалить последнюю команду? ;***** Программа bin16BCD5 .DEVICE ATtiny15 ; Определить устройство .INCLUDE C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes n15def.inc ; Вложить файл определения адресов регистров ввода\вывода ;***** Регистровые переменные .def fbinL =r16 ; двоичное значение, младший байт .def fbinH =r17 ; двоичное значение, старший байт .def tBCD0 =r17 ; BCD значение, цифры 1 и 0 .def tBCD1 =r18 ; BCD значение, цифры 3 и 2 .def tBCD2 =r19 ; BCD значение, цифра 4 ; Переменные fbinH и tBCD0 должны размещаться в одном регистре WDR ; Сброс сторожевого таймера ldi r20,0b00001000 ; Включение сторожевого out WDTCR,r20 ; таймера ldi tBCD2, -1 ; Начало преобразования m1: inc tBCD2 subi fbinL, low(10000) sbci fbinH, high(10000) brsh m1 subi fbinL, low(-10000) sbci fbinH, high(-10000) ldi tBCD1, -0x11 m2: subi tBCD1, -0x10 subi fbinL, low(1000) sbci fbinH, high(1000) brsh m2 subi fbinL, low(-1000) sbci fbinH, high(-1000) m3: inc tBCD1 subi fbinL, low(100) sbci fbinH, high(100) brsh m3 subi fbinL, -100 ldi tBCD0, -0x10 m4: subi tBCD0, -0x10 subi fbinL, 10 brsh m4 subi fbinL, -10 add tBCD0, fbinL ; Конец преобразования m5: rjmp m5 ; Зацикливание программы Какой период срабатывания сторожевого таймера задан в программе? Что будет, если дождаться его срабатывания? 2. Загрузить для отладки в AVR Studio программу CLOK, реализующую двоично-десятичный счетчик на регистре r19. Счетчик считает с частотой прерываний по переполнению таймера Т0. Тактовый сигнал на вход таймера подается через программируемый делитель частоты. Коэффициент пересчета счетчика равен 100. Для счета используются вспомогательные регистры r16 (счет единиц), r17 (счет десятков) и r18 (объединение десятков и единиц). Основная программа обнуляет регистры счетчика, устанавливает режим работы Т0, разрешает прерывания по переполнению Т0 и зацикливается. Двоично-десятичный счет реализуется в подпрограмме прерывания, расположенной начиная с адреса вектора прерывания по переполнению таймера Т0. Заметим, что в системе команд AVR нет команды сложения регистра с константой и команды десятичной коррекции аккумулятора, как и самого аккумулятора. Набрать исходный текст программы CLOK.asm без комментария. Проверить работу в пошаговом и автоматическом режимах. В окне I/O AVR Studio раскройте содержимое Register 1—31, I/O ATTINY15 (CPU, TIMER_COUNTER_0). ;****** Программа CLOK .DEVICE ATtiny15 .INCLUDE C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes n15def.inc rjmp RESET .org $005 ; Вектор прерывания по переполнению T0 inc r16 ; Инкремент единиц cpi r16,$0A breq m1 rjmp m3 m1: clr r16 subi r17,-$10 ; Инкремент десятков cpi r17, breq m2 rjmp m3 m2: clr r17 m3: mov r18,r17 add r18,r16 mov r19,r18 ; Инкремент двоично-десятичного счета reti RESET: clr r16 ; Обнуление регистров clr r17 clr r18 clr r19 ldi r20,0b00000001 ; Выбор источника тактового сигнала для Т0 out TCCR0,r20 ldi r20,0b00000010 ; Разрешение прерываний out TIMSK,r20 ; по переполнению таймера T0 sei ; Глобальное разрешение прерываний m4: rjmp m4 С какой частотой переполняется Т0? Каким образом можно уменьшить скорость счета в 1024 раза? Объяснить поведение регистров SREG и TIFR при работе программы. Пояснить назначение директивы .DEVICE. Пояснить содержимое файла clok.map в окне Project. Изменить программу так, чтобы уменьшить коэффициент пересчета счетчика до 10N, где N — номер варианта. В отчете представить измененный вариант программы с комментарием. 3. Сформировать на выводе РВ1 (ОС1А) микроконтроллера ШИМ-сигнал с частотой 50 кГц (программа PWM1). Таймер Т1 используется как генератор импульсов с программируемым периодом (содержимое регистра сравнения OCR1B) и длительностью (содержимое регистра сравнения OCR1А). В окне I/O раскройте содержимое Register 1—31, Processor, I/O ATTINY15 (PORTB, TIMER_COUNTER_1). ;****** Программа PWM1 .DEVICE ATtiny15 .INCLUDE C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes n15def.inc sbi DDRB,1 ; Настройка первой линии порта В на вывод ldi r16,0b01100010 ; Режим работы Т1 (ШИМ с частотой ; тактирования 12.8 МГц, 1 при сбросе, ; 0 при сравнении) out TCCR1,r16 ldi r16,0xFF ; Частота импульсов 50 кГц out OCR1B,r16 ldi r16,0x80 ; Скважность импульсов примерно 2 out OCR1A,r16 m1: rjmp m1 Проследить работу программы в пошаговом режиме. На сколько меняется содержимое Т1 при выполнении команды rjmp m1? Почему? Какие флаги устанавливаются в регистре TIFR? Модифицировать программу так, чтобы частота ШИМ составила 20 кГц, а скважность — 4 (отношение периода к длительности импульса). 4. Проверить программу обращения к энергонезависимой памяти данных EEPROM (проект EEPROM). Открыть окна для просмотра регистров общего назначения 16—31, регистров ввода/вывода (CPU, EEPROM), памяти EEPROM (Memory 3). Проследите выполнение программы в пошаговом режиме. Когда выполняется подпрограмма прерывания и что она делает? Специального флага прерываний от EEPROM нет, поэтому при обращении к подпрограмме прерывания флаг не сбрасывается и прерывания генерируются постоянно. ;****** Программа EEPROM .DEVICE ATtiny15 .INCLUDE C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes n15def.inc .cseg ; Рабочие переменные .def AddrReg=r20 .def Data1Reg=r21 .def Data2Reg=r22 ; Векторы прерываний rjmp RESET reti reti reti reti reti rjmp EEPROM_READY ; Вектор прерывания по записи в EEPROM reti reti EEPROM_READY: ; Подпрограмма прерывания по окончании inc r25 ; цикла записи в EEPROM reti EEWrite: ; Подпрограмма записи байта в EEPROM sbic EECR,EEWE ; Ждать, пока флаг EEWE rjmp EEWRite ; не будет сброшен cli ; Запретить прерывания out EEAR,AddrReg ; Загрузить адрес out EEDR,Data1Reg ; Загрузить данные sbi EECR,EEMWE sbi EECR,EEWE ; Выдать строб записи байта в EEPROM sbi EECR,EERIE ; Разрешить прерывание по завершении sei ; цикла записи в EEPROM cbi EECR,EERIE ; Запретить дальнейшие прерывания ret EERead: ; Подпрограмма чтения байта EEPROM sbic EECR,EEWE ; Ждать окончания текущей записи, пока rjmp EERead ; флаг EEWE не равен 0 rjmp EEWRite out EEAR,AddrReg ; Загрузить адрес sbi EECR,EERE ; Выдать строб чтения из EEPROM in Data2Reg,EEDR ; Прочитанный байт в регистр ret RESET: ; Начало основной программы clr r25 ; Очистка регистров clr r21 clr r22 ldi AddrReg,$18 ldi Data1Reg, rcall EEWrite ; Вызов подпрограммы записи в EEPROM rcall EERead ; Вызов подпрограммы чтения из EEPROM m1: rjmp m1 Изменить программу так, чтобы она записывала в ячейку N EEPROM число 100+N, а читала записанный байт в регистр rN, где N — номер варианта (число от 1 до 9). Контрольные вопросы 1. Где сохраняется адрес возврата при обращении к подпрограммам? Почему в программной модели микроконтроллера ATtiny15 нет указателя стека? Какую разрядность имеет стек ATtiny15 и сколько в нем ячеек? Можно ли реализовать в ATtiny15 вложенные прерывания программы? 2. Перечислите все источники прерываний в ATtiny15 в порядке убывания приоритета. 3. Каким образом программируется FLASH-память программ ATtiny15? 4. Какой командой микроконтроллер переводится в спящий режим? 5. Биты каких регистров можно устанавливать ЛАБОРАТОРНАЯ РАБОТА № 2. Микроконтроллер ATmega8 Цель работы. Целью лабораторной работы является отладка прикладных программ для микроконтроллера AVR семейства Mega с помощью персонального компьютера и программных средств отладки. Программа работы 1. Рассчитав номер варианта (от N=1 до N=9), загрузить для отладки программу преобразования двоично-десятичного кода числа (байт) в двоичный (программа decbin_to_bin). Перед выполнением программы необходимо в окне Workspace загрузить в регистр r16 число 10N+N в двоично-десятичном виде, которое подвергнется преобразованию. ;****** Программа decbin_to_bin mov r17,r16 ; Исходное двоично-десятичное число ; хранится в r16 andi r17,0xF0 ; Выделение старшей тетрады (десятков) swap r17 ; ldi r18,10 ; Умножение десятков на десять mul r17,r18 ; mov r17,r16 ; Выделение младшей тетрады (единиц) andi r17,0x0F ; add r17,r0 ; Сложение результатов. Результат остаётся в r17 При выполнении программы число копируется в регистр r17, там на него накладывается маска 0b11110000 при помощи команды логического умножения (andi), которая выделяет десятки десятичного кода. После этого результат перемещается в младшую тетраду и умножается на 10. Результат умножения сохраняется в регистровой паре r1:r0. Так как наше число не может быть больше 99, то оно целиком поместится в младший байт результата, т.е. в r0. После этого повторно загружаем исходное число в r17, ещё раз накладываем маску, только на этот раз для выделения младшей тетрады, и суммируем результат с содержимым регистра r0, в котором хранились десятки. Конечный результат будет представлен в регистре r17. Проследить процесс выполнения программы в пошаговом и автоматическом режимах. Пояснить содержимое строк окна Disassembler. Внести ошибки в программу (неверная мнемоника команды, неверный операнд и т.п.) и проследить сообщения ассемблера при этом в окне View Output. Модифицировать программу в соответствии со своим вариантом индивидуального задания: 1. Преобразовать дополнительный код числа (байт) в прямой. 2. Преобразовать двоичный код (от 0 до 99) в двоично-десятичный. 3. Просуммировать два числа в двоичном коде. Сумму, большую 255, заменить байтом единиц. 4. Сложить два двухбайтовых числа. 5. Вычесть два числа в двоичном коде. Разность, меньшую нуля, заменить байтом нулей. 6. Умножить на два двухбайтовое содержимое регистров R9..R10 (меньшее 32 000). 7. Сложить два десятичных числа (байт) в двоично-десятичном коде. 8. Реализовать суммирующий двоично-десятичный счетчик. 9. Реализовать вычитающий двоично-десятичный счетчик. 2. Загрузить для отладки программу определения максимального элемента массива 8-разрядных чисел SRAM (программа max_el_mass). Перед выполнением программы необходимо заполнить область памяти данных случайными числами, начиная с адреса 0x60. Количество элементов определяется числом, загружаемым в начале программы в r18. Для обращения к памяти с адресом более 8 разрядов программа использует специально для этого предназначенный Z-ре-гистр. Он состоит из пары регистров r31:r30. В начале выполнения программа копирует первый элемент массива в r16, а адрес этого элемента в Х (регистровая пара r27:r26). После этого каждый элемент сравнивается со значением в r16, и в том случае, если элемент окажется больше содержимого r16, он замещает собой предыдущее значение в r16, а также адрес нового наибольшего элемента копируется в пару Х. Каждый раз при сравнении из количества элементов вычитается единица. Как только содержимое r18 станет равным 0, выполнение программы можно прекращать в связи с перебором всех элементов. В итоге получим наибольший элемент в r16, его адрес в Х. ;****** Программа max_el_mass ldi r30,low($100) ;Загрузка в регистр Z начального адреса ldi r31,high($100) ;массива чисел ldi r18,12 ;Загрузка количества элементов массива ld r16,z ;Загрузка в регистр r16 первого элемента массива mov r26,r30 ;Загрузка в X адреса первого элемента mov r27,r31 dec r18 m1: inc r30 ;Увеличение Z на единицу для загрузки ; следующего элемента ld r17,z ;Загрузка элемента для сравнения cp r16,r17 ;Сравнение максимального (или первого) элемента ;с только что загруженным brsh m2 mov r16,r17 ;его перезапись в r16 в случае, если больше, mov r26,r30 ;и сохранение адреса в X mov r27,r31 m2: dec r18 ;Уменьшение счётчика количества элементов brbc 1,m1 ;Если не все элементы перебраны, переход на m1 m3: jmp m3 ;Зацикливание по завершении Модифицировать программу в соответствии со своим вариантом индивидуального задания: 1. Определить минимальный элемент массива SRAM. 2. Сформировать массив 3, элементы которого определяются как разность соответствующих элементов массивов 1 и 2. Отрицательную разность заменить нулем. 3. Сформировать массив 3, элементы которого определяются как сумма соответствующих элементов массивов 1 и 2. Сумму, большую 255, заменить байтом единиц. 4. Количество одинаковых элементов массивов 1 и 2 поместить в регистр R0. 5. Количество чисел массива 1, совпадающих с содержимым регистра R1, поместить в регистр R0. 6. Двоичные числа массива преобразовать в двоично-десятичные. 7. Двоично-десятичные числа массива (меньшие 99) преобразовать в двоичные. 8. Сформировать массив 2, элементы которого представляют дополнительный код восьмиразрядных чисел со знаком массива 1. 9. Отсортировать массив по возрастанию элементов. 3. Набрать и отладить прикладную программу fairy, позволяющую получить эффект бегущей 1 на линиях порта. Ввести код программы в отладчик AVRStudio и проверить ее работу в пошаговом режиме. Проследить изменения, происходящие в регистрах SREG, PORTВ и PINВ по мере выполнения программы. Для чего в регистр DDRВ заносится 0xFF? Чем отличается команда rol от команд lsl и asr? ;****** Программа fairy .INCLUDE C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc ; Подключение файла определения адресов ldi r16,0xFF out DDRB,r16 sec clr r16 m1: rol r16 out PORTB,r16 rjmp m1 Дополните программу подпрограммой задержки Delay таким образом, чтобы содержимое r17 определяло длительность паузы между сменой состояния на выводах порта. Примечание: для вызова подпрограммы необходимо активировать стек, что происходит автоматически при указании его начала в паре регистров sph:spl. Модифицировать программу в соответствии со своим вариантом индивидуального задания и произвести ее отладку: 1. Мультивибратор (тетрады порта D заполняются либо единицами, либо нулями в цикле, скорость миганий можно изменять с помощью порта В). 2. Бегущий огонек со сменой направления на линиях порта С. 3. Елочка 1 (линейка светодиодов, подключенная к линиям порта В, последовательно заполняется огнями и затем гаснет, после чего эффект периодически повторяется). 4. Бегущий огонек на линиях порта C должен сменить направление, если на пяти линиях порта В установлены логические единицы. 5. Елочка 2 (линейка светодиодов, подключенная к линиям порта, последовательно заполняется огнями и постоянно горит, а звезда — старший бит — моргает). 6. Если на выводы порта D пришло число с нечётным количеством единиц, то оно передаётся через порт В, если с чётным — через порт С. 7. Бегущий огонёк в одну сторону бежит по выводам порта B, в другую — порта D. 8. Одна тетрада поступающего на выводы порта D числа должна быть отправлена через порт B, другая через С. 9. Если поступившее на выводы порта D число чётное, то должны мигать выводы порта В, если нет — то порта С. 4. Загрузить для отладки программу генерации сигнала заданной частоты (программа Generator). ;****** Программа Generator ; Генератор импульсов с программируемым периодом Т=2n(1+X), где ; Х — число в регистре OCR1A, n — коэффициент деления предделителя .INCLUDE C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc ldi r16,0x02 ; Линию РВ1 на вывод out DDRB,r16 ; ldi r16,0b01000000 ; Режим СТС таймера T1, состояние ; вывода РВ1 при сравнении меняется out TCCR1A,r16 ; на противоположное ldi r16,0b00001001 ; Режим СТС таймера T1 на частоте out TCCR1B,r16 ; тактирования (n=1) ldi r16,99 ; Модуль счета Х=99 для out OCR1AL,r16 ; периода Т=200 тактов m1: rjmp m1 Изменить программу так, чтобы период генерируемых прямоугольных импульсов на выводе РВ1 составил N секунд при использовании кварцевого резонатора на 16 МГц (N — вариант задания). 5. Составить комментарий к программе PWM2. ;****** Программа PWM2 .INCLUDE C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc ldi r16,0x02 out DDRB,r16 ldi r16,0x7F out OCR1AL,r16 ldi r16,0b11000001 out TCCR1A,r16 ldi r16,0b00000010 out TCCR1B,r16 m1: rjmp m1 Ввести код программы в отладчик AVR Studio и проверить ее работу в пошаговом режиме. Какой режим ШИМ выбран в данном случае? Какова относительная длительность импульсов на выводе OC1A? С какой частотой относительно частоты кварца поступают импульсы синхронизации на таймер/счётчик? Контрольные вопросы • Чем ограничен размер массива? • Перечислите все методы адресации памяти данных. • Разрешены ли прерывания после системного сброса? • Для чего нужен регистр Input capture (ICR)? Назовите ситуации, когда необходимо его использование. Назовите его альтернативные функции. • Что должно произойти при достижении счётчиком значения 0x01FF, если в битах WGMn3:1 записано 0b0010? 0b0110? Как при этом поведёт себя OCnx? • Что может выступать в качестве источника импульсов синхронизации таймеров/счётчиков? ЛАБОРАТОРНАЯ РАБОТА № 3. Моделирование работы микроконтроллера AVR с помощью симулятора VMLAB Цель работы. Целью лабораторной работы является отладка прикладных программ на языке Си для микроконтроллера AVR с помощью компилятора CVAVR и симулятора VMLAB. Программа работы 1. Установите в директорию C:\CVAVR свободную версию компилятора CodeVisionAVR. В директории C:\CVAVR создайте папку z1 (задача 1) для файлов первого проекта. Запустите компилятор. Для создания файла проекта нажимайте: Файл -> новый -> проект -> ОК -> No – перейдите в созданную для проекта папку z1 и введите в поле имя файла: z1; – нажмите сохранить — откроется окно конфигурации проекта; – перейдите на закладку С compiler; – выберите MK (Chip) ATmega16; – установите частоту тактирования МК (Clock) 4.0 МГц; – нажмите ОК. Перед вами появится открытый текстовый файл Project Notes — z1.prj, в котором вы можете записывать свои замечания и мысли по проекту. Теперь нужно создать главный для нас текстовый файл для набора исходного текста на Си — его расширение .с – нажимайте: Файл -> New -> Source -> ОК появился файл untitled.c – нажимайте: Файл — Сохранить как – введите в поле имя файла: z1.c и нажмите Сохранить. Нужно добавить созданный файл z1.c в список файлов проекта — откройте меню конфигурирования проекта: Project -> Configure. В открывшемся диалоге, нужно выбрать ярлык Files и нажать кнопку Add. В новом диалоге выберите файл z1.c и нажмите Открыть. Теперь файл включен в проект: – нажимайте ОК – максимизируйте (разверните) окно файла — z1.c Теперь все готово к собственно программированию, т.е. к созданию текста программы на языке Си. Ниже в таблице подготовлен текст программы к задаче 1, реализующей следующее техническое задание: разработать устройство на микроконтроллере ATmega16, которое будет отображать в двоичном виде горящими светодиодами 8-битное число начиная с 0 и с постоянным увеличением на 1. Устройство питается постоянным стабилизированным напряжением от 4 до 5.5 вольт. Тактирование МК осуществляется от кварцевого резонатора с частотой 4 МГц. Всего подключено 8 светодиодов от ножек порта A через токоограничительные резисторы к питанию МК. Переключение светодиодов должно производиться с паузами в 65 мс. #include #define PA_OUT DDRA = 0xFF /* Заменить везде в тексте программы PA_OUT на DDRA = 0xFF */ // ++++ функция инициализации МК ++++ void initialization(void){ PA_OUT;//сделать весь PORTA выходом TCCR0 = 0x05;/* таймер включить считать, делая один отсчет каждые 1024 колебания на ножке XTAL1 */ } Char per=0; // ++++ Главная функция ++++ void main (void){ initialization(); /* Вызвать функцию инициализации МК — т.е. настройки нужных нам устройств МК в соответствии с поставленной задачей */ //Бесконечный цикл while (1){ //Делать всегда PORTA=~(per++); while (!(TIFR&0x01)); // ждем установки флага переполнения timer0 TIFR = 0x01; // очистить флаг переполнения timer0 }; //цикл закончен } //скобка для main() Запишите (без комментариев) программу в окно исходного текста программы. Сохраните изменения: файл -> Save All. Для компиляции программы нажмите кнопочку Make the project. Загляните в папку нашего проекта — z1. В результате компиляции там появилось много новых файлов. Главные для нас: z1.hex — файл-прошивка для загрузки в МК; z1__.с — копия файла z1.c для симуляторов; z1.cof — информация, связывающая содержимое файлов z1__.с и z1.hex. Эта информация позволяет при симуляции в VMLAB наблюдать движение программы прямо по коду на языке Си. Указанные файлы будем использовать в симуляторе VMLAB. Необходимым для реального МК является лишь файл прошивки. Следующие четыре файла содержат нашу программу, написанную на стандартном ассемблере для AVR с привязкой к тексту на Си: z1.asm, z1.lst, z1.vec, z1.inc. Остальные файлы практически не интересны. 2. Запустите VMLAB и откройте созданный проект: Project -> Open Project File Перейдите в папку задачи 1 C:\CVAVR\z1\ и наберите имя файла z1_vm.prj проекта для VMLAB. После появления фразы, что такой файл не существует, VMLAB предложит создать его, с чем вы соглашайтесь. В появившемся окне запишите без комментариев приведенный ниже в таблице текстовый файл. ; Файл-проект z1_vm.prj для симуляции по задаче 1. ; Комментарии пишутся в VMLAB только в одну строчку ; после точки с запятой ; МК как бы прошит файлом — z1.hex. После включения МК ; горящие светодиоды показывают в двоичном виде числа от 0 ; до 255 и далее опять с нуля и так по кругу... ; светодиоды подключены к порту_А МК .MICRO ATmega16 ; симулируемый МК .TOOLCHAIN GENERIC .TARGET z1.hex ; что прошито в МК .COFF z1.cof .SOURCE z1__.c .POWER VDD=5 VSS=0 ; Питание +5 вольт ; VSS это GND МК — общий провод схемы ; Относительно него измеряются напряжения .CLOCK 4meg ; частота кварца 4 МГц ; Точнее, это частота тактирования МК ; Ввод схемы устройства по задаче 1 ; 8 светодиодов подключаются катодами через резисторы : номиналом 560 Ом к ножкам МК с 33 до 40 ; резистор R1 подключить к узлу D1_NODE и к выводу PA0 МК ; анод светодиода к цепи +5 В. Остальные 7 светодиодов ; подключаются аналогично D1 VDD D1_NODE R1 D1_NODE PA0 560 D2 VDD D2_NODE R2 D2_NODE PA1 560 D3 VDD D3_NODE R3 D3_NODE PA2 560 D4 VDD D4_NODE R4 D4_NODE PA3 560 D5 VDD D5_NODE R5 D5_NODE PA4 560 D6 VDD D6_NODE R6 D6_NODE PA5 560 D7 VDD D7_NODE R7 D7_NODE PA6 560 D8 VDD D8_NODE R8 D8_NODE PA7 560 ; Сигналы на ножках PA0 PA1 PA2 ; будем наблюдать в окне виртуального осциллографа — Scope .PLOT V(PA0) V(PA1) V(PA2) ; Рисовать графики напряжения в перечисленных узлах схемы В меню Project запустите Re-Build all ... Через меню View откройте два компонента: SCOPE — это виртуальный запоминающий осциллограф симулятора и Control Panel — это панель, на которой содержатся нужные нам светодиоды и многое другое, пока нам не нужное. Через меню Window откройте (обычно оно открывается сразу при открытии проекта) окно Code — в этом окне вы увидите текст симулируемой программы. Обратите внимание на окно Messages — в нем появляются служебные сообщения симулятора по ходу работы. В окне Messages должно появиться сообщение об успехе и что все готово к запуску (Success! All ready to run). Кроме того, на панели инструментов загорится зеленый светофор — это кнопка, которой можно запускать симуляцию. Нажатие зеленого светофора эквивалентно подаче 1 на вывод RESET МК при включенном питании, но еще не выполнявшем программу. В окне Scope появились три графика для сигналов, которые мы будем наблюдать. Установите масштаб по вертикали 2 вольта на деление, а по горизонтали 50 мс. В окне Сode появилось серое поле слева и зеленые квадратики напротив исполняемых строк кода программы на Си — кликнув по такому квадратику, мы можем поставить точку останова программы. Разместите три окна и Control Panel на экране компьютера так, чтобы видеть их все. Нажмите светофор для запуска симуляции программы. Программа запустится и остановится — в окне Messages появится сообщение. Опять нажимаем на светофор. Симулятор опять останавливается и сообщает, что произошел сброс от сторожевого таймера МК — мы не указали симулятору, что не используем его. Опять нажимаем на светофор — теперь программа будет работать непрерывно, пока мы ее не остановим. Пусть программа симулирует, а вы понаблюдайте за тем, что происходит в указанных выше окнах. Что отображается в окне Control Panel, кроме светодиодов? Понаблюдайте за окнами SCOPE и Code и за светодиодами. В окне Code при симуляции возникают и растут желтые полосы, подсвечивающие строки исполняемой программы. Длины этих подсветок пропорциональны времени, в течение которого программа выполняет код этих строк. Какой ток потребляется микроконтроллером от источника питания? Остановите симуляцию, нажав красный восьмиугольник Стоп и измерьте длительность периода импульсов на ножке РА2 МК. Насколько соответствует она расчетной величине? Для измерения временного промежутка в окне SCOPE симулятора VMLAB нужно установить вертикальные курсоры 1 и 2 на границах измеряемого интервала, и в поле Cursor delta time появится значение времени между двумя курсорами. При измерении коротких повторяющихся интервалов можно мерить время сразу нескольких, а результат поделить затем на число таких интервалов между измерительными курсорами. Перезапустите МК, кликнув по кнопке с круговой темно-синей стрелкой. Вы как бы отключаете и затем снова подаете питание на МК, но создаете 0 на ножке RESET МК — вследствие чего программа не стартует! Какую функцию выполняет команда PORTA=~(per++); ? Приведите в отчете схему подключения светодиодов к МК. 3. Модифицируйте программу. Переключите светодиоды к порту С. Время паузы между переключениями светодиодов уменьшить в 2 раза. Для изменения Си кода программы просто запустите компилятор CodeVisionAVR (VMLAB выключать не нужно!) и внесите нужные изменения, затем откомпилируйте проект. Далее перейдите в VMLAB, сделайте глубокий рестарт и затем Re-buid all. Все! Изменения внесены, и все опять готово к симуляции. Таким образом, компилятор и симулятор работают одновременно в одной папке проекта и не мешают, а помогают друг другу. В отчет включите файлы z1.c и z1_vm.prj модифицированного проекта. 4. В следующем проекте будем выводить данные на символьный LCD-дисплей (жидко-кристаллический индикатор). Схема его подключения к порту А микроконтроллера приведена на рис. 9.1 (там же указан источник информации, в котором вы можете более подробно ознакомиться с решаемой задачей). Запустите компилятор CodeVisionAVR, затем генератор начального кода CodeWizardAVR — кликнув серую шестеренку слева от красного жучка... Выберите ATmega16 и частоту кварца 4 МГц. Перейдите к закладке LCD и укажите PORTA и 16 символов. Выполнив Файл -> Generate, Save and Exit, создайте в директории C:\CVAVR папку z2 (задача 2) для файлов нового проекта. Сохраните, нажимая три раза z2, файлы z2.c, z2.prj и z2.cwp. Посмотрите сгенерированный мастером файл начального кода программы z2.c. Какими командами проводится инициализация LCD-дисплея? Можно ли удалить из программы команды, реализующие инициализацию периферийных устройств, не используемых в данной задаче? Рис. 9.1 — Типовая схема включения LCD-дисплея После команды lcd_init(16); // LCD 16 символов на строку добавьте две строчки: lcd_gotoxy(5,0); // вывод символов с 6-й позиции в первой строке lcd_putsf(Hello!); // счет строк и символов начинается с нуля! Сохраните (File -> Save All) и откомпилируйте программу. Не закрывая компилятор, откройте VMLAB. В окне Open Project File впишите имя файла z2_vm и откройте файл проекта для симулятора z2_vm.prj. Впишите в него приведенный ниже в рамке текст и запустите Re-build all ... Загоревшийся светофор говорит о том, что программа готова к симуляции. Откройте окно Control Panel и, трижды нажав светофор, добейтесь непрерывной симуляции. Долгожданная надпись на экране LCD появится не сразу (процесс инициализации LCD продолжается достаточно долго). Почему через некоторое время загорается светофор? ; файл z2_vm.prj .MICRO ATmega16 .TOOLCHAIN GENERIC .TARGET z2.hex .COFF z2.cof .CLOCK 4meg Xdisp LCD(16 2 250K) PA0 PA1 PA2 PA7 PA6 PA5 PA4 nc3 nc2 nc1 nc0 Не закрывая VMLAB, вернитесь в компилятор CVAVR. После команды #include #include После команды lcd_putsf(Hello!); добавьте команды: delay_ms(200); lcd_clear(); // очистка экрана LCD delay_ms(200); lcd_gotoxy(5,1); lcd_putsf(FINISH!); В последнем цикле программы перед комментарием // Place your code here добавьте команду #asm(wdr) и перекомпилируйте проект. Вернитесь в VMLAB. Сделайте глубокий рестарт и запустите Re-build all ... Как теперь выводится информация на табло дисплея? Почему не загорается светофор после запуска непрерывной симуляции? 5. Проведите исследование работы АЦП. В папке C:\CVAVR \z3 с помощью компилятора создайте файлы проекта задачи 3 на базе программы z3.c, текст которой приведен ниже в рамке (он подробно прокомментирован в разделе 7). // файл z3.c #include #include interrupt [ADC_INT] void adc_isr(void) { PORTB=(char)~(ADCW>>2); delay_ms(20); ADCSRA|=0x40; } void main(void) { PORTB=0xFF; DDRB=0xFF; ADCSRA=0x8E; asm(sei) ADMUX=0; ADCSRA|=0x40; while (1); } Затем с помощью симулятора запишите файл Z3_vm.prj. ; файл Z3_vm.prj .MICRO ATmega16 .TOOLCHAIN GENERIC .TARGET z3.hex ; эмулируемая прошивка МК .COFF z3.cof ; файл содержит привязку ; содержимого [.hex] к коду в [__.c] .SOURCE z3__.c ; исходник на Си, на который сориентирован файл [.cof]. ; это CodeVision добавляет __ при компиляции .TRACE ; выводить отладочную информацию в окне ; SCOPE — розовым (см. HELP эмулятора) .CLOCK 4meg ; частота используемого кварца ; Обозначения точек МК, к которым можно ; подключить эмулятор: RESET, AREF, PA0—PA7, PB0—PB7, PC0—PC7, PD0—PD7, ACO, TIM1OVF ; Для использования АЦП МК нужно подать опорное напряжение на вывод AREF — мы подадим 5 вольт питания МК. Но в VMLAB ; нельзя соединить два узла напрямую. Берем резистор на 1 Ом. R1 VDD AREF 1 ; резистор R1 подключен к ; узлам VDD и AREF через сопротивление 1 Ом ; опорное напряжение Vref у нас 5 вольт — ; значит, при подаче 5 вольт на вход АЦП ; мы получим результат: 1111111111 (АЦП 10-разрядный) ; Вход0 АЦП (это вывод PA0 МК) мы подключим к ; подвижному контакту переменного резистора ; (Slider 1 в окне Control Panel) — ; чтобы при эмуляции менять напряжение на входе АЦП. V1 PA0 VSS SLIDER_1(0 5) ; на концах переменного резистора 0 и 5 вольт ; Эмулятор имеет 8 светодиодов — ; подключаем их к выводам порта B D1 VDD PB0 D2 VDD PB1 D3 VDD PB2 D4 VDD PB3 D5 VDD PB4 D6 VDD PB5 D7 VDD PB6 D8 VDD PB7 ; Эмулятор допускает прямое подключение светодиодов к ; плюсу питания и выводам МК — в действительности необходим ; токоограничительный резистор 430—910 Ом ; последовательно с каждым светодиодом! .PLOT V(PA0) ; на экран осциллографа (окно SCOPE) ; выведем напряжение на движке потенциометра Запустив проект на симуляцию, понаблюдайте за светодиодами и осциллографом, изменяя положение движка потенциометра. Какое напряжение соответствует единице младшего разряда АЦП? Раскройте окно Peripherals и понаблюдайте за регистрами АЦП при изменении положения движка потенциометра S1. Сравните показания светодиодов и содержимое регистров ADCH и ADCL. Просмотрите содержимое памяти программ и текст программы на ассемблере. Сколько ячеек занимает программа? По какому адресу расположен вектор прерывания по завершению процесса аналого-цифрового преобразования? 6. Запустите на симуляцию проект, подготовленный в папке z4 (задача 4). Проект реализован на МК ATmega16. В окне SCOPE (это виртуальный осциллограф) можно увидеть изменения напряжений на ножках МК, указанных в файле проекта — vmlab.prj. Верхняя осциллограмма — это сигнал на ножке TXD (PD1) последовательного порта USART, по которой МК передает данные на COM-порт ПК через интерфейс RS232, что передает МК, мы видим в виртуальном терминале TTY панели Control Panel. Там выводится значение ШИМ (PWM)-сигнала, создаваемого на ножке PD5. Сам сигнал виден в окне SCOPE — посмотрите, как он меняется в соответствии с сообщаемыми числовыми значениями. На ножке PD4 формируются импульсы той же частоты с неизменной длительностью. В файле проекта vmlab.prj к ножке PD5 подключен простейший фильтр нижних частот (ФНЧ) из резистора и конденсатора — он преобразует ШИМ-сигнал в постоянное напряжение, которое можно увидеть в окне SCOPE (сигнал DAC). Формат передачи данных в примере — 8N1 (это формат по умолчанию для ПК). В таком формате передача байта начинается со старт-бита — это лог. 0 на ножке TXD для USART МК и +5...+15 В для COM-порта ПК. Затем на ножку TXD выводятся все 8 бит передаваемого байта, начиная с нулевого. За время передачи бита приемник должен определить и запомнить этот уровень. Далее идет стоп-бит — это лог. 1 на ножке TXD для USART МК и –5...–15 В для COM-порта ПК. Для согласования уровней между МК и ПК включают адаптер MAX232. 7. Протестируйте работу программы, текст которой приведен ниже. Разработайте программу, реализующую световой эффект бегущего огонька без использования ассемблерных вставок. #include #include void main(void){ DDRB=0xFF; #asm (ldi r20,1) while(1){ delay_ms(10); #asm (lsl r20) #asm (out 0x18,r20) if (PORTB==0){ PORTB++; #asm (ldi r20,1)}; };} Контрольные вопросы • Назовите нагрузочную способность линий портов AVR. • Какими ассемблерными вставками можно разрешать и запрещать глобально прерывания в программе для AVR на языке Си? • Запишите результат выполнения арифметических операций: 245/37 и 245%37. • Какими командами можно организовать задержку в одну секунду в программе для AVR на языке Си? • Дать комментарий к команде PORTA=~(per++); • Объявите переменную mnogo, если она может принимать значения от нуля до миллиона. • Прокомментировать результат выполнения команды ADCSRA|=0x40; ОСНОВНЫЕ ЭТАПЫ ВЫПОЛНЕНИЯ КУРСОВОГО ПРОЕКТА ПО ПРОЕКТИРОВАНИЮ МИКРОПРОЦЕССОРНЫХ СИСТЕМ 1. Конкретизация технического задания Задание на курсовой проект формулируется в очень краткой форме. Оно может содержать лишь название и область применения проектируемого устройства. Необходимо конкретизировать условия работы устройства и перечень выполняемых им функций, обосновать разрядность обрабатываемых данных. Определяющим должно быть удобство практической эксплуатации и новый набор качественных характеристик (более высокое быстродействие, точность, новые функциональные возможности) по сравнению с вариантом реализации подобного устройства без использования микропроцессора. Определяется диапазон рабочих температур, конструктивное исполнение (плата, блок или отдельное изделие). Во многих случаях проектируемое устройство наряду с цифровыми может содержать и аналоговые узлы (измерительные усилители, ЦАП, АЦП). И хотя детальной разработке подлежат чисто цифровые узлы, аналоговые блоки и выполняемые ими функции описываются при разработке функциональной схемы проектируемого устройства. 2. Разработка функциональной схемы устройства, распределение функций между аппаратными и программными средствами Электрическая функциональная схема (код схемы Э2) разъясняет процессы, происходящие в отдельных функциональных частях устройства и в устройстве в целом. Она строится для оптимального варианта проектируемого устройства, который необходимо выбрать из нескольких возможных. На этом этапе однозначно определяется алгоритм работы устройства, функции отдельных цифровых и аналоговых блоков. Выбирается тип микроконтроллера. Определяется набор функций, которые удобно реализовать программным путем, и набор функций, требующих для реализации дополнительных цифровых элементов (контроллера клавиатуры/дисплея, регистров, счетчиков, мультиплексоров, дешифраторов и т.п.). Степень детализации должна быть достаточной для того, чтобы на последующих стадиях можно было производить независимую разработку аппаратных и программных средств микропроцессорной системы. 3. Разработка схемы алгоритма прикладной программы Разработке исходного текста прикладной программы на языке ассемблера микроконтроллера предшествует разработка схемы алгоритма этой программы. Используется метод декомпо-зиции, при котором вся задача последовательно разделяется на меньшие функциональные модули (подпрограммы), каждый из которых можно разрабатывать отдельно от других. Разделение задачи на модули и операторы выполняется последовательно до такого уровня, когда просматривается возможность реализации модуля с помощью нескольких или даже одной команды микро-процессора. На этом этапе определяется формат внутреннего представления переменных и предварительно распределяются внутренние программно доступные ресурсы микроконтроллера для их реализации (регистры общего назначения, ячейки резидентной памяти данных, флаги пользователя и т.п.). 4. Разработка принципиальной электрической схемы устройства с перечнем элементов Электрическая принципиальная схема (код схемы Э3) определяет полный состав элементов (микросхем, резисторов, кон-денсаторов и т.д.) и связей между ними. Она служит исходным документом для разработки других конструкторских документов (чертежей печатных плат, сборочных чертежей). Проектируемое устройство, как правило, содержит печатную плату с микросхе-мами, источники вторичного электропитания и базовый блок, на лицевой панели которого располагаются кнопки, тумблеры, про-граммные переключатели, светодиоды, цифровые индикаторы. Принципиальная схема разрабатывается отдельно для каждого блока (кроме источников питания) и для всего устройства в целом (связи между разъемами). На принципиальных схемах цифровых интегральных микросхем обычно не изображаются выводы для подключения ис-точников питания. Эти соединения приводятся в текстовой или табличной информации. Условные графические обозначения и линии связей выполняют линиями одной и той же толщины. Утолщенные линии используются для обозначения линий груп-повой связи. Латинский алфавит определяет последовательность расположения обозначений в перечне элементов (его код — ПЭ3): конденсаторы (С1, С2, С3...С5), аналоговые микросхемы (DA1, DA2...DA8), цифровые микросхемы (DD1, DD2...DD6), резисторы (R1, R2...R5, R6), полупроводниковые приборы (VD1, VT1...VT3), разъем (XP1). 5. Разработка прикладной программы Микроконтроллер решает стоящие перед ним задачи управления объектами в реальном масштабе времени. С целью обеспечения максимального быстродействия прикладные программы разрабатываются на языке ассемблера. По сравнению с программами, подготовленными на алгоритмических языках высокого уровня, они после трансляции требуют также меньшего объема памяти программ. Наряду с командами используются директивы ассемблера: ORG, EQU, DB, END. Широко распространен модульный принцип построения прикладной программы. Такая программа содержит основной модуль и ряд подпрограмм, к которым он обращается по мере необходимости. Подпрограмма должна выполнять законченную процедуру обработки информации, иметь один вход и один выход. Любая подпрограмма допускает автономную отладку. Для трансляции исходных программ, предварительно записанных на диск ЭВМ с помощью любого текстового редактора, используют пакет программ (ассемблер). В процессе преобразования программы в объектную ассемблер может выявить синтаксические ошибки, связанные с несоблюдением правил записи команд. После исправления ошибок вызывают редактор связей (линковщик) для создания файла формата .hex фирмы Intel, который непосредственно используется программатором для записи программы в память программ или для отладки программы с помощью эмулятора. Отладка позволяет обнаружить смысловые ошибки, не позволяющие программе выполнить функции, заложенные разработчиком. Не всегда на эмуляторе можно проверить всю программу. В этом случае проверяются отдельные подпрограммы или фрагменты программы. Необходимо помнить, что скорость реализации команд на эмуляторе значительно меньше, чем в реальном масштабе времени (иногда в 1000 раз). Поэтому подпрограммы временной задержки нужно модифицировать или вообще исключить из программы, тестируемой с помощью эмулятора. 6. Оформление и защита проекта Выполненный курсовой проект оформляется в виде пояснительной записки объемом 15—20 страниц и принципиальных схем, которые при небольшом формате могут быть помещены в конце пояснительной записки. При оформлении необходимо соблюдать требования и правила, оговоренные в стандарте вуза по оформлению курсовых и дипломных проектов. Примеры оформления элементов пояснительной записки приведены в приложениях А...Г. Подчеркнем, что введение и заключение являются необходимыми разделами пояснительной записки. Электрическая принципиальная схема и перечень элементов к ней считаются отдельными документами, вшитыми в пояснительную записку. Шестизначный код классификационной характеристики разрабатываемого изделия определяется по классификатору ЕСКД (например, 448481) и в проекте может не приводиться. Три последние цифры обозначения (после точки) должны соответствовать номеру задания, например 008 для варианта 8. Примеры оформления принципиальной схемы и перечня элементов к ней приведены в приложениях Д, Ж. Конечным продуктом разработки прикладной программы является ее листинг (файл с расширением .lst), формируемый с помощью ассемблера. Отладка прикладной программы производится с помощью эмуляторов. 7. Варианты заданий на курсовое проектирование 1. Спроектировать многоканальную систему регулирования температуры в теплице. Включает восемь датчиков температуры и нагревателей. Значение стабилизируемой температуры задается в диапазоне от 10 до 40 С. Индикация выходных сигналов на включение нагревателей — с помощью линейки светодиодов. На цифровое табло вывести температуру объекта, номер которого набран на программном переключателе. 2. Спроектировать измеритель частоты сети с точностью до десятых долей герца при времени измерения не более одной се-кунды. Информация должна дублироваться на выносном табло, связь с которым осуществляется с помощью трехпроводной линии связи. 3. Разработать устройство охранной сигнализации. Число охраняемых объектов — до 64. Устройство должно сохранять свою работоспособность при выключении сети. При нажатии кнопки «Запрос» на цифровые индикаторы последовательно вы-водятся номера объектов, в которых возникал сигнал «Тревога». 4. Разработать электронный орган. Должен позволять вос-производить простейшие мелодии с помощью клавиатуры (две октавы). Режимы работы — игровой и демонстрационный. 5. Спроектировать устройство контроля интенсивности дви-жения через мост. По запросу внешнего устройства выводит на цифровые индикаторы час пик и количество автомобилей, про-шедших через мост в этот час. 6. Спроектировать устройство управления звонком на заня-тия. Должно реализовать реальную сетку расписания школьных звонков, индикацию текущего времени. 7. Спроектировать устройство для измерения потребляемой электроэнергии в любой сети постоянного тока (до 10 000 кВтч). 8. Разработать часы электронные со звуковым сигналом. 9. Разработать цифровой автомобильный спидометр (три де-сятичных разряда). 10. Частота импульсов на выходе генератора в герцах от 1 до 99 должна быть равна числу на программном переключателе и отображаться на цифровых индикаторах. Длительность импульсов — 100 мкс. 11. Спроектировать генератор пачек импульсов, следующих с частотой 1 Гц. Частота импульсов в пачке 1 кГц, число импульсов в пачке (от 1 до 100) набирается на лимбах программного пе-реключателя и отображается на цифровых индикаторах. Дли-тельность импульса — 100 мкс. 12. Спроектировать измеритель частоты вращения ротора двигателя. Диапазон измерения (100—10000 об/мин). Импульсный датчик вырабатывает 96 импульсов за каждый оборот. Время из-мерения — не более трех оборотов ротора. 13. Разработать электронное устройство управления инкуба-тором. Точность задания и стабилизации температуры — 0,1 С. Через каждый час обеспечить изменение положения яиц путем поворота на 45. Предусмотреть цифровую индикацию темпера-туры. Для аналого-цифрового преобразования сигнала использо-вать метод двухтактного интегрирования. 14. Спроектировать цифровой спидометр для ГАИ. Контро-лируемая скорость автомобиля — до 200 км/ч. 15. Спроектировать устройство цифровой индикации числа оборотов двигателя автомобиля «Москвич» (шкала до 3000 об/мин) и угла замкнутого состояния контактов прерывателя-распреде-лителя. 16. Спроектировать многоканальную систему регулирования температуры в теплице. Включает четыре датчика температуры и нагревателя. Значение стабилизируемой температуры задается в диапазоне от 10 до 40 С. Индикация выходных сигналов на включение нагревателей с помощью линейки светодиодов. Для аналого-цифрового преобразования использовать метод двухтактного интегрирования. 17. Разработать электронный таймер с индикацией в режиме обратного счета установленного времени в часах и минутах. В течение заданного временного отрезка должен быть включен исполнительный элемент (зарядное устройство). 18. Спроектировать устройство контроля интенсивности движения автомобилей по автомагистрали. На цифровые индика-торы выводится текущее время и количество автомобилей, про-шедших через магистраль с начала суток. 19. Разработать устройство охранной сигнализации квартир одного подъезда многоэтажного дома. Число охраняемых объек-тов — до 16. 20. Разработать электронный экзаменатор. Должен фиксиро-вать оценку после ответа на 10 вопросов билета. Число билетов — 100. 21. Спроектировать шахматные электронные часы для блиц-турнира. 22. Спроектировать устройство управления гудком на заводе. Должно реализовать реальную сетку расписания смен, обеденных перерывов, индикацию текущего времени. 23. Спроектировать электронные весы. Фиксируют вес и стоимость расфасованной порции продукта. 24. Разработать цифровой автомобильный измеритель угла замкнутого состояния контактов прерывателя и угла опережения зажигания. 25. Спроектировать измеритель частоты пульса человека. Время измерения — не более 3 секунд. 26. Спроектировать генератор пачек импульсов, следующих с частотой 10 Гц. Частота импульсов в пачке 10 кГц, число им-пульсов в пачке (от 1 до 100) набирается на лимбах программного переключателя и отображается на цифровых индикаторах. Длительность импульса — 10 мкс. 27. Спроектировать счетчик потребляемой тепловой энергии. 28. Спроектировать электронные весы. Фиксируют сначала вес тары (банки под сметану или растительное масло), а затем чистый вес продукта и его стоимость. 29. Разработать устройство управления СВЧ-печью (часы с таймерами). 30. Разработать светофор со временем зеленого света, про-порциональным интенсивности движения автомобилей через ма-гистраль.
ОТПРАВИТЬ ЗАЯВКУ |
---|