Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦМПУ / Новая папка (1) / ЦИМПУ(atmega 128).doc
Скачиваний:
102
Добавлен:
16.04.2015
Размер:
4.2 Mб
Скачать

6.2.7 Обращение к портам ввода/вывода

К командам ввода/вывода микроконтроллера ATmega128 относятся команды IN и OUT. При выполнении команды IN (загрузить данные из порта ввода/вывода в регистр) команда загружает данные из пространства ввода/вывода (порты, таймеры, регистры конфигурации и т.п.) в регистр Rd регистрового файла.

Пример:

in R25, $16 ; Считать порт В

cpi R25, 4 ; Сравнить считанное значение с константой

breq exit ; Перейти если R25 = 4

. . .

exit: nop ; пустая операция

При выполнении команды OUT ( записать данные из регистра в порт ввода/вывода) команда сохраняет данные регистра Rr в регистровом файле пространства ввода/вывода (порты, таймеры, регистры конфигурации и т. п.).

Пример:

clr R16 ; Очистить R16

ser R17 ; Установить все биты регистра R17

out $18, R16 ; Записать нули в порт В

nop ; Ожидать (пустая операция)

out $18, R17 ; Записать единицы в порт В

Программа №6 (организация работы с портами ввода/вывода)

Задание:

Организовать поступление в порт В последовательности сигналов: 25, 17, 32, 16, 11, 4, 42 с коэффициентом деления 3; в порт С подать сигналы: 120, 16.

Описание:

В начале программы описан включаемый файл m128def.inc, содержащий информацию о микроконтроллере ATmega128. Далее описаны переменные, то есть значению адресам регистров присвоены символические имена. В программе обращение к переменным производится по присвоенным именам.   Основная часть программы начинается с таблицы переходов системы сброса и прерываний. По вектору внешнего прерывания INT0 указан переход к обработке этого прерывания.

В листинге проектного файла числа, подаваемые на порт B, записываются в двоичном виде снизу вверх.

Собственно программа начинается с адреса $10 обнулением используемых регистров и загрузкой в указатель стека исходного адреса $10(старший байт) и $E8(младший байт). Далее происходит конфигурирование портов ввода/вывода: порта В на вход (с помощью значения, занесенного в регистр r18), канала порта D PD0 на вход (установкой второго бита в значение “0”). Загрузка регистра EIMSK кодом $35 разрешает прерывания по сигналу на выводе внешнего прерывания INT0, а загрузка регистра управления микроконтроллером MCUCR кодом $35 определяет условие генерации внешнего прерывания INT0 по низкому уровню на выводе INT0. Загрузка в переменную cnt значения $8 определяет количество принимаемых сигналов на выводах порта В. Затем устанавливается общий флаг разрешения прерываний. Далее идет проверка переменной vhod на нулевое значение.

Процедура обработки внешнего прерывания (рис. 6.7) начинается с опроса порта В и занесение значения на его выводах в переменную temp2, которая следующим шагом складывается с переменной temp1, с сохранением результата в temp1. Затем проверяется переменная cnt на нуль. Если не нуль, то следующий опрос порта В. Если нуль, то выход из процедуры обработки внешнего прерывания.

После выполнения процедуры обработки от внешнего прерывания указатель выполнения программы переходит на метку Delenie, где происходит деление накопленного входного сигнала на коэффициент деления, заносимый в переменную delit. Результат деления показан в регистре r17, остаток в регистре r19. После деления, происходит настройка порта С на выход и выдача результата деления в порт С. Далее следует временная задержка (рис. 6.6) длительностью 5,5 мкс, определяемое переменной dey. Затем происходит выдача инкрементированного результата деления в порт С.(рис. 6.8) После чего, программа зацикливается на одной строке (конец программы).

Данная программа представляет работу портов ввода/вывода микроконтроллера ATmega128 в качестве портов ввода/вывода общего назначения, а также используется альтернативная функция канала порта PD0 (вход внешнего прерывания 0). Алгоритм основной программы представлен на рис. 6.9.

Рис. 6.6 Алгоритм процедуры временной задержки

Рис.6.7 Алгоритм обработки внешнего прерывания

Рис. 6.9 Алгоритм программы организации работы с портами ввода/вывода

Листинг программы №6

; BASIC .ASM template file for AVR

; ******************************************************

; Define here the variables

;

.include "C:\VMLAB\include\m128def.inc""; определение библиотеки МК ;ATmega128, при условии расположения программы VMLAB на ;локальном диске С

;Инициализация переменных

.def temp =r16 ; Изменяемое значение

.def delit =r16 ; Коэффициент деления

.def temp1 =r17 ; Изменяемое значение

.def vhod =r17 ; Делимое

.def temp2 =r18 ; Изменяемое значение

.def dcnt =r18 ; Счетчик

.def cnt =r19 ; Счетчик

.def ostat =r19 ; Остаток

.def per =r20 ; Переменная выхода

.def dey =r21 ; Переменная задержки

