![](/user_photo/2706_HbeT2.jpg)
ЦМПУ / Новая папка / Лаб10ЦМПУ
.docxЛабораторная работа №10 «Обработка аналоговых сигналов»
Цель работы: Ознакомиться с принципом работы аналого-цифрового преобразователя микроконтроллера ATmega128 и методом его программирования.
Порядок выполнения работы
на симуляторе
-
Запустить симулятор VMLAB 3.12.
-
Создать новый проект с именем “Project10.prj”.
-
В окно кодов ввести листинг программы №10.
-
В окно файла проекта ввести листинг проектного файла №10.
-
Отладить программу командой Project/Build (F9).
-
Перейти в окно памяти программ через меню View/Program Memory (Alt+Shift+G).
-
Выполнять программу в пошаговом режиме командой Run/Step into (F7). После выполнения двух команд на панели управления нажать кнопку «0» и продолжать выполнение в пошаговом режиме или в автоматическом пошаговом режиме (Animate code).
-
В окне осциллографа View/Scope (Alt+Shift+S) пронаблюдать изменение сигнала на выводе PF1.
-
Просмотреть изменение состояния регистров (Alt+Shift+R), портов ввода-вывода, регистров АЦП, указателя стека SPL и указателя адреса PC (Alt+Shift+I).
-
Пронаблюдать значение на экране ЖКИ. Самостоятельно выполнить преобразование аналогового значения в двоично-десятичный код и проверить с результатом на экране ЖКИ.
-
В соответствии с предложенными вариантами выполнить задание (см. таблицу 10.26). Повторить п.п. 2 – 11.
-
Для сохранения проекта выполнить команду File/Save all.
-
Для выхода из среды разработки VMLAB 3.12 выполнить команды File/Exit (Alt+F4).
на эмуляторе
-
Отладить предложенную программу (см. Приложение 3). Получить машинный код программы в файле Project10.hex.
-
Кабелем подключения соединить эмулятор с разъемом LPT компьютера.
-
Включить сетевой тумблер на эмуляторе.
-
Запустить программатор Pony Prog.
-
Произвести калибровку устройства через меню Установки/Калибровка.
-
Настроить интерфейс в меню Установки/Настройки.
-
Выбрать тип МК ATmega128 через Устройство/AVRmicro/ ATmega128.
-
Стереть содержимое МК через меню Команды/Стереть.
-
Выбрать через меню Файл/Открыть файл программы (FLASH) оттранслированную программу Project10.hex.
-
Записать программу через меню Команды/Записать программу (FLASH).
-
Выйти из Pony Prog (Файл/Выход).
-
Установить переключатель на измеряемое значение напряжения.
-
Сбросить МК в начальное состояния клавишей “Сброс”.
-
Пронаблюдать изменение на экране ЖКИ-модуля.
-
Повторить пункты 12−14 при другом значении напряжения.
В соответствии с вариантом выполнить самостоятельное задание
Листинг программы №10 (инициализации АЦП и вывод результата на ЖКИ)
; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************
.include "C:\VMLAB\include\m128def.inc"
; Define here the variables
;Описание переменных
.def edin =r3 ; количество единиц
.def des =r4 ; количество десятков
.def sot =r5 ; количество сотен
.def tsch =r6 ; количество тысяч
.def temp =r16
.def temp1 =r17
.def temp2 =r18
.def per =r17
.def per1 =r18
.def dcnt =r19 ; счетчик
.def ostat =r20 ; остаток
.def delit =r21 ; делитель
;Основная программа
;Определение таблицы переходов
.ORG $0 ;Начало таблицы переходов
reset:
rjmp Start ;Переход на метку Start основной программы
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03 Вектора прерываний МК ATmega128.
reti ; Addr $04 Приведены вектора с адреса $01 по адрес $10.
reti ; Addr $05 Полностью вектора прерываний представлены
reti ; Addr $06 в приложении с назначением прерываний
reti ; Addr $07 (внешних и внутренних).
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
.ORG $02a ;вектор завершения преобразования АЦП
rjmp Peres
.ORG $02d ;Начальный адрес основной пpогpаммы
Start: clr tеmp ;очистка регистра
clr per ;очистка регистра
clr per1 ;очистка регистра
ldi r16,High(RAMEND)
out SPH,r16
ldi r16, low(RAMEND)
out SPL,r16
ldi temp,$8D ; включение АЦП ADEN = 1, разрешение
out ADCSR, temp ; прерывания ADIE = 1, задание коэффициента
; деления предделителя АЦП = fck/32
sei ;Разрешить все пpеpывания
ldi temp,$01 ; загрузка регистра
out ADMUX, temp ; Выбираем вход АЦП, напряжение
;на котором будет
;оцифровываться: канал PC1
sbi ADCSR,6 ; Запустили преобразование
; записав '1' в бит_6 в регистре ADCSR
m1: tst per ; проверка per на нулевое значение
brne Dalee ; переход, если не нуль
rjmp m1: ; возврат на метку m1
Dalee:
swap per1 ; обмен тетрад
lsl per1 ; логический сдвиг влево через перенос
lsl per1 ; логический сдвиг влево через перенос
rcall DIV10T ; вызов процедуры DIV10T
mov edin,ostat ; сохранение количества единиц в edin
rcall DIV10 ; вызов процедуры DIV10
mov des,ostat ; сохранение количества десятков в des
rcall DIV10 ; вызов процедуры DIV10
mov sot,ostat ; сохранение количества сотен в sot
mov tsch,per1 ; сохранение количества тысяч в tsch
ldi temp,$07 ;настройка каналов PB0,PB1,PB2 на выход
out DDRB,temp
ldi temp,$FF ;настройка порта D на выход
out DDRD,temp
rcall SetupLCD ;вызов подпрограммы конфигурирования ЖКИ
rcall Output ;вызов подпрограммы вывода данных
s1: rjmp s1 ; конец программы (пустой цикл)
; ** Процедура прерывания по завершению преобразования АЦП *****
Peres:
in per,ADCL ; пересылка оцифрованного значения
in per1,ADCH ; напряжения в переменные per и per1
ret ; возврат из процедуры
; ** Подпрограмма определения количества единиц *****
DIV10T:
ldi delit,$A ; загрузка числа 10
ldi dcnt,$9 ; загрузка счетчика циклов
sub ostat,ostat ; обнуление остатка и переноса
rol per1 ; сдвиг влево делителя/результата
rol ostat ; сдвиг влево остатка
rol per1 ; сдвиг влево делителя/результата
rol ostat ; сдвиг влево остатка
mov per1,per ; пересылка значения per в per1
d8u_1: rol per1 ; сдвиг влево делителя/результата
dec dcnt ; декремент счетчика
brne d8u_2 ; переход, если не ноль
rjmp m3 ;переход на метку m3
d8u_2: rol ostat ; остаток сдвинуть влево
sub ostat,delit ; остаток = остаток - делитель
brcc d8u_3 ; если результат < 0
add ostat,delit ; восстановить остаток
clc ; сбросить перенос для формирования результата
rjmp d8u_1 ;иначе
d8u_3: sec ;установить перенос для формирования результата
rjmp d8u_1 ; переход назад
m3: ret ; выход из подпрограммы
; ** Подпрограмма деления на десять *****
DIV10:
ldi delit,$A ; загрузка числа 10
ldi dcnt,$9 ; загрузка счетчика циклов
sub ostat,ostat ; обнуление остатка и переноса
d8u1: rol per1 ; сдвиг влево делителя/результата
dec dcnt ; декремент счетчика
brne d8u2 ; переход, если не ноль
rjmp m4 ;переход на метку m4
d8u2: rol ostat ; остаток сдвинуть влево
sub ostat,delit ; остаток = остаток - делитель
brcc d8u3 ; если результат < 0
add ostat,delit ; восстановить остаток
clc ; сбросить перенос для формирования результата
rjmp d8u1 ;иначе
d8u3: sec ;установить перенос для формирования результата
rjmp d8u1 ;переход назад
m4: ret ; выход из подпрограммы
; ** Подпрограмма конфигурирования ЖКИ *****
SetupLCD:
;Команда установки функций с DL=1,N=0,F=0
rcall Del16mc ; вызов подпрограммы задержки 16 мс
ldi temp,0b000 ; выставление управляющих сигналов ldi temp,0b00110000 ; команда: 8-разрядная шина данных, одна ;строка,
out PORTD,temp ; символы с матрицей 5х7 точек
rcall Impuls ;вызов подпрограммы выдачи строба с задержкой
;Команда управления включением дисплея с D=1,C=0,B=0
ldi temp,0b000 ; выставление управляющих сигналов ldi temp,0b00001100 ;команда: отображение включено, курсор – ;выкл.,
out PORTD,temp ; мерцание знакоместа выключено
rcall Impuls ;вызов подпрограммы выдачи строба с задержкой
;Команда автоинкремента с I/D=1,S=0
ldi temp,0b000 ; выставление управляющих сигналов
out PORTB,temp ; на запись команды
ldi temp,0b00000110 ;команда: режим увеличения счетчика на 1,
out PORTD,temp ; без сдвига изображения
rcall Impuls ;вызов подпрограммы выдачи строба с
;задержкой
ret ; выход из подпрограммы
; **Подпрограмма выдачи строб-сигнала с последующей задержкой**
Impuls: rcall ImpulsE ;вызов подпрограммы выдачи строба Е
rcall Del1mc ;вызов подпрограммы задержки в 1мс
ret ; выход из подпрограммы
; **Подпрограмма выдачи строб-сигнала**
ImpulsE: sbi PORTB,PB2 ; выдача “1” в канал порта В РВ2
nop ; пустая операция
nop ; пустая операция
nop ; пустая операция
nop ; пустая операция
cbi PORTB,PB2 ; выдача “0” в канал порта В РВ2
ret ; выход из подпрограммы
; **Подпрограмма задержки 16мс**
Del16mc:
rcall Del4mc ; вызов подпрограммы задержки 4мс
rcall Del4mc ; вызов подпрограммы задержки 4мс
rcall Del4mc ; вызов подпрограммы задержки 4мс
rcall Del4mc ; вызов подпрограммы задержки 4мс
ret ; выход из подпрограммы
; **Подпрограмма задержки 4мс**
Del4mc:
rcall Del1mc ; вызов подпрограммы задержки 1мс
rcall Del1mc ; вызов подпрограммы задержки 1мс
rcall Del1mc ; вызов подпрограммы задержки 1мс
rcall Del1mc ; вызов подпрограммы задержки 1мс
ret ; выход из подпрограммы
; **Подпрограмма задержки 1мс**
Del1mc:
clr temp ; очистка регистра
ldi temp1,$5 ; загрузка в регистр значения 5
m5: dec temp ; декремент регистра
brne m5 ; переход если не нуль
dec temp1 ; декремент регистра
brne m5 ; переход если не нуль
ret ; выход из подпрограммы
; **Подпрограмма выдачи данных**
Output: ldi temp,0b000 ; выставление управляющих сигналов out PORTB,temp ; на запись команды
ldi temp,0b00000001 ; команда: сбросить дисплей
out PORTD,temp
rcall Impuls ;вызов подпрограммы выдачи строба с задержкой
rcall Del1mc ; вызов подпрограммы задержки на 1 мс
ldi temp,0b010 ; выставление управляющих сигналов
out PORTB,temp ; на запись данных
sez ;установка флага Z=1, выдача цифры тысяч на ЖКИ
tst tsch ; проверка на нулевое значение
breq a1 ; переход, если нуль
mov temp,tsch ; пересылка данных из tsch в temp
ori temp,$30 ; перевод в код пересылки на ЖКИ
out PORTD,temp ; выдача данных в порт D
rcall Impuls ; подача стробирующего сигнала
a1: mov temp,sot ; выдача цифры сотен на ЖКИ
ori temp,$30
out PORTD,temp
rcall Impuls
mov temp,des ; выдача цифры десятков на ЖКИ
ori temp,$30
out PORTD,temp
rcall Impuls
mov temp,edin ; выдача цифры единиц на ЖКИ
ori temp,$30
out PORTD,temp
rcall Impuls
ret ; выход из подпрограммы
Рис. 10.16 Визуальная модель проектного файла
Листинг проектного файла №10
; ************************************************************
; PROJECT:
; AUTHOR:
; ************************************************************
; Micro + software running
; ------------------------------------------------------------
.MICRO "ATmega128_64K"
.PROGRAM "10.asm"
.TARGET "10.hex"
.TRACE ; Activate micro trace
; Following lines are optional; if not included
; exactly these values are taken by default
; ------------------------------------------------------------
.POWER VDD=5 VSS=0 ; Power nodes
.CLOCK 4meg ; Micro clock
.STORE 250m ; Trace (micro+signals) storage time
R3 VDD AREF 1 ; подключение резистора 1 Ом между VDD и AREF
Vsin PF1 VSS sin(2.5 2.5 10K);Подача синусоидального сигнала с частотой 10к Гц
; Выводы ЖКИ RS R/W E DB7 DB6 DB5 DB4DB3DB2 DB1 DB0
Xdisp LCD(16 1 250K) PB1 PB0 PB2 PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
Рис. 10.15 Алгоритм подпрограммы выдачи данных