Разработка устройства индикации данных на ЖК-дисплее, передаваемых по интерфейсу RS232 с ПК - Курсовая работа

бесплатно 0
4.5 164
Ядро микроконтроллеров AVR семейства Mega. Временные характеристики ЖК-дисплея. Подключение модуля HD44780. Список управляющих комбинаций битов регистра IR, выполняемые команды. Приём данных по интерфейсу RS 232. Назначение выводов 9-контактного разъема.


Аннотация к работе
Одновременно, в ранее "занятых" микропроцессорными устройствами областях круг решаемых задач и требования к качеству и скорости их решения растут там, где в 80-е годы применялись 4-разрядные устройства. Однако, поскольку нет каких-либо глубоко принципиальных отличий в разработке изделий на базе 8-, 16-или более высокоразрядных микроконтроллеров, а 8-разрядные все еще дешевле своих собратьев, для целей обучения можно признать наиболее подходящими именно 8-разрядные микроконтроллеры. Для выполнения курсового проекта был выбран микроконтроллер ATMEGA64 [8] производства фирмы Atmel. Выбор данного микроконтроллера был осуществлен исходя из варианта, ниже приведены основные отличительные особенности: · 8-разрядный высокопроизводительный AVR микроконтроллер с малым потреблением Ядро микроконтроллеров AVR семейства Mega (рисунок 1.2) выполнено по усовершенствованной RISC-архитектуре (enhanced RISC) [2], в которой используется ряд решений, направленных на повышение быстродействия микроконтроллеров.Если в режиме доступа на запись на этот вывод подан сигнал низкого уровня, то записывается команда, в противном случае происходит запись в регистр данных. После того как управляющие сигналы RS и R/W стабильно установлены на протяжении как минимум 140 нс, микроконтроллер AVR подает на вывод 6 (Е-Enable) модуля стробимпульс положительной полярности длительностью минимум 450 нс, по которому в контроллер HD44780 записываются биты данных, выставленные микроконтроллером AVR на выводы D0...D7, или же, наоборот, микроконтроллер AVR считывает биты данных, выставленные на тех же выводах контроллером HD44780. На рисунке 2.4 приведена упрощенная структурная схема контроллера, приведены основные элементы, которые напрямую взаимодействуют с управляющей программой - регистр данных (DR), регистр команд (IR), видеопамять (DDRAM), ОЗУ знакогенератора (CGRAM), счетчик адреса памяти (AC), флаг занятости контроллера [4]. Контроллер циклически производит обновление информации на ЖКИ, который организован как матрица, состоящая в зависимости от режима работы из 8-ми (одна строка символов 5х7 точек), 11-ти (одна строка символов 5х10 точек) или 16-ти (две строки символов 5х7 точек) строк по 200 сегментов (когда строка насчитывает 40 символов) в каждой. Вот пример широко распространенной последовательности для инициализации ЖКИ-модуля: , $OC, 6 (знак $ перед числом указывает на шестнадцатеричное основание). устанавливает режим отображения 2-х строк с матрицей 5 х 8 точек и работу с 8-ми разрядной шиной данных; $OC включает отображение на экране ЖКИ-можуля, без отображения курсоров; 6 устанавливает режим автоматического перемещения курсора слева-направо после вывода каждого символа.

Введение
Тенденции развития современной техники таковы, что микропроцессорные устройства находят все более широкое применение там, где раньше обходились не только без них, но и без электроники вообще. Одновременно, в ранее "занятых" микропроцессорными устройствами областях круг решаемых задач и требования к качеству и скорости их решения растут там, где в 80-е годы применялись 4-разрядные устройства.

По статистическим данным за 2006 г, среди производителей Юго-Восточной Азии (одного из мировых центров производства электроники) 16- и 32-разрядные устройства уже более популярны, чем 8- разрядные. Однако, поскольку нет каких-либо глубоко принципиальных отличий в разработке изделий на базе 8-, 16- или более высокоразрядных микроконтроллеров, а 8-разрядные все еще дешевле своих собратьев, для целей обучения можно признать наиболее подходящими именно 8-разрядные микроконтроллеры.

На сегодня основную часть казахстанского рынка 8- разрядных микроконтроллеров между собой делят семейства Intel, MCS-51, Atmel, Maxim IC, HC05, HC08, HC11, Motorola.

1. Выбор микроконтроллера

Для выполнения курсового проекта был выбран микроконтроллер ATMEGA64 [8] производства фирмы Atmel. Выбор данного микроконтроллера был осуществлен исходя из варианта, ниже приведены основные отличительные особенности: · 8-разрядный высокопроизводительный AVR микроконтроллер с малым потреблением