; Основная программа

.ORG $0 ; Начало таблицы переходов

Reset:

rjmp 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 $02 ; Вектор от внешнего прерывания INT0

rjmp Prer ; Переход на обработку внешнего прерывания

.ORG $10 ; Начальный адрес основной программы

start:

clr temp1 ; Очистка регистров

clr temp

clr temp2

clr cnt

clr per

ldi temp,$10 ; Инициализация стека

out SPH,temp

ldi temp,$E8 ; Инициализация стека

out SPL,temp

out DDRB,temp2 ; Настройка порта В на вход

cbi DDRD,0 ; Настройка канала порта D PD0 на вход

ldi temp,$39

out EIMSK,temp ; Установка флага разрешения внешнего ;прерывания

ldi temp,$35

out MCUCR,temp ; Условие генерации внешнего прерывания

; (по низкому уровню на выводе INT0)

ldi cnt,8 ; Загрузка количества значений, принимаемых в порт ;В

clr temp1 ; Очистка регистра

sei ; Разрешить все прерывания

; Ожидание внешнего прерывания

m2: tst vhod ; Проверка регистра на нулевое значение

brne Delenie ; Переход, если значение регистра не нуль

rjmp m2

Delenie: ldi delit,3 ; Загрузка значения коэффициента деления

sub ostat,ostat ; Очистить остаток и перенос

ldi dcnt,9 ; Инициализировать счетчик цикла

d8u_1: rol vhod ; Делимое/результат сдвинуть влево

dec dcnt ; Уменьшить на единицу счетчик цикла

brne d8u_2 ; Переход, если не ноль

rjmp 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: ldi temp,$3f ; Настройка порта С на выход

out DDRC,temp

out PORTC,vhod ; Вывод сигнала в порт С

rcall Delay ; Вызов процедуры задержки

inc vhod ; инкремент переменной vhod

out PORTC,vhod ; Вывод сигнала в порт С

ldi per,120

rcall P_peres

ldi per,16

rcall P_peres

rjmp finish

; Процедура обработки внешнего прерывания

Prer:

m1: in temp2,PINB ; Опрос порта В

add temp1,temp2 ; Сложение регистров

dec cnt ; Уменьшение счетчика на один

brne m1 ; Переход, если не нуль

ret ; Возврат из процедуры

; Процедура последовательной пересылки в канал порта С PC0

P_peres: ldi cnt,$8 ; Загрузка счетчика пересылаемых бит

r1: rol per ; Сдвигаем per влево с переносом, чтобы

; определить "0" или "1"

brcs p1 ; Если бит равен "1", то переход на метку p1

cbi PORTC,0 ; Если бит равен "0", то вывод "0" в PC0

sbic PORTC,0 ; Пропуск, если бит равен "0"

p1:sbi PORTC,0 ; Если бит равен "1", то вывод "1" в PC0

r3:dec cnt ; Декремент счетчика

brne r1 ; Если не равно нулю, то переход на r1

ret ; Выход из процедуры

; Процедура задержки

Delay:

ldi dey,$5 ; Временная задержка на 5,5 мкс

d1: dec dey

brne d1

ret ; Выход из процедуры

finish:

.exit

Листинг проектного файла №6

.MICRO "ATmega128" ; Указание типа микроконтроллера (ATmega128)

.PROGRAM "port.asm" ; Ассемблируемый файл

.TARGET "port.hex" ; Файл машинного кода

.TRACE ; Включение трассировки

.POWER VDD=5 VSS=0 ; Power nodes

.CLOCK 4meg ; Micro clock

.STORE 250m ; Trace (micro+signals) storage time

K0 pd0 GND ; Подключение ключа между PD0 и "землей"

P0 NRZ(1.25u) pb0 KEY_0 "11111100" ; Генерация сигнала на вход PB0

P1 NRZ(1.25u) pb1 KEY_0 "10000000" ; Генерация сигнала на вход PB1

P2 NRZ(1.25u) pb2 KEY_0 "00001000" ; Генерация сигнала на вход PB2

P3 NRZ(1.25u) pb3 KEY_0 "00001000" ; Генерация сигнала на вход PB3

P4 NRZ(1.25u) pb4 KEY_0 "11000000" ; Генерация сигнала на вход PB4

P5 NRZ(1.25u) pb5 KEY_0 "00000000" ; Генерация сигнала на вход PB5

P6 NRZ(1.25u) pb6 KEY_0 "00000000" ; Генерация сигнала на вход PB5

P7 NRZ(1.25u) pb7 KEY_0 "00000000" ; Генерация сигнала на вход PB5

.PLOT v(pd2)v(pb0)v(pb1)v(pb2)v(pb3)v(pc5) v(pc4)v(pc3)v(pc2)v(pc1)v(pc0)

; Вывод на осциллограф сигналов с каналов портов PB0, PB1, PB2, PB3, ;PD2, PC5, РС4, РС3, РС2, РС1, РС0

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