Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЦМПУ / Новая папка / Лаб10ЦМПУ

.docx
Скачиваний:
16
Добавлен:
16.04.2015
Размер:
112.6 Кб
Скачать

Лабораторная работа №10 «Обработка аналоговых сигналов»

Цель работы: Ознакомиться с принципом работы аналого-цифрового преобразователя микроконтроллера ATmega128 и методом его программирования.

Порядок выполнения работы

на симуляторе

  1. Запустить симулятор VMLAB 3.12.

  2. Создать новый проект с именем “Project10.prj”.

  3. В окно кодов ввести листинг программы №10.

  4. В окно файла проекта ввести листинг проектного файла №10.

  5. Отладить программу командой Project/Build (F9).

  6. Перейти в окно памяти программ через меню View/Program Memory (Alt+Shift+G).

  7. Выполнять программу в пошаговом режиме командой Run/Step into (F7). После выполнения двух команд на панели управления нажать кнопку «0» и продолжать выполнение в пошаговом режиме или в автоматическом пошаговом режиме (Animate code).

  8. В окне осциллографа View/Scope (Alt+Shift+S) пронаблюдать изменение сигнала на выводе PF1.

  9. Просмотреть изменение состояния регистров (Alt+Shift+R), портов ввода-вывода, регистров АЦП, указателя стека SPL и указателя адреса PC (Alt+Shift+I).

  10. Пронаблюдать значение на экране ЖКИ. Самостоятельно выполнить преобразование аналогового значения в двоично-десятичный код и проверить с результатом на экране ЖКИ.

  11. В соответствии с предложенными вариантами выполнить задание (см. таблицу 10.26). Повторить п.п. 2 – 11.

  12. Для сохранения проекта выполнить команду File/Save all.

  13. Для выхода из среды разработки VMLAB 3.12 выполнить команды File/Exit (Alt+F4).

на эмуляторе

  1. Отладить предложенную программу (см. Приложение 3). Получить машинный код программы в файле Project10.hex.

  2. Кабелем подключения соединить эмулятор с разъемом LPT компьютера.

  3. Включить сетевой тумблер на эмуляторе.

  4. Запустить программатор Pony Prog.

  5. Произвести калибровку устройства через меню Установки/Калибровка.

  6. Настроить интерфейс в меню Установки/Настройки.

  7. Выбрать тип МК ATmega128 через Устройство/AVRmicro/ ATmega128.

  8. Стереть содержимое МК через меню Команды/Стереть.

  9. Выбрать через меню Файл/Открыть файл программы (FLASH) оттранслированную программу Project10.hex.

  10. Записать программу через меню Команды/Записать программу (FLASH).

  11. Выйти из Pony Prog (Файл/Выход).

  12. Установить переключатель на измеряемое значение напряжения.

  13. Сбросить МК в начальное состояния клавишей “Сброс”.

  14. Пронаблюдать изменение на экране ЖКИ-модуля.

  15. Повторить пункты 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 Алгоритм подпрограммы выдачи данных

Соседние файлы в папке Новая папка