Разработка микропроцессорных устройств

Министерство транспорта Российской Федерации

Федеральное агентство железнодорожного транспорта

Федеральное Государственное Бюджетное Общеобразовательное Учреждение

Высшего Профессионального Образования

«Дальневосточный государственный университет путей сообщения»

Естественно-научный институт

Кафедра «Оптические системы связи»

Контрольная работа

РАЗРАБОТКА МИКРОПРОЦЕССОРНЫХ УСТРОЙСТВ

Исполнитель

Студент Н.И. Карижская

Руководитель

Преподаватель И.С. Доронин

Хабаровск 2012

Содержание

  • Введение
  • 1. Краткое описание используемого микроконтроллера ATmega32
  • 1.1 Краткое описание используемого микроконтроллера ATmega32
  • 2. Описание разработанного устройства
  • 3. Принцип работы протокола PS/2
  • 3.1 Передача данных
  • 3.2 Коды сканирования
  • 4. Программный Код и блок-схема микропрограммы
  • Заключение

Введение

Однокристальные микроконтроллеры находят широкое применение в самых разнообразных сферах: от измерительных приборов, фотоаппаратов и видеокамер, принтеров, сканеров и копировальных аппаратов до изделий электронных развлечений и всевозможной домашней техники.

Со времени появления первых микропроцессоров в 1970-х годах их сложность постоянно возрастала за счет появления новых аппаратных решений и добавления новых команд, предназначенных для решения новых задач. Так постепенно сложилась архитектура, получившая впоследствии название CISC (Complex Instruction Set Computers — компьютеры со сложным набором команд). В дальнейшем обозначилось и нашло активное развитие еще одно направление: архитектура RISC (Reduced Instruction Set Computers — компьютеры с сокращенным набором команд). Именно к этой архитектуре относятся микроконтроллеры AVR от компании Atmel.

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

На заре возникновения микропроцессоров разработка программного обеспечения происходила исключительно на том или ином языке ассемблера, ориентированном на конкретное устройство. По сути, такие языки представляли собой символьные мнемоники соответствующих машинных кодов, а перевод мнемоники в машинный код выполнялся транслятором. Однако главный недостаток ассемблерных языков заключается в том, что каждый из них привязан к конкретному типу устройств и логике его работы. Кроме того, ассемблер сложен в освоении, что требует достаточно больших усилий для его изучения, которые, к тому же, оказываются потраченными впустую, если впоследствии потребуется перейти на использование микроконтроллеров других производителей.

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

В данной курсовой работе требуется разработать устройство на базе микроконтроллера ATmega32 семейства AVR, обрабатывающее нажатие кнопок на стандартной клавиатуре PS/2 и выводящее их значение на LCD-индикатор.

1. Краткое описание используемого микроконтроллера ATmega32

1.1 Краткое описание используемого микроконтроллера ATmega32

В курсовой работе используется процессорный модуль, выполненный на основе микроконтроллера ATmega32. Внешний вид процессорного модуля изображен на рисунке 1.1, принципиальная электрическая схема приведена на рисунке 1.2.

Рисунок 1.1 — Внешний вид процессорного модуля, на основе микроконтроллера ATmega32

Atmega32 является КМОП (комплементарная логика на транзисторах металл-оксид-полупроводник) 8-битным микроконтроллером, построенным на расширенной AVR RISC архитектуре. Используя команды, исполняемые за один машинный такт, контроллер достигает производительности в 1 MIPS (величина, показывающая, сколько миллионов инструкций в секунду выполняет процессор в некотором синтетическом тесте) на рабочей частоте 1 МГц, что позволяет разработчику эффективно оптимизировать потребление энергии за счёт выбора оптимальной производительности.

AVR ядро сочетает расширенный набор команд с 32 рабочими регистрами общего назначения. Все 32 регистра соединены с арифметико-логическим устройством (АЛУ), что обеспечивает доступ к двум независимым регистрам на время исполнения команды за один машинный такт. Благодаря выбранной архитектуре достигнута наивысшая скорость кода и соответственно высокая производительность в 10 раз превосходящая скорость соответствующего CISC микроконтроллера.

