Альтернативные функции выводов порта Е 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Альтернативные функции выводов порта Е



- PDI / RXD - PORTE.0. PDI – вход последовательных данных, используется в процессе загрузки программы через последовательный порт.

RXD - вход приемника UART.

- PDO / TXD - PORTE.1. PDO – выход последовательных жанных, используется в процессе загрузки программы через последовательный порт.

TXD - выход передатчика UART.

- АС+ - PORTE.3. Положительный вход аналогового компаратора.

- АС- - PORTE.4. Отрицательный вход аналогового компаратора.

- INT 4.. INT 7 - PORTD.4 - 7. INT4 - INT7 – входы внешних прерываний 4-7. Запросы от этих источников прерываний могут запускаться по низкому уровню на входе, либо по нарастающему или спадающему фронту сигнала.

Порт F. Порт F является 8-разрядным входным портом. В пространстве памяти ввода/вывода, этому порту соответствует только регистр PINF $00($20).

Выводы порта F подключены через аналоговый мультиплексор к аналого-цифровому преобразователю. Выводы порта F, кроме выполнения функций аналоговых входов, могут быть использованы и в качестве цифровых входов. Это позволят пользователю в одно и то же время использовать часть выводов порта F в качестве цифровых входов, а оставшуюся часть - в качестве аналоговых входов.

Рисунок 3.6 –Регистр входных данных порта F – PINF

PINF - не является регистром в полном смысле слова, обращение по этому адресу обеспечивает чтение физического состояния каждого вывода порта.

 

ВЫПОЛНЕНИЕ ОСНОВНОГО ЗАДАНИЯ

Ознакомиться со схемой платы лабораторного макета и подключением клавиатуры к выводам микроконтроллера.

Запустить на инструментальном компьютере интегрированную систему программирования «AVR Studio». Создать новый проект и новый файл с именем demo3.asm. В файл поместить следующий исходный текст программы:

 

ОБЯЗАТЕЛЬНОЕ ЗАДАНИЕ

лабораторной работы №3

 

 

.include “ml03def.inc”

;******************************  Константы ************************************.EQU Stack=$OFFF;

.Equ KB_Port=PortD;     Регистр порта клавиатуры

.Equ KB_DDR=DDRD;     Регистр направления порта клавиатуры

       .Equ KB_PIN=PIND;                     Регистр выводов порта клавиатуры

       .Equ Ind_Port=PortC;                   Регистр вывода на сегм. мндикат.(только на выход)

 

; * * * * * * * * * * * * * * * * * * * * * * * * * Регистры******* * * * * * * * * * * * * * *

;Переименование регистров (для удобства)

.Def Zero=R3;

.Def Acc=R16;

.Def Bcc=R17;

.Def Ccc=R18;

.Def Dcc=R19;

 .Def Ecc=R20;

 

;***** * ** * * * * * * * * * * * * * * * Переменные * * * * * * * * ** * * * * * * * **** * * ****

.EQU Dig_0=$100;         Разряд выводимого на индикатор числа

.EQU KeyFlags=Dig_0+1; Сдвиговый регистр клавиатуры

 

;* * * * * * * * * ***** * * * * * * * * * * Таблица прерываний * **** * * * * * * * * * * * * * *

.ORG $0

rjmp Start;       Вектор прерывания события RESET

.ORG $30;        Адрес исполняемой части

 

; * * * * * * * * * * * ** * * * * * * * * * * * * Основной цикл программы * * * * * * * * * * * * * * * *

 

;         -------------Инициализация----------------------------------------------

Start:

ldi R16, high(Stack);       инициализация стека

out SPH, R16

ldi R16, low (Stack)

out SPL, R16

clr Zero;

ldi Acc, $0;

out KB_Port, Acc;          PD0-3 выходы, PD4-6 входы: PORTD

out KB_DDR, Acc;          DDRD

;------------------------------------------------------------------------------------------------------------------------- MainCycle:

rcall AskKey;                                                    Опрос KB

         brtc MainCycle;                                                Если флаг T очищен

rcall ToDigits;                                                   Перевод в сегментный вид индикатора

rjmp MainCycle;

;----------------------------------------------------------------------------------------------------------------------

AskKey:

 

clr

Bcc;

 

 

 
clt;

 

 

              очищаем флаг Т

 
sbi

KB_DDR, 0;

 

                   ищем нажатую клавишу в 0-ом ряду

 
rcall

Check;

 

                          проверка на нажатие в 0-ом ряду

 
cbi

KB_DDR,0;

 

                     восстанавливаем PORTE

 
brcc

Checkout;

                   

             если было нажатие переходим на CheckОut

 
sbi

