Аналого-цифровой преобразователь

В процессе работы АЦП может функционировать в двух режимах:

· режим одиночного преобразования – запуск каждого преобразования инициируется пользователем;

· режим непрерывного преобразования – запуск преобразований выполняется непрерывно через определенные интервалы времени.

Управление модулем АЦП и контроль его состояния осуществляется с помощью регистра ADCSR (табл. 4.19).

 

 

Таблица 4.19 – Разряды регистра ADCSR

Разряд Название Описание
ADEN Разрешение АЦП (1 – включен)
ADSC Запуск преобразования (1 – начать преобразование)
ADFR Выбор режима работы АЦП (0 – одиночное преобразование)
ADIF Флаг прерывания от АЦП
ADIE Разрешение прерывания от АЦП
2…0 ADPS2:ADPS0 Выбор частоты преобразования

Таблица 4.20 – Задание коэффициента деления предделителя АЦП

ADRS2 ADRS1 ADRS0 Коэффициент деления

 

Наибольшая точность преобразования достигается при тактовой частоте модуля АЦП в диапазоне 50…200 кГц. Для этого тактовая частота микроконтроллера поступает на АЦП через предделитель с программируемым коэффициентом деления. Для повышения точности преобразования (чтобы свести к минимуму помехи, наводимые ядром процессора) в микроконтроллере предусмотрен специальный спящий режим – ADC Noise Reduction. В этом режиме из всех периферийных устройств функционируют только АЦП и сторожевой таймер. Сразу же после остановки процессора начнется цикл преобразования. По завершении преобразования будет сгенерировано прерывание от АЦП, которое переведет микроконтроллер в рабочий режим и начнется выполнение подпрограммы обработки этого прерывания.

Поскольку АЦП 10-разрядный, результат преобразования размещен в двух регистрах, доступных только для чтения: ADCH и ADCL. Сначала необходимо прочитать ADCL, а затем ADCH. Если достаточно точности восьми разрядов, для получения результата достаточно прочитать содержимое регистра ADCH.

Номер активного канала (аналоговый вход, подключаемый ко входу АЦП) и источника опорного напряжения задается регистром ADMUX (табл. 4.21–4.23). Разряд ADLAR служит для управления выравниванием результата преобразования. Если этот разряд установлен в 1, результат преобразования выравнивается по левой границе 16-разрядного слова, если сброшен в 0 – по правой границе.

Таблица 4.21 – Разряды регистра ADMUX

Разряд Название Описание
7,6 REFS1:REFS0 Выбор источника опорного напряжения
ADLAR Выравнивание результата преобразования
4,3 Зарезервировано
2…0 MUX2:MUX0 Выбор входного канала

Таблица 4.22 – Выбор источника опорного напряжения

REFS1 REFS0 Источник опорного напряжения
Напряжение питания микроконтролера
Внешний ИОН, подключенный к выводу РВ0, внутренний ИОН отключен
Внутренний ИОН напряжением 2,56 В, отключенный от вывода РВ0 (AREF)
Внутренний ИОН напряжением 2,56 В, подключенный к выводу РВ0 (AREF)

Таблица 4.23 – Номер активного канала

MUX2 MUX 1 MUX 0 Вход
ADC0 (PB5)
ADC1 (PB2)
ADC2 (PB3)
ADC3 (PB4)

 

Программа работы

1. Загрузить для отладки в AVR Studio программу преобразования целых 16-битных чисел в двоично-десятичные числа. Алгоритм программы «bin16BCD5» заключается в следующем. Предположим, что имеется целое беззнаковое 16-битное число (диапазон от 0 до 65535). Очевидно, что необходимо найти 5 десятичных цифр. Способ преобразования заключается в том, чтобы, вычитая из исходного числа число 10000, сначала определить десятичную цифру десятков тысяч. Затем находится цифра тысяч последовательным вычитанием числа 1000 и т.д. Вычитание каждый раз производится до получения отрицательной разности с подсчетом числа вычитаний. При переходе к определению каждого следующего десятичного разряда в регистрах исходного числа восстанавливается последняя положительная разность. После того, как будет найдена десятичная цифра десятков, в регистрах исходного числа останется десятичная цифра единиц.

Проследить выполнение программы в пошаговом и автоматическом режиме, записав предварительно в регистры r16 и r17 шестнадцатеричное число $NNNN, где 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\tn15def.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, -0x11m2: 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, -0x10m4: 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\tn15def.inc"

 

rjmp RESET

.org $005 ; Вектор прерывания по переполнению T0

inc r16 ; Инкремент единиц

cpi r16,$0A

breq m1

rjmp m3

m1: clr r16

subi r17,-$10 ; Инкремент десятков

cpi r17,$A0

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\tn15def.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\tn15def.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,$DD

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. Биты каких регистров можно устанавливать и сбрасывать командами sbi и cbi?

Содержание отчета

Отчет в формате WORD должен содержать тексты измененных (в соответствии с вариантом задания) программ с комментариями, ответы на вопросы по пунктам работы, рисунки, отображающие окна регистров и памяти, ответы на контрольные вопросы.

 








Дата добавления: 2016-01-09; просмотров: 1749;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.049 сек.