ATmega32 содержит 32Кбайт внутрисистемно-программируемой FLASH памяти программ, допускающей чтение во время записи, 1024 байт EEPROM, 2К байт SRAM, 32 рабочих регистра, JTAG интерфейс сканирования внутренних регистров, встроенную систему отладки и программирования, три гибких таймера — счётчика с модулем сравнения, внутренние и внешние прерывания, последовательный программируемый интерфейс USART, байт-ориентированный двухпроводный последовательный интерфейс, 8-и канальный, 10-и битный АЦП с дифференциальным программируемым усилителем (только для TQFP), программируемый Watchdog таймер с внутренним генератором, порт SPI и шестью режимами сбережения энергии. В режиме Idle ЦПУ не функционирует в то время как функционируют USART, двухпроводный интерфейс, АЦП, SRAM, таймеры — счётчики, SPI порт и система прерываний. В Atmega32 существует специальный режим подавления шума АЦП, при этом в целом в спящем режиме функционирует только АЦП и асинхронный таймер для уменьшения цифровых шумов преобразования. В выключенном режиме процессор сохраняет содержимое всех регистров, замораживает генератор тактовых сигналов, приостанавливает все другие функции кристалла до прихода внешнего прерывания или поступления внешней команды Reset. В режиме ожидания работает один тактовый генератор, при остановке остальных функций контроллера. Благодаря быстрому переходу в нормальный режим работы, в том числе и по внешнему прерыванию Atmega32 успешно приспосабливается к внешним условиям работы и требует меньше энергии, чаще оказываясь в выключенном режиме. В расширенном режиме ожидания в рабочем состоянии находятся основной генератор и асинхронный генератор.

Читайте также:  Особенности квалификации преступлений

Микросхемы выпускаются при использовании технологии энергонезависимой памяти высокой плотности. Встроенная ISP FLASH память позволяет перепрограммировать область программной памяти внутрисистемно через последовательный SPI интерфейс стандартным программатором, или используя загрузочную программу из энергонезависимой памяти работающую в AVR ядре. Комбинация расширенной 8-и битной RISC архитектуры ЦПУ и твёрдотельной FLASH памяти обеспечивают Atmega32 высокую гибкость и экономическую эффективность во встраиваемых системах управления.

Рисунок 1.2 — . Схема электрическая принципиальная процессорного модуля ATmega32

2. Описание разработанного устройства

Целью данной работы является создание устройства, способного принимать данные с PS/2 клавиатуры. Для реализации данной задачи выбран микроконтроллер Atmel ATmega32 с подключенным к нему LCD-индикатором WINSTAR WH1602A. Также к микроконтроллеру подключен порт PS/2 типа «мама», к которому подключена стандартная клавиатура. Микроконтроллер обрабатывает нажатие клавиш клавиатуры и выводит их символы на LCD-индикатор. Электрическая принципиальная схема разработанного устройства представлена на рисунке 2.1.

Рисунок 2.1 — Схема электрическая принципиальная разработанного устройства

На схеме представлен микроконтроллер Atmega32 (U1). Его выводы PA0-PA3, PA5-PA7 соединены с выводами D4-D7, RS, RW и E индикатора LCD1 соответственно. К выводам PD2 и PD7 подключены выводы 5 (Clock) и 1 (Data) порта PS/2 соответственно.

К выводам XTAL1 и XTAL2 микроконтроллера подключен внешний кварцевый резонатор X1 с частотой 16 Мгц. Вывод Reset микроконтроллера подключен к питанию через резистор R1 и соединен с землей посредством кнопки для возможности перезагрузки устройства. Конденсаторы C1, C2 и С3 отвечают за фильтрацию возможных помех.

Внешний вид полученного устройства представлен на рисунке 2.2.

Рисунок 2.2 — Внешний вид разработанного устройства

3. Принцип работы протокола PS/2

При подключении клавиатуры сначала происходит её инициализация. После этого клавиатура готова отсылать и принимать сообщения. Для нашего устройства достаточно одностороннего режима работы — передача сообщений от клавиатуры к микроконтроллеру.