· Прогрессивная RISC архитектура

· Энергонезависимая память программ и данных

· Интерфейс JTAG (совместимый с IEEE 1149.1)

· Встроенная периферия

· Специальные микроконтроллерные функции

1.1 Описание микроконтроллера

ATMEGA64 - 8-разрядный микроконтроллер с внутрисхемно программируемой Flash памятью емкостью 64 кбайт (Рисунок 1.1).

ATMEGA64 является КМОП 8 - битным микроконтроллером, построенным на расширенной AVR RISC архитектуре. Используя команды исполняемые за один машинный такт, контроллер достигает производительности в 16 MIPS на рабочей частоте 16 МГЦ, что позволяет разработчику эффективно оптимизировать потребление энергии за счет выбора оптимальной производительности.

Рисунок 1.1 - Блок-схема ATMEGA64

1.2 Архитектура ядра

Ядро микроконтроллеров AVR семейства Mega (рисунок 1.2) выполнено по усовершенствованной RISC-архитектуре (enhanced RISC) [2], в которой используется ряд решений, направленных на повышение быстродействия микроконтроллеров.

Арифметико-логическое устройство (АЛУ), выполняющее все вычисления, подключено непосредственно к 32 рабочим регистрам, объединенным в регистровый файл. Благодаря этому, АЛУ может выполнять одну операцию (чтение содержимого регистров, выполнение операции и запись результата обратно в регистровый файл) за такт. Кроме того, практически каждая из команд (за исключением команд, у которых одним из операндов является 16-битный адрес) занимает одну ячейку памяти программ.

В микроконтроллерах AVR реализована Гарвардская архитектура, характеризующаяся раздельной памятью программ и данных, каждая из которых имеет собственные шины доступа. Такая организация позволяет одновременно работать как с памятью программ, так и с памятью данных. Разделение информационных шин позволяет использовать для каждого типа памяти шины различной разрядности, причем способы адресации и доступа к каждому типу памяти также различаются. В сочетании с двухуровневым конвейером команд такая архитектура позволяет достичь производительности в 1 MIPS на каждый МГЦ тактовой частоты.

Рисунок 1.2 - Архитектура ядра микроконтроллера ATMEGA64

Вывод
В данном курсовом проекте была осуществлена разработка устройства индикации данных на ЖК-дисплее, передаваемых по интерфейсу RS232 с ПК. Были описаны в аналитическом, структурном и расчетно-графическом виде все необходимые узлы и элементы.

При расчете данной курсовой работы использовались математические и графические пакеты, такие как: · Proteus Professional 7 (Данное ПО используется для симуляции основных цифровых устройств и систем)

· SPLAN 6.0.0.2 (Данное ПО используется для графического построения микросхем памяти, а также для структурных схем и узлов системы)

· AVR Studio 4 (Данное ПО используется для создания и отладки программы на языке Ассемблер)

Список литературы
[1] Гребнев В.В. Микроконтроллеры семейства AVR фирмы ATMEL. - М.: ИП РАДИОСОФТ, 2002.

[2] Угрюмов Е.П. Цифровая схемотехника. СПБ: БХВ-СПБ, 2000.

[3] Большие интегральные микросхемы запоминающих устройств: справочник. М.: Радио и связь, 1990.

[4] Бойко В.И. и др. Схемотехника электронных систем. Аналоговые и импульсные устройства. СПБ.: БХВ-Петербург, 2004.

[5] Опадчий Ю.Ф. и др. Аналоговая и цифровая электроника. - М.: Радио и связь, 1997.

[6] Трамперт В. AVR-RISC микроконтроллеры. : Пер. с нем. - К. : «МК-Пресс», 2006.

[7] Кузьминов А.Ю. Интерфейс RS232. Связь между компьютером и микроконтроллером. - М.: Радио и связь, 2004.

[8] Справочник по ATMEGA64 (64L). Atmel corporation, 2001.

Приложение (обязательно)

(программа) nolist

.include "64def.inc"

.list

;***** Регистровые переменные

.def tmp1 = r16 ; Рабочий регистр 1

.def tmp2 = r17 ; Рабочий регистр 2

.def prm1 = r18 ; Передаваемый параметр

.def tim1 = r19 ; Счетчик 1

.def tim2 = r20 ; Счетчик 2

.def Cnt = r21 ; Вспомогательный счетчик

.equ RS = 6 ; Register Select = разряд 6 порта C