KB_DDR, 1;

 

 

 
rcall

Check;

 

 

 
cbi

KB_DDR, 1;

 

 

 
brcc

Checkout;

 

 

 
sbi

KB_DDR, 2;

 

 

 
Rcall

Check;

 

 

 
cbi

KB_DDR, 2;

 

 

 
Brcc

Checkout;

 

 

 
sbi

KB_DDR,3;

 

 

 
Rcall

Check;

 

 

 
cbi

KB_DDR,3;

 

   CheckОut:

 

 

 

 
Rjmp

Dreb;

 

Check:

 

                          проверка на дребезг

 

 
In

Acc, KB_Pin;

 

      Снимаем значения с входов порта клавиатуры

 
Swap

Acc;

 

                        переворачиваем тетрады

 
Ldi   Check01:

Ccc, 4;

 

                       устанавливаем счетчик цикла

 
Dec

Ccc;

 

                  уменьшаем счетчик цикла

 
Breq

Check02;

 

если прошли 3 колонки, то на выход (нажатия нет)

 
Inc

Bcc;

 

                   Номер кнопки

 
Lsr

Acc;

 

                      поиск нажатой клавиши

 
Brcs

Check01;

 

                        если флаг С=0 было нажатие и мы

 
set;

 

 

                          устанавливаем флаг Т

 

 

Check02:

ret;

 

Dreb:

 

 

 

 Lds

Ccc,KeyFlags;           считываем знач. из сдвигового регистра клавиатуры

 

Lsl

Ccc;                                                                                     сдвигаем его влево

 

Bld

Ccc,0;                                      Записываем в 0-ой бит Ссс значение флага Т

 

Sts

KeyFlags, Ccc;                      Т запоминаем сдвиговый регистр клавиатуры

 

Cpi

Ccc, $FF;                                                     точно было нажатие то на выход

 

Breq

Check02;

 

clt;                                             если не было нажатия то очищаем флаг Т и на выход

 

 

ret;

 

;------------------------------------------------------------------------------------------------------------

 

             

ToDigits:

ldi R30 , low(DigitTab*2),                  ;загружаем в Z адрес таблицы преобразования
ldi R31, ,high(DigitTab*2)  
add R30, Bcc;                Поиск нужного отображаемого образа числа
adc R31, Zero;  
Lpm      
mov Acc, R0;                младший разряд в сегментном виде
sts Dig _0,Acc;                 сохраняем разряды в памяти

; здесь сохранение в ОЗУ сделано для иллюстрации работы с ОЗУ

lds Ecc,Dig_0;          загружаем старший разряд десятичного числа

out Ind_Port, Есс;                 выдаем код на шину данных индикаторов

ret;

; * * * * * * * * * * * * * * * * * * * Т * * * * Таблицы * * * * * * ** * ***** * * * * * * * * * * *

DigitTAB:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С

.db $С0, $F9, $А4, $В0, $99, $92, $82,$F8,$80,$90,$88,$83,$С6

Программа demo3 определяет факт нажатия одной из клавиш 12-кнопочной клавиатуры, организованной в виде матрицы 4 строки x 3 столбца, заносит номер нажатой клавиши в регистр R17, которому в начале программы присвоено имя Всс. Номер нажатой клавиши в шестнадцатеричном формате отображается на семисегментном индикаторе макета. Подразумевается, что в каждый момент времени может быть нажата только одна клавиша. В программе предусмотрена защита от дребезга контактов. Факт нажатия клавиши фиксируется установкой флага Т.

В начале программы с помощью директив EQU и DEF регистрам общего назначения и регистрам портов присваиваются имена, удобные для использования в контексте данной программы.

Директива ORG $0 размещает по нулевому адресу памяти программ команду rjmp Start, которая выполняет безусловный переход на фрагмент программы, инициализирующий микроконтроллер (инициализация стека, портов, регистра Zero). Этот фрагмент начинается с адреса $30 (определяется директивой ORG$30).

В основном цикле программы осуществляется только вызов процедур. Это делает программу более понятной и обеспечивает ее структурность. В данном случае вызываются две процедуры: процедура опроса клавиатуры и процедура вывода кода нажатой клавиши на семисегментный индикатор. Последняя вызывается только тогда, когда имело место нажатие клавиши. Признаком нажатия служит флаг Т - флаг общего назначения в регистре SREG.