3.1 Передача данных

Для передачи используется простой последовательный протокол. Как было сказано выше, используется два вывода. Первый вывод — тактовый сигнал (Clock) отвечает за инициирование передачи, определение её направления и регулирование пересылки фрейма. Второй вывод — вывод данных (Data) несёт непосредственную информацию. Рассмотрим порядок пересылки (рисунок 3.1):

Рисунок 3.1 — Пересылка данных от клавиатуры к микроконтроллеру

§ Сначала уровни на обоих выводах высокие. Это соответствует состоянию ожидания (Idle), то есть ничего не происходит.

§ Клавиатура инициирует пересылку, выставив на информационный сигнал в «0» (стартовый бит) и сменив уровень на часах «1»>»0″.

§ Далее клавиатура пересылает 8 бит данных сообщения от младшего бита к старшему, съем информационного сигнала требуется производить при появлении заднего фронта сигнала часов

§ Предпоследний бит называется битом чётности (parity bit) и используется для проверки целостности переданного байта (простой контроль на ошибку передачи).

§ Последний бит равняется «1» и называется стоповым битом.

§ Пересылка закончена и линии возвращаются в состояние ожидания.

Как видно, фрейм клавиатуры состоит из 11 бит. Переданный байт соответствует определённой команде. В простейшем случае это код сканирования (scancode).

3.2 Коды сканирования

Каждой клавише при нажатии соответствует либо один код, либо комбинация кодов (то есть сообщения состоят из нескольких байт). А когда клавишу отпускаешь, прилетает сообщение из нескольких байт, где первый — 0xF0, а второй (их может быть и несколько) соответствует ранее нажатой клавише. Основные коды приведены на следующем рисунке:

Рисунок 3.2 — Коды сканирования

Например, если нажать клавишу F, то клавиатура пошлёт сообщение 0x2B, а если затем отпустить — 0xF0 0x2B.

4. Программный Код и блок-схема микропрограммы

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

#define F_CPU 16000000L // Частота контроллера16 МГц

#include <avr/io. h> // Библиотека ввода-вывода

#include <avr/interrupt. h> // Библиотека прерываний

#include <util/delay. h> // Библиотека задержек

#include «lcd_conf. h» // Библитотека LCD

// Вывод Data подключен к PD7

Читайте также:  Оценка и анализ рисков

#define DATA_PORT PORTD

#define DATA_DDR DDRD

#define DATA_PIN PIND

#define DATA 7

// Вывод Clock подключен к PD2

#define CLOCK_PORT PORTD

#define CLOCK_DDR DDRD

#define CLOCK_PIN PIND

#define CLOCK 2

unsigned int kb_data_bit = ; // Переменная для записи принятого бита

unsigned int kb_bit_count = ; // Счетчик принятых бит

unsigned char kb_buffer [33]; // Буфер для хранения принятых данных

unsigned int j = ; // Переменная-счетчик

unsigned int i = ; // Переменная-счетчик

unsigned int scancode = ; // Переменная для хранения принятого сканкода

unsigned char key; // Переменная для хранения значения нажатой клавиши

// Массив скан-кодов

unsigned int codes [61] = {0x1C, x32, x21, x23, x24, x2B, x34, x33, x43, x3B, x42, x4B, x3A, x31, x44, x4D, x15, x2D, x1B, x2C, x3C, x2A, x1D, x22, x35, x1A, x45, x16, x1E, x26, x25, x2E, x36, x3D, x3E, x46, xE, x4E, x55, x5D, x54, x5B, x4C, x52, x41, x49, x4A, x7C, x7B, x79, x71, x70, x69, x72, x7A, x6B, x73, x74, x6C, x75, x7D};

// Массив соответствующих клавиш

unsigned char keys [61] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, X‘, Y‘, Z‘, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘~’, ‘-‘, ‘=’, ‘\’, [‘, ] ‘, ; ‘, ? ‘, ‘,’, . ‘, ‘/’, ‘*’, ‘-‘, ‘+’, . ‘, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’};

int main (void)