.equ Ena = 7 ; Enable Impuls = разряд 7 порта C

.equ RW = 6 ; R/W = разряд 6 порта D (/WR)

.equ BF = 7 ; Флаг занятости = разряд 7 порта A .cseg

.org 0x00 rjmp Initial ;После сброса - к главной программе

.org 0x0B rjmp osnovnaja ;Прерывание по завершению приема данных

INITLCD: rcall wait5ms rcall wait5ms rcall wait5ms ; Задержка на 15 мс после подачи питания ldi prm1,48 ; $30: установка функции, 8 разрядов rcall SENDCOM ; Отправка команды на ЖК-модуль rcall wait5ms ; Задержка на 5 мс ldi prm1,48 ; $30: установка функции, 8 разрядов rcall SENDCOM ; Повторяем команду rcall wait5ms ; Задержка на 5 мс ldi prm1,48 ; $30: установка функции, 8 разрядов rcall SENDCOM ; Повторяем команду rcall wait5ms ; Задержка на 5 мс rcall WAITBUSY ; Ожидаем готовности ЖК-модуля к приему ldi prm1,56 ; $38: функция = 8 разрядов, 2 строки, 5x8 rcall SENDCOM ; Отправляем команду rcall wait150us ; Задержка на 150 мкс rcall WAITBUSY ; Ожидаем готовности ЖК-модуля к приему ldi prm1,8 ; $08: отключение табло, курсора, мерцания rcall SENDCOM ; Передаем команду rcall wait150us ; Задержка на 150 мкс rcall WAITBUSY ; Ожидаем готовности ЖК-модуля к приему ldi prm1,1 ; $01: очистка табло rcall SENDCOM ; Передаем команду rcall wait5ms ; Задержка на 5 мс rcall WAITBUSY ; Ожидаем готовности ЖК-модуля к приему ldi prm1,6 ; $06: режим инкремента адреса rcall SENDCOM ; Передаем команду rcall wait150us ; Задержка на 150 мкс ret

INITUART: ldi prm1,23 out UBRR,prm1 ;настроили регистр скорости передачи данных sbi UCR,4 ;разрешили прием данных от ПК sbi UCR,7 ;разрешили прерывание по завершению приема данных от ПК(переходим на osnovnaja)

SEI ;установили флаг глобального прерывания ret

SENDCOM: ;Передача в ЖК-модуль команды cbi PORTC,RS ;Register Select = команда rcall Ausgabe ret

SENDDAT: ;Передача в ЖК-модуль байта данных sbi PORTC,RS ;Register Select = байт данных rcall Ausgabe ret

Ausgabe: ;Длина данных = 8 бит out PORTA,prm1 ;Выдача команды/данных на порт A sbi PORTC,Ena ;Подаем импульс разрешения nop nop ;Длительность импульса - минимум 450 нс cbi PORTC,Ena ;Снимаем импульс разрешения ret

OUTSIMVOL: ;Вывод символа на табло rcall WAITBUSY ;Ожидаем готовности ЖК-модуля к приему rcall SENDDAT ; Передаем символ, автоинкремент адреса ret

OUTTEXT: ;Вывод приветствия на табло lsl ZL rol ZH ;Указатель Z - на 1 позицию влево

OT1: lpm ;Загружаем код символа в r0 mov prm1,r0 ;Копируем код символа в prm1 rcall WAITBUSY ;Ожидаем готовности ЖК-модуля к приему rcall SENDDAT ;Передаем символ, автоинкремент адреса adiw ZL,1 ;Инкрементируем указатель Z dec cnt ;Счетчик - 1 brne OT1 ;Выводим все символы на ЖК-табло ret

WAITBUSY: ;Ожидание готовности ЖК-модуля к приему clr tmp1 out DDRA,tmp1 ;Порт A = вход cbi PORTC,RS ;Register Select = команда sbi PORTD,RW ;Направление = чтение из ЖК-модуля

WB1: sbi PORTC,Ena ;Подаем импульс разрешения nop nop ;После макс. 320 нс стабильности данных in tmp1,PINA ;считываем BF и значение счетчика адреса cbi PORTC,Ena ;Снимаем импульс разрешения nop sbrc tmp1,BF ;Пропускаем следующую команду, если ЖК-модуль готов (BF=0) rjmp WB1 cbi PORTD,RW ;Направление записи = в ЖК-модуль ser tmp1 out DDRA,tmp1 ;Порт A = выход ret

Wait50us: ;Такт системной синхронизации = 3,6864 МГЦ ldi tim1,65 ;Загрузка счетчика

Wait51: dec tim1 brne Wait51 ret

Wait150us: ;Такт системной синхронизации = 3,6864 МГЦ rcall wait50us rcall wait50us rcall wait50us ret

Wait5ms: ;Такт системной синхронизации = 3,6864 МГЦ ldi tim2,100 ;Загрузка счетчика

Wait501: rcall wait50us dec tim2 brne Wait501 ret

Wait38ms: ;Такт системной синхронизации = 3,6864 МГЦ ldi tim2,0 ;Загрузка счетчика

Wait381: rcall wait150us dec tim2 brne Wait381 ret

Wait5s: ;Такт системной синхронизации = 3,6864 МГЦ ldi cnt,130 ;Загрузка счетчика

Wait5s1: rcall wait38ms dec cnt brne Wait5s1 ret

Initial: ldi tmp1,High(RAMEND) out sph,tmp1 ldi tmp1,Low(RAMEND) ;Настроили стек out spl,tmp1 ;Инициализируем стек ldi tmp1,$3F ;Разряды 7..6 = 0, остальные = 1 out PORTC,tmp1 ;Ena, RS = 0 cbi PORTD,RW ;WR = 0 ldi tmp1,$C0 ;Разряд 7 = 1, разряд 6 = 1 out DDRC,tmp1 ;Разряды 7..6 - выходы, остальные - входы sbi DDRD,RW ;Разряд 6 - выход ser tmp1 ;Устанавливаем tmp1 out DDRA,tmp1 ;Порт A - выход rcall INITLCD ;Инициализируем ЖК-модуль clr tmp2 ;Счетчик символов rcall INITUART ;Инициализируем UART

Privetstvie1: ldi prm1,$0C ;Включаем табло, откл. курсор и мерцание rcall WAITBUSY ;Ожидаем готовность ЖК-модуля к приему rcall SENDCOM ;Передаем команду ldi prm1,$01 ;Очищаем табло, курсор - в начало rcall WAITBUSY ;Ожидаем готовность ЖК-модуля к приему rcall SENDCOM ;Передаем команду ldi ZH,high(Text1) ldi ZL,low(Text1) ;Z указывает на начало текста ldi cnt,20 ;Текст состоит из 16 символов rcall OUTTEXT ;Выводим Text1

Privetstvie2: ldi prm1,64 ;Адрес = начало второй строки sbr prm1,1 память DD rcall WAITBUSY ;Ожидаем готовность ЖК-модуля к приему rcall SENDCOM ;Передаем команду ldi ZH,high(Text2) ldi ZL,low(Text2) ;Z указывает на начало текста ldi cnt,20 ;Текст состоит из 16 символов rcall OUTTEXT ;Выводим Text2 rjmp pc osnovnaja: osnov: rcall WAITBUSY ;Ожидаем готовности ЖК-модуля к приему ldi prm1,15 ;функция мерцания rcall SENDCOM ;Передаем команду rcall wait150us ;Задержка на 150 мкс rcall WAITBUSY ;Ожидаем готовности ЖК-модуля к приему ldi cnt,20 ldi prm1,$01 ;Очищаем табло, курсор - в начало rcall WAITBUSY ;Ожидаем готовность ЖК-модуля к приему rcall SENDCOM ;Передаем команду osnov1: sbis USR,7 ;Проверяем перешли данные из сдвигового регистра в р-р данных (UDR)? rjmp osnov1 ;Если нет, то возвращаемся на метку osnov in prm1,UDR ;Поместили содержимое р-ра данных в р-р передаваемого параметра rcall OUTSIMVOL ;Выводим символ dec cnt ;Декрементировали cpi cnt,0 ;Сравнили с нулем brne osnov1 ;Перешли если неравно, предыдущие символы видны ldi prm1,192 ;Адрес = начало второй строки rcall WAITBUSY ;Ожидаем готовность ЖК-модуля к приему rcall SENDCOM ;Передаем команду osnov2: sbis USR,7 ;Проверяем перешли данные из сдвигового регистра в р-р данных (UDR)? rjmp osnov2 ;Если нет, то возвращаемся на метку osnov in prm1,UDR ;Поместили содержимое р-ра данных в р-р передаваемого параметра rcall OUTSIMVOL ;Выводим символ inc cnt cpi cnt,20 brne osnov2 ;Перешли если неравно, предыдущие символы видны rjmp osnov

Размещено на .ru
Заказать написание новой работы



Дисциплины научных работ



Хотите, перезвоним вам?