- •Кузнецов в.Н., Лисютченков с.Н. Цифровые и микропроцессорные устройства
- •Часть 3
- •220301– Автоматизация технологических процессов и производств
- •Содержание
- •Предисловие
- •Лабораторная работа №1 «Освоение среды разработки vmlab 3.12»
- •1.2 Теоретическое введение
- •1.2.1 Общие сведения
- •1.2.2 Среда разработки vmlab
- •1.2.3 Описание пользовательского интерфейса
- •1.2.4 Команды меню
- •Save All − сохранить все файлы Save As − сохранить файл текущего окна под новым именем
- •1.2.5 Доступные окна
- •1.2.6 Аппаратные компоненты
- •1.2.7 Формат программы на ассемблере
- •1.3 Порядок выполнения лабораторной работы
- •1.3.1 Создание нового проекта
- •1.3.2 Редактирование файла ассемблера
- •1.3.3 Ассемблирование и выполнение программы
- •1.4 Задание на лабораторную работу
- •1.5 Контрольные вопросы
- •1.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №2 «Изучение микроконтроллера aTmega128 и основы программирования»
- •2.2.1 Общие сведения о микроконтроллере aTmega128
- •Регистры ввода/вывода (рвв)
- •Организация памяти
- •Внешние прерывания
- •2.2.9 Директивы транслятора ассемблера
- •2.2.10 Выражения
- •2.2.11 Операнды
- •2.2.12 Функции
- •2.2.13 Операции
- •2.3 Порядок выполнения лабораторной работы
- •2.4 Задание на лабораторную работу
- •Задание для индивидуальной работы
- •2.5 Контрольные вопросы
- •2.6 Содержание отчета по лабораторной работе
- •3.2.2 Адресация в микроконтроллере
- •3.2.3 Команды пересылки данных
- •Mov Rd,Rr(пересылка между рон) – копирует содержимое регистра Rrв регистр Rd. Регистр-источник Rrне изменяется.
- •3.2.4 Команды передачи управления
- •3.3 Порядок выполнения лабораторной работы
- •3.4 Задание на лабораторную работу
- •3.5 Контрольные вопросы
- •3.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №4 «Выполнение арифметических операций»
- •4.2 Теоретическое введение
- •4.3 Порядок выполнения лабораторной работы
- •4.4 Задание на лабораторную работу
- •4.5 Контрольные вопросы
- •4.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №5 «Изучение логических операций»
- •5.2 Теоретическое введение
- •Управление энергопотреблением и режимы сна.
- •5.3 Порядок выполнения лабораторной работы
- •5.4 Задания на лабораторную работу
- •5.5 Контрольные вопросы
- •5.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №6 «Изучение портов ввода/вывода и их программирование»
- •6.2 Теоретическое введение
- •6.2.1 Общие сведения
- •6.2.2 Порты в качестве универсального цифрового ввода-вывода
- •6.2.3 Настройка выводов
- •6.2.4 Неподключенные выводы
- •6.2.5 Альтернативные функции порта
- •6.2.5.1 Альтернативные функции порта a
- •6.2.5.2 Альтернативные функции порта в
- •6.2.5.3 Альтернативные функции порта c
- •6.2.5.4 Альтернативные функции порта d.
- •6.2.5.5 Альтернативные функции порта e
- •6.2.5.6 Альтернативные функции порта f
- •6.2.5.1 Альтернативные функции порта g
- •6.2.6 Описание регистров портов ввода-вывода
- •6.2.7 Обращение к портам ввода/вывода
- •6.3 Порядок выполнения лабораторной работы на симуляторе
- •6.4 Задание на лабораторную работу
- •Задания для индивидуальной работы
- •Контрольные вопросы
- •6.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №7.
- •7.2.1 Общие сведения о Память
- •7.2.2 Статическое озу памяти данных
- •7.2.3 Организация памяти
- •7.2.4 Запоминающее устройство sram
- •7.2.5 Временная диаграмма доступа к памяти
- •7.3 Память данных на эсппзу
- •7.3.1 Чтение и запись эсппзу
- •7.3.2 Адресные регистры эсппзу
- •Порядок выполнения
- •7.4 Память ввода-вывода
- •Порядок выполнения
- •Порядок выполнения
- •7.5 Задание на лабораторную работу
- •Задание для индивидуальной работы
- •7.6 Контрольные вопросы
- •7.7 Содержание отчета по лабораторной работе
- •Генерация тактовых импульсов
- •Инициализация усапп
- •8.2.2 Передача данных - Передатчик усапп
- •8.2.3 Прием данных - Приемник усапп
- •Асинхронный прием данных
- •8.2.4 Многопроцессорный режим связи
- •8.2.5 Описание регистров усапп
- •8.2.6 Последовательный периферийный интерфейс - spi
- •8.2.7 Функционирование вывода ss
- •8.2.8 Связь двух мк
- •8.3 Задание на лабораторную работу
- •Задание для индивидуальной работы
- •8.6 Контрольные вопросы
- •Лабораторная работа №9 «Изучение принципа работы таймеров/счетчиков микроконтроллера»
- •9.2 Теоретическое введение
- •9.2.1 Общие сведения о таймерах/счетчиках
- •9.2.2 Назначение выводов таймеров/счетчиков
- •9.2.5 Выбор источника тактового сигнала
- •9.2.6 Режим таймера
- •9.2.7 Функция захвата (Capture)
- •9.2.8 Функция сравнения (Compare)
- •9.2.9 Режим шим
- •9.2.10 Сторожевой таймер
- •9.2.11 Общие сведения о работе клавиатуры
- •9.2.12 Ввод кода нажатой клавиши
- •9.2.13 Сканирование и идентификация
- •Листинг проектного файла №9
- •На эмуляторе
- •9.4 Задание на лабораторную работу
- •Задания для индивидуальной работы
- •9.5 Контрольные вопросы
- •10.2.2 Функционирование модуля ацп
- •10.2.3 Принцип действия
- •10.2.4 Каналы дифференциального усиления
- •10.2.5 Изменение канала или выбор опорного источника
- •10.2.6 Входные каналы ацп
- •10.2.7 Источник опорного напряжения ацп
- •10.2.8 Повышение точности преобразования
- •10.2.9 Методы компенсации смещения
- •10.2.10 Описание получения результата преобразования
- •10.2.5 Параметры ацп
- •10.2 Порядок выполнения работы на симуляторе
- •На эмуляторе
- •10.3 Задание на лабораторную работу
- •Задания для индивидуальной работы
- •10.4 Контрольные вопросы
- •Приложение
- •Список литературы
10.2.9 Методы компенсации смещения
Усилительный каскад имеет встроенную схему компенсации смещения, которая стремится максимально приблизить к нулю смещение дифференциального измерения. Оставшееся смещение можно измерить, если в качестве дифференциальных входов АЦП выбрать один и тот же вывод микроконтроллера. Измеренное таким образом остаточное смещение можно программно вычесть из результата преобразования. Использование программного алгоритма коррекции смещения позволяет уменьшить смещение ниже одного мл. разр.
10.2.10 Описание получения результата преобразования
Как уже было сказано, AREF - на этот вывод, на который мы должны подать напряжение, соответствующее максимуму требуемого диапазон измеряемого напряжения. Бинарный код такого или большего напряжения будет равен 1023 или 1111111111. Это напряжение может находиться в диапазоне от AGND до AVCC.
Примечание: НО! Использовать AREF менее двух вольт не рекомендуется!
Итак, если мы подадим на вывод AREF X В - то можем измерять напряжения от 0 до 5 В с шагом преобразования m:
m = X /1024 В, (1)
с точностью: ±(X * 2 / 1024)
НО! Напряжения Х В и выше будут преобразовываться в код 1023.
Приведем примеры:
Мы подали на вход АЦП напряжение 2,832 В - какой результат мы получим, если на выводе AREF у нас 4 В? (питание микроконтроллера - 5 В).
Вначале определим шаг преобразования по формуле (1):
m = 4/1024=3,90625 мВ
Теперь можно определить какой двоичный код мы получим:
2,832/3,90625 · 10-3 = 725
Учтем точность АЦП в ±2 десятичных единицы: Итак, в результате АЦ преобразования мы получим число от 723 до 727.
А если подать 4.23 В или 4.47 В или 4.876 В или 5 В? Результат будет одинаков: 1023.
А если подать 4 В ровно? т.е. соединить вход АЦП с AREF ? Результат, с учетом ошибки будет: 1021, 1022 или 1023.
Теперь мы знаем, что должно получить в результате АЦ преобразования в двух регистрах ввода/вывода ADCH:ADCL. Регистр ADCL хранит младший байт результата, а девятый и десятый биты результата становятся, соответственно нулевым и первым битами регистра ADCH.
Запишем варианты содержимого этих регистров для приведенного выше примера расчетов результата преобразования с учетом точности АЦП в таблицу 10.7
Таблица 10.7 Варианты преобразования поданного значения напряжения
Результат |
ADCH |
ADCL |
723 |
---- --10 |
1101 0011 |
724 |
---- --10 |
1101 0100 |
725 |
---- --10 |
1101 0101 |
726 |
---- --10 |
1101 0110 |
727 |
---- --10 |
1101 0111 |
На самом деле АЦП вполне нормальный и если проводить серию измерений одного и того же напряжения, в одних и тех же условиях, мы будем получать один и тот же результат.
10.2.5 Параметры ацп
Основные параметры АЦП приведены в таблице 10.8 Все значения указаны для диапазона температур окружающей среды -40...+80°С.
Таблица 10.8 Параметры АЦП
Обозначение |
Параметр |
Условия |
min |
typ |
max |
Ед. изм. |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
Разрешение |
|
|
10 |
|
бит |
|
|
VREF = 4B fADC = 200 кГц |
|
1 |
2 |
M3P |
|
Абсолютная |
VREF = 4B fADC = 1 МГЦ |
|
4 |
|
M3P |
|
|
VREF = 4B fADC = 2 МГЦ |
|
16 |
|
M3P |
INL
|
Интегральная нелинейность |
VREF >2B AVCC =3.3...6.0B |
|
0.5 |
|
M3P |
DNL
|
Дифференциальная нелинейность |
VREF >2B AVCC =3.3...6.0B |
|
0.5 |
|
M3P |
|
Ошибка смещения |
AVCC =3.3...6.0B |
|
1 |
|
M3P |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
Время преобразования |
|
65 |
|
260 |
МКС |
fADC |
Тактовая частота |
|
50 |
|
200 |
кГц |
AVCC |
Напряжение питания |
|
VCC- 0.3 |
|
VCC + 0.3 |
В |
VREF |
Опорное напряжение |
|
AGND |
|
AVcc |
|
RREF
|
Входное сопротивление канала опорного напряжения |
|
6 |
10
|
13 |
кОм |
RAIN
|
Входное сопротивление аналогового входа |
|
|
100
|
|
МОм |
10.2.6 ЖКИ – модуль на основе контроллера НD44780
В пакете программ VMLAB 3.12 используется ЖКИ-модуль на основе контроллера НD44780. Приведем краткий обзор данного ЖКИ-модуля и принцип его работы. Контроллер НD44780 фирмы Hitachi фактически является промышленным стандартом и широко применяется при производстве алфавитно-цифровых ЖКИ-модулей. Данный ЖКИ-модуль представляет собой недорогое и удобное устройство, позволяющее сэкономить время и ресурсы при разработке новых изделий. Для соединения ЖКИ-модуля с микроконтроллером используется синхронная шина, насчитывающая 8 или 4 (выбирается программно) линий данных DB0…DB7, линию выбора операции R/W (запись/чтение), линию выбора регистра RS (данные/команда) и линию стробирования/синхронизации Е. Питающее напряжение составляет 5 В. Перед началом рассмотрения принципов управления ЖКИ-модулем, обратимся к внутренней структуре контроллера НD44780, чтобы понять основные принципы построения ЖКИ-модулей на его основе. Упрощенная структурная схема контроллера приведена на рис. 10.7. Можно сразу выделить основные элементы, с которыми приходится взаимодействовать при программном управлении: регистр данных (DR), регистр команд (IR), видеопамять (DDRAM), ОЗУ знакогенератора (CGRAM), счетчик адреса памяти (АС).
Рис. 10.7 Упрощенная структурная схема контроллера НD44780
Другие элементы не являются объектом прямого взаимодействия с управляющей программой – они участвуют в процессе регенерации на ЖКИ: знакогенератор, формирователь курсора, сдвиговые регистры и драйверы.
Управление контроллером ведется посредством интерфейса управляющей системы. Основными объектами взаимодействия являются регистры DR и IR. Выбор адресуемого регистра производится линией RS, если RS=0 - адресуется регистр команд (IR), если RS=1 – регистр данных (DR). Данные через регистр DR, в зависимости от текущего режима, могут помещаться (или прочитываться) в видеопамять (DDRAM) или в ОЗУ знакогенератора (CGRAM) по текущему адресу, указываемому счетчиком адреса (АС). Информация, попадающая в регистр IR, интерпретируется устройством выполнения команд как управляющая последовательность. Прочтение регистра IR возвращает в 7-ми младших разрядах текущее значение счетчика АС, а в старшем разряде флаг занятости (BF). Видеопамять, имеющая общий объем 80 байтов, предназначена для хранения кодов символов, отображаемых на ЖКИ. У контроллера HD44780 существует набор внутренних флагов, определяющих режимы работы различных элементов контроллера:
I/D: режим смещения счетчика адреса АС, 0-уменьшение, 1-увеличение.
S: флаг режима сдвига содержимого экрана. 0 - сдвиг экрана не производится , 1 - после записи в DDRAM очередного кода экран сдвигается в направлении, определяемом флагом I/D: 0 - вправо, 1 - влево.
S/C: определяет объект смещения: 0 - сдвигается курсор, 1 - сдвигается экран.
R/L: уточняет направление сдвига: 0 - влево, 1 – вправо.
D/L: флаг, определяющий ширину шины данных: 0 - 4 разряда, 1 - 8 разрядов.
N: режим развертки изображения на ЖКИ: 0 - одна строка, 1 - две строки.
F: размер матрицы символов: 0 - 5х7 точек, 1 - 5х9 точек.
D: наличие изображения: 0 - выключено, 1 – включено.
С: курсор в виде подчерка: 0 - выключен, 1 - включен.
В: курсор в виде мерцающего знакоместа: 0 - выключен, 1 - включен.
Список управляющих комбинаций битов регистра IR и выполняемые ими команды приведены в таблице 10.9 Вот пример последовательности команд для инициализации ЖКИ-модуля: $30 - установка режима одной строки с матрицей 5х7 точек и работа с 8-ми разрядной шиной данных; $0С - включение отображения на экране ЖКИ-модуля, без отображения курсоров; $06 - режим автоматического перемещения курсора слева-направо после вывода каждого символа.
Таблица 10.9 Управляющие комбинации битов регистра IR
Обозначение выводов |
Комментарий | |||||||
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 | |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Очистка экрана, АС=0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
- |
AC=0, адресация на DDRAM, сброшены сдвиги, начало строки адресуется в начале DDRAM |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
Выбирается направление сдвига курсора или экрана |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
Выбирается режим отображения |
0 |
0 |
0 |
1 |
S/C |
R/L |
- |
- |
Команда сдвига курсора/экрана |
0 |
0 |
1 |
DL |
N |
F |
- |
- |
Определение параметров развертки и ширины шины данных |
0 |
1 |
AG |
AG |
AG |
AG |
AG |
AG |
Присвоение счетчику АС адреса в области CGRAM |
1 |
AD |
AD |
AD |
AD |
AD |
AD |
AD |
Присвоение счетчику АС адреса в области DDRAM |
Рекомендуется выполнить следующую последовательность действий для инициализации ЖКИ-модуля. Выдержать паузу не менее 15 мс между установлением рабочего напряжения питания и выполнением каких-либо операций с контроллером. Первой операцией выполнить команду, выбирающую разрядность шины - $30. Как было сказано ранее, контроллер HD44780 имеет 80 ячеек памяти, называемых видеопамятью. При помощи соответствующих команд, можно в любую из этих ячеек занести любое 8-ми битное число (т. е. число от 0 до 0FFH). Каждому из этих чисел взаимно однозначно соответствует при отображении определенный символ: например, числу 32Н соответствует цифра 2, числу 47Н — заглавная латинская буква G, и т. д. Таблица кодов символов контроллера HD44780 представлена на рис. 10.8. Программа инициализации ЖКИ-модуля и вывода символов представлена ниже.
Рис. 10.8 – Таблица кодов символов контроллера HD44780
Программа №10 (обработка аналоговых сигналов).
Для начала необходимо пояснить что нам необходим сигнал который будет обработан, и его мы подаем в листинге программы, а именно синусоидальный сигнал с тактовой частотой в 10кГц, так же необходимо при создание проекта выбрать микро контроллер ATmega128_64K.
Далее в начале основной программы (рис. 10.11) описан включаемый файл m128def.inc, содержащий информацию о микроконтроллере ATmega128_64K. Далее описаны переменные, то есть значению адресам регистров присвоены символические имена. В программе обращение к переменным производится по присвоенным именам. Основная часть программы начинается с таблицы переходов системы сброса и прерываний. По вектору прерывания по завершению преобразования АЦП указан переход к обработке этого прерывания.
Собственно программа начинается с адреса $02d обнулением используемых регистров и загрузкой в указатель стека исходного адреса, для SPH принимаем значение верхнего бита константы ramend(High(RAMEND)), а для SPL принимаем значение low(RAMEND) . АЦП на включение, выбор однократного преобразования, определение коэффициента деления предделителя АЦП. Затем занесением значения $01 в регистр ADMUX выбирается канал приема аналогового сигнала на мультиплексор. После чего происходит запуск преобразования АЦП. Далее программа зацикливается до появления вектора прерывания по завершению преобразования АЦП, а также происходит проверка переменной per на нулевое значение.
После завершения преобразования АЦП, программа выполняет вызов процедуры прерывания по завершению преобразования АЦП (рис. 10.12), где из регистра данных АЦП происходит пересылка оцифрованного значения напряжения (двоичного кода) в РОН. Далее совершается обработка полученного значения, т.е. десятичная коррекция (преобразование в двоично-десятичный код). Таким образом, мы вычисляем количество тысяч, сотен, десятков и единиц оцифрованного значения напряжения, для вывода на ЖКИ. Затем конфигурируем порт D и каналы порта В РВ0, РВ1 и РВ2 на выход (обеспечивая подключение ЖКИ к микроконтроллеру). По каналам порта В РВ0, РВ1 и РВ2 передаются управляющие сигналы на ЖКИ R/W (R/W =“1” - чтение, R/W = “0” - запись), RS (RS=“1” – данные, RS=“0” – команда), E (строб-сигнал, по перепаду которого из 1 в 0 осуществляется запись данных в индикатор или чтение из него) соответственно через порт D – передача команд и данных. Вызывается подпрограмма конфигурации ЖКИ (рис. 10.14), в которой происходит временная задержка на 16 мс (ожидание включения ЖКИ); подача команды определение параметров развертки и ширины шины данных (DL=1 – 8-разрядная шина данных, N=0 - режим развертки одной строки, F=0 – символы с матрицей 5х7 точек); подача строб-сигнала (рис. 10.19); команда управлением включения дисплея (D=1 - отображение включено, C=0 – курсор в виде подчерка выключен, B=0 - курсор в виде мерцающего знакоместа выключен); подача строб-сигнала; команда автоинкремента (I/D=1 – увеличение счетчика адреса знакоместа на 1,S=0 – без сдвига изображения); подача строб-сигнала. Далее вызывается подпрограмма вывода данных (рис. 10.15): команда сброс дисплея; подача строб-сигнала; указание на выдачу данных; проверка цифры тысяч: если “1”, то вывод на ЖКИ; если “0”, то переход на выдачу цифры сотен; вывод цифры сотен; вывод цифры десятков; вывод цифры единиц. После чего, программа зацикливается на одной строке (конец программы).
Подпрограмма временной задержки на 1 мс (рис. 10.13) организована при помощи вычитания значение из переменной temp1 и temp. Машинный цикл микроконтроллера при тактовой частоте 4 МГц составляет 0,25 мкс, следовательно, необходимо 4000 машинных циклов, для организации задержки 1 мс. Заносим значение 5 в переменную temp1, обнуляем temp. Производим декремент temp – это происходит 256 раз (8-разрядные РОН, 28 = 256), затем уменьшаем temp1 на 1 и снова производим декремент temp. То есть повтор операции 5 раз. С учетом выполнения команд rcall, ret длительность составляет 1 мс.
Подпрограмма временной задержки 4 мс организована вызовом 4 раза подпрограммы задержки 1 мс. Аналогично выполняется подпрограмма задержки 16 мс (4 раза вызов подпрограммы задержки 4 мс).
Подпрограмма определения количества единиц происходит делением кода оцифрованного значения напряжения, полученного в регистре данных АЦП, на 10 (остаток – цифра единиц). Аналогично выполняется определение цифры десятков, сотен и тысяч. Это необходимо для того, чтобы знать какие цифры выводить на ЖКИ.
Подпрограмма выдачи строб-сигнала (рис. 10.9) организована следующим образом: установка бита 3 в регистре данных порта В (РВ2=“1”), задержка 1 мкс, сброс бита 3 в регистре данных порта В (РВ2=“0”). Вызов подпрограммы задержки 1 мс.
Подпрограмм DIV10 представляет собой программу деление целых 8-разрядных беззнаковых чисел, разобранную в л.р. №4. Отличие подпрограммы DIV10Т от DIV10 заключается в том, что первые два разряда переменной ostat перед процедурой деления целых 8-разрядных беззнаковых чисел заполняются в соответствии со значением регистра данных АЦП ADCH. Таким образом, происходит деление 10-разрядного числа на число десять. Поэтому, алгоритм данных подпрограмм приводиться не будет.
Данная программа представляет работу АПЦ микроконтроллера AtMega128 на прием аналогового сигнала, обработку этого сигнала в двоично-десятичный код и выдачу полученного кода на ЖКИ-модуль.
Рис. 10.9 Алгоритм подпрограммы выдачи строб-сигнала
Рис. 10.10 Алгоритм подпрограммы выдачи строб-сигнала
с последующей задержкой
Рис. 10.11 Алгоритм программы обработки аналогового сигнала
Рис. 10.12 Алгоритм процедуры прерывания по завершению
преобразования АЦП
Рис. 10.13 Алгоритм подпрограммы временной задержки 1 мс
Рис. 10.14 Алгоритм подпрограммы конфигурирования ЖКИ
Рис. 10.15 Алгоритм подпрограммы выдачи данных
Листинг программы №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
; Подключение ЖКИ к порту D и каналам порта В РВ1, РВ0, РВ2.
; Параметры: 1 строка, 16 символов, частота 250 кГц
.PLOT v(pF1) ; Вывод на осциллограф сигнала с канала порта F РF1