{

GICR = 0x40; // Устанавливаем лог.1 в 6 бит регистра GICR для включения прерываний по событию на INT0

MCUCR = 0x02; // Устанавливаем лог.1 в 1 бит регистра MCUCR для настройки активации прерывания на INT0 по спадающему фронту сигнала

GIFR = 0x40; // Устанавливаем лог.1 в 6 бит регистра GIFR для установки вектора прерывания на INT0

DATA_DDR |= ( << DATA); // Настраиваем PD7 на вход

sei (); // Глобально разрешаем прерывания

LCD_Init (); // Инициализируем дисплей

LCD_Set_Position (1,0);

LCD_Show_StringПривет);

_delay_ms (1000);

LCD_Clear ();

LCD_Set_Position (1,0);

LCD_Show_StringНажата клавиша: «);

while (1)

{

if ( (kb_bit_count == ) || (kb_bit_count == 11)) // Если счетчик принятых бит = или 11

{

KB_Decode (); // Выделяем сканкод из принятых данных

if (scancode! = ) // Если он не = выводим на дисплей клавишу

{

LCD_Set_Position (2,5);

LCD_Show_Char (key);

_delay_ms (1);

}

}

}

}

ISR (INT0_vect) // Прерывание

{

KB_Recieve (); // Получаем данные

}

void KB_Recieve (void) // Описание функции получения данных

{

kb_data_bit = (DATA_PIN >> 7); // Записыаем в перемнную kb_data_bit состояние PD7

if (kb_bit_count < 32) // Если счетчик принятых бит < 32

{

kb_buffer [kb_bit_count] = kb_data_bit; // Записываем принятый бит в буфер kb_buffer на позицию, равную числу принятых бит

kb_bit_count++; // Увеличиваем счетчик принятых бит на 1

} else { // Если счетчик принятых бит = 32

kb_buffer [kb_bit_count] = kb_data_bit; // Записываем принятый бит в буфер kb_buffer на позицию, равную числу принятых бит

kb_bit_count = ; // Сбрасываем счетчик принятых бит

}

}

int KB_Decode (void) // Описание функции вычисления скан-кода

{

scancode = (kb_buffer [1] << ) | (kb_buffer [2] << 1) | (kb_buffer [3] << 2) | (kb_buffer [4] << 3) |

(kb_buffer [5] << 4) | (kb_buffer [6] << 5) | (kb_buffer [7] << 6) | (kb_buffer [8] << 7); // Записываем биты сканкода, отбросив старт, стоп биты и бит четности

if (scancode == 0xAA) // Если сканкод = 0xAA (приветствие клавиатуры), сбрасываем сканкод и счетчик принятых бит

{

kb_bit_count = ;

scancode = ;

}

for (j = ; j < 60😉 // Ищем соответствие сканкода в таблице. Если находим, присваиваем переменной key соответствующий символ

{

if (scancode == codes [j])

{

key = keys [j];

break;

} else {

key = ‘0’;

j++;

}

}

}

При запуске программы подключаются необходимые библиотеки, инициализируются переменные и LCD-индикатор. Далее происходит настройка управляющих регистров и портов микроконтроллера для работы с клавиатурой. На дисплей выводится приветствие, через 1 секунду начинается ожидание нажатия клавиши. Если клавиша нажата, происходит ее отображение на дисплее. Если код нажатой клавиши неизвестен программе, на экран выводится символ «0». Более подробно работа программы описана на блок-схеме (рисунок 4.1).

Рисунок 4.1 — Блок-схема работы микропрограммы

Результат работы микропрограммы отражен на рисунках 4.2-4.4.

Рисунок 4.2 — Разработанное устройство при нажатии клавиши «K»

Рисунок 4.3 — Разработанное устройство при нажатии клавиши «R»

Рисунок 4.4 — Разработанное устройство при нажатии клавиши «=»

Заключение

микропроцессорное устройство код сканирование

В ходе курсовой работы было разработано устройство на базе микроконтроллера ATmega32 семейства AVR, обрабатывающее нажатие кнопок на стандартной клавиатуре PS/2 и выводящее их значение на LCD-индикатор.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...