Процедура AscKey использует так называемый «метод скользящего нуля» для поиска нажатой клавиши. Работает он следующим образом. Имеется Клавиатура размерностью 3*4, где 3 - число колонок, 4 - число рядов. Каждая колонка «подтянута» резистором к шине питания достаточно большим сопротивлением. Таким образом, на линиях колонок присутствует уровень логической единицы. Линии колонок подсоединены к микроконтроллеру. Режим работы этих выводов микроконтроллера - вход. Линии рядов также подсоединены к порту микроконтроллера и выводы порта сконфигурированы как входные. Нажатие какой-либо из клавиш замыкает определенную линию колонок и линию рядов. Таким образом логические уровни замкнутых линий будут равны. При условии, что все выводы клавиатурного порта микроконтроллера работают на вход (режим - вход), замкнутые линии будут иметь уровень логической единицы (так как колонки подтянуты резистором к шине питания, а после нажатия клавиши к линии колонки подключается линия соответствующего ряда). Теперь если на линию ряда подать уровень логического нуля, то резистор пойдет небольшой ток, а напряжение на замкнутых линиях будет- соответствовать уровню логического нуля. Если логический ноль теперь поочередно подавать на каждую из линий рядов (т.е. как бы двигать ноль в порту), то нажатие легко отслеживается по наличию низкого уровня на линии колонок.

Неприятным атрибутом любых контактов, в том числе и кнопок клавиатуры, является наличие дребезга, т.е. быстрое и непредсказуемое изменение состояния: замкнуто - незамкнуто. Это происходит при нажатии, отпускании, соединении, разъединении и т.д. Существует множество методов борьбы с дребезгом, один из которых мы разберем подробно.

Будем опрашивать клавиатуру и каждый раз, если клавиша нажата и удерживается, будем вдвигать единичку в статус-байт клавиатуры (этот байт мы создаем сами, обозначим его KeyFlags). Если клавиша не нажата - вдвигаем ноль. Как только значение этого байта станет равным $FF - микроконтроллер фиксирует нажатие клавиши. При этом устанавливается флаг Т и из основного цикла вызывается процедура (ToDigits) вывода номера нажатой клавиши на семисегментный индикатор.

В процедуре ToDigits используется таблица образов цифр, переводящая цифры в набор зажигаемых сегментов. Эта таблица расположена по адресу метки DigitTab в памяти программ. Этот адрес (умноженный на 2, т.к. в каждой ячейке памяти программ находится не байт, а 2 байта, т.е. слово) загружается в старшую и младшую части регистра Z, а затем к нему прибавляется номер нажатой клавиши. В случае переполнения младшей части нужно прибавить к старшей части единицу, т.е. осуществить шестнадцатиричное сложение адреса и числа (номера нажатой клавиши). Для того, чтобы не использовать лишние команды, используется регистр Zero. Поскольку с памятью программ, да и вообще с памятью, приходиться работать довольно часто, то резервирование регистра Zero помогает экономить ресурсы контроллера и упрощает всевозможные сравнения с нулем, обнуления и т.п. Считанный из таблицы образ выводится на семисегментный индикатор.

1. Подключить кабелем последовательного порта плату контроллера к компьютеру, подключить кабелем порта USB плату контроллера к компьютеру (источник питания), включить тумблер питания на плате в положения "ON".

2. Выполнить трансляцию программы, загрузить код программы командой Tools | AVR Programmer в память микроконтроллера (она при этом автоматически запускается на выполнение со стартового адреса и зажигает цифру 8), нажать клавишу и наблюдать на индикаторе номер нажатой клавиши.

Задания

1. Составить программу, которая анализирует номер нажатой клавиши и формирует соответствующий десятичный номер на двух семисегментных индикаторах. (Кодировка клавиш задается преподавателем).

2. Разработать и реализовать различные варианты подавления дребезга контактов клавиатуры.

3. Составить программу, осуществляющую считывание трех последовательно вводимых с клавиатуры чисел и их вывод на три семисегментных индикатора.

4. Составить программу опроса клавиатуры, имеющую защиту от одновременного нажатия двух и более клавиш.

5. Составить программу опроса клавиатуры, которая рассматривает некоторые клавиши как служебные, изменяющие действие нажатых основных клавиш.

6. Составить программу опроса клавиатуры, которая наращивает значение в ячейке памяти, соответствующей клавише, если клавиша нажата и удерживается. Результат должен наблюдаться на семисегментном индикаторе.

Провести отладку разработанных программ на лабораторном макете с использованием интегрированной системы программирования. Проверить правильность выполнения программ на макете, продемонстрировать результаты преподавателю.

 

Вопросы для защиты работы:

 

1. Процедуры опроса состояния ATMega 103.

2. Опрос клавиатуры ATMega 103.

3. Служебные действия по нажатой клавише ATMega 103.

4. Считывание числа по нажатию клавиатуры ATMega 103.



Поделиться:


Последнее изменение этой страницы: 2019-11-02; просмотров: 113; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.191.169 (0.041 с.)