Программная реализация интерфейса управления tm1640 на atmega

Программная реализация SPI интерфейса, на примере подключения термопары K-типа, через адаптер MAX6675 к микроконтроллеру ATmega8

разделы: SPI , MAX6675 , AVR , дата: 23 октября 2015г

SPI? Легко!

В одном из предыдущих постов, я рассказывал про подключение термопары к Arduino. Теперь настало время рассмореть подключение к AVR микроконтроллерам на чистом Си, благо, как выяснилось, это совсем не сложно.

Напомню, что термопара подключается через адаптер MAX6675, который в свою очередь подключается к микроконтроллеру через SPI интерфейс.

После I2C, SPI интерфейс скорее всего покажется очень простым. Если расмотреть аппаратную реализацию SPI, то там есть регистр данных SPDR, записью или чтением с которого и осуществляется вся работа c SPI.

Программная реализация, как выяснилось, не намного сложнее, но сначала о том, что такое SPI. Фирменный аппнот к SPI можо найти на сайте Atmel: AVR151: Setup And Use of The SPI

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

    Основные моменты:
  1. К интерфейсу возможно подключение нескольких устройств, но единовременно возможна работа только с одним из них.
  2. Используется концепция master-slave(дирижер
  3. В минимальном варианте, имеется две управляющие линии: SCK по которой генерируется синхронизирующие импульсы(она общая для всех), и линия выбора устройства SS(Slave Select). Другое ее обозначение: CS(Chip Select).
  4. Каждое добавленное SPI устройство увеличивает интерфейс на еще одну SS/CS линию.
  5. Интерфейс полнодуплексный, линия MISO (Master In Slave Out) отвечает за прием(относительно мастера), линия MOSI отвечает за предачу.
  6. Имеется четыре режима работы SPI. Фаза SCK изначально имеет низкий уровень в mode 0, и высокий в mode 3. Чтение осуществляется по нарастающему фронту.
  7. В режимах 1 и 3 чтение осуществляется по падающему фронту. Встречаются редко, если верить книге “Практическое программирование микроконтроллеров AVR” Юрия Ревича, глава 11.
  8. Упрощеный вариант SPI состоит из трех линий. В таком случае связь идет только на прием или только на передачу.

Вот именно такой упрощеный режим используется в MAX6675. Документация:MAX6676 datasheet

Предлагаю еще раз взглянуть на формат передачи:

Данные передаются пакетами по два байта. Под температуру отводится 12 бит. 15-й бит, бит знака. LSB – младший значащий бит, MSB – старший значащий бит. Оффициальная легенда:

Значение температуры передается в градусах Цельсия, в диапазоне от 0 до 1024. 1024 – это десять бит, в то время как данные передаются 12-битным форматом.

Значит, чтобы получить значение в градусах, нужно будет полученое число разделить на 4. Меня немного смутил второй бит, device ID. В смысле я не очень понимаю как может один бит служить идентификатором.

Его скорее можно назвать битом корректности.

Если припомнить, то в случае с Arduino я использовал библиотеку: MAX6675-library

На проверку, там оказался довольно простой код:

Я решил не изобретать велосипед, и переписать код на чистом Си. В качестве шаблона использовал проект из предыдущего поста. Я отбросил файлы относящиеся к TWI, после чего осталось переписать main.c в соответсвии со своими целями:

#include
#include
#include #define pSCLK PD6
#define pCS PD5
#define pMISO PD4
#define ddrPORT DDRD
#define csPORT PORTD
#define sclkPORT PORTD
#define misoPIN PIND static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
uint8_t spi_read(void); int main(void)
{ init_uart(); DDRB |= (1

Источник: http://www.count-zero.ru/2015/spi/

Читаем даташит на примере ATmega8

Как читать даташит на Atmega8?

Может быть кто не в курсе, даташит — это техническое описание на какую-либо радиодетальку.

Где его найти? Ну, конечно же, в интернете! Но так почти вся радиоэлектронная продукция выпускается «за бугром», то и описание на них, соответственно, «забугорское», а точнее, на английском языке.

Те, кто хорошо дружит с разговорным английским, не факт, что сможет прочитать технические термины в даташитах.

Давайте попробуем пролить свет истины на основные характеристики МК ATmegа8. Для этого качаем даташит. В нашей статье мы будем рассматривать только основные сведения нашего подопечного.

Вот что мы видим на первой странице даташита:

Итак, погнали! 

Запоминаем правило: в фирменном описании нет ни одного лишнего слова! (иногда информации не хватает, но это уже другой случай)

Features. Переводится как «функции». В среде электронщиков просто «фичи».

— High Performance, Low Power AVR® 8-Bit Microcontroller

Высокопроизводительный, потребляющий мало энергии, 8-битный микроконтроллер.

Понимаем как рекламу, единственно полезное то, что данный микроконтроллер — 8 битный.

— Advanced RISC Architecture

Расширенная RISC архитектура.

RISC и CISC — технологии построения процессорных систем. Но нам это не важно, по крайней мере, пока.

— 130 Powerful Instructions – Most Single Clock Cycle Execution

130 команд, большинство из них выполняются за один цикл.

А вот это уже интереснее! Во-первых, такое большое количество команд (например, у микроконтроллеров PIC всего 35 команд) уже подразумевает ориентацию этого МК под языки высокого уровня.

Во-вторых, узнаем, что одна команда выполняется за один такт генератора. Т.е., при тактовой частоте 1 МГц одна команда будет выполняться 1 микросекунду (1 мкс, одну миллионную часть секунды — 10^-6).

А при 10 МГц — в десять раз быстрее, т.е., 0,1 мкс.

— 32 x 8 General Purpose Working Registers

32 восьмибитных регистра общего пользования.

Про регистры поговорим позднее, просто запомним, что большое количество регистров — весьма неплохо, ведь регистр — это ячейка памяти в самом МК. А чем больше такой памяти – тем «шустрее» работает МК!

Объединив эти данные с количеством поддерживаемых микроконтроллером команд, в очередной раз убеждаемся в изначальной ориентации данного МК под высокоуровневые языки вроде Си, Паскаля и других.

— Fully Static Operation

Полностью статическая структура.

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

(Также нелишним будет напомнить о том, что потребляемая мощность большинства типов МК напрямую зависит от тактовой частоты: чем выше тактовая частота, тем больше он  потребляет)

— Up to 16 MIPS Throughput at 16 MHz

До 16 миллионов выполняемых команд при тактовой частоте 16 МГц.

За одну секунду при тактовой частоте 16 МГц может быть выполнено до 16 000 000 команд! Следовательно, одна однобайтовая команда может быть выполнена за 0,07 мкс. Весьма недурно для маленькой микросхемы.

С учетом предыдущего пункта понимаем, как работает на частотах от 0 Гц до 16 МГц.

— On-chip 2-cycle Multiplier

В данном МК имеется встроенный умножитель, который умножает числа за два такта.

Ну, это хорошо. Даже очень. Но мы пока не будет вгрызаться в эти нюансы…

— High Endurance Non-volatile Memory segments

Надежная энергонезависимая память, построенная в виде нескольких сегментов.

Вспоминаем типы памяти: EEPROM и FLASH.

— 8KBytes of In-System Self-programmable Flash program memory

— 8 Кбайт встроенной в МК памяти. Память выполнена по технологии Flash. В самом МК имеется встроенный программатор.

Этот объем весьма хорош! Для обучения (да и не только) — с запасом. А наличие встроенного программатора этой памяти, позволяет загружать данные в память, используя простой внешний программатор (в простейшем случае это пять проводков, которыми микроконтроллер подключают к LPT порту компьютера).

— 256 Bytes EEPROM

В МК имеется 256 байт энергонезависимой памяти EEPROM.

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

— 1024 Bytes Internal SRAM

В МК имеется 1024 байт оперативной памяти (ОЗУ/RAM).

Также весьма приятный объем

— Write/Erase cyles: 10,000 Flash/100,000 EEPROM

Память Flash выдерживает 10 000 циклов записи/стирания, а память EEPROM — до 100 000

Проще говоря, программу в МК можно изменять до 10 000 раз, а свои данные в 10 раз больше.

— Data retention: 20 years at 85°C/100 years at 25°C

Сохранность данных в памяти МК — до 20 лет при температуре хранения 85°C, и 100 лет — при температуре 20°C.

Если ваши внуки и правнуки включат вашу «мигалку» или музыкальную шкатулку, то они смогут насладиться их работой ))

— Optional Boot Code Section with Independent Lock Bits

— Programming Lock for Software Security

МК имеет несколько областей памяти (не уточняем каких), которые можно защитить от прочтения установкой специальных бит защиты.

Ну, тут всё понятно: свои труды вы можете защитить от вычитывания программы из памяти МК.

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

— Two 8-bit Timer/Counters

— One 16-bit Timer/Counter

В МК имеется два таймера/счетчика: 8 и 16 бит.

— Three PWM Channels

Три канала ШИМ

– 8-channel ADC in TQFP and QFN/MLF package

Eight Channels 10-bit Accuracy

– 6-channel ADC in PDIP package

Six Channels 10-bit Accuracy

В составе МК есть несколько каналов АЦП: 6 – для корпуса PDIP и 8 – для корпуса QFN/MLF. Разрядность АЦП — 10 бит.

— Byte-oriented Two-wire Serial Interface

— Programmable Serial USART

В данном МК реализован аппаратный двухпроводный интерфейс связи USART, байт ориентированный и программируемый — имеется возможность настройки параметров интерфейса.

Master/Slave SPI Serial Interface

Реализован SPI интерфейс связи, режимы Мастер/Подчиненный.

— Programmable Watchdog Timer with Separate On-chip Oscillator

Сторожевой таймер с собственным автономным генератором.

— On-chip Analog Comparator

Аналоговый компаратор.

— Power-on Reset and Programmable Brown-out Detection

Реализованы режимы контроля напряжения питания и защита работы МК при плохом питании (гарантирует увеличение надёжности работы всей системы).

— Internal Calibrated RC Oscillator

Встроенный калиброванный RC-генератор (можно запустить МК без внешних элементов).

— External and Internal Interrupt Sources

Реализовано несколько типов внешних и внутренних прерываний.

— Five Sleep Modes

Пять режимов «сна» (уменьшение энергопотребления МК за счет отключения некоторых внутренних узлов или специальных методов замедления их работы)

Понимаем как возможность выбора такого режима, при котором соотношение «потребляемая энергия/возможности» будут оптимальны для решения наших задач. Весьма полезная возможность при необходимости экономить энергию: питании от батарей, аккумуляторов и других источников.

— 28-pin PDIP, 32-lead TQFP, 28-pad QFN/MLF and 32-pad QFN/MLF

Указаны типы корпусов, в которых выпускается данный микроконтроллер. Видим «28 DIP» — это хорошо! Не надо покупать специализированные дорогостоящие панели и мучиться с тоненькими и часто расположенными выводами на корпусе МК.

Temperature Range:

 -40°C to 85°C

Рабочая температура: -40°C … +85°C

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

(Был у меня горький опыт, когда в устройстве был применен именно такой «теплолюбивый» микроконтроллер. А устройство поместили на улицу… И каждую зиму «благодарные» пользователи моего устройства «хвалили» меня за «замерзание» микроконтроллера, которое проявлялось в виде полного его зависания)

Напряжение питания и тактовая частота

– 2.7 — 5.5V for ATmega8L

– 4.5 — 5.5V for ATmega8

Имеется две модификации данного МК: одна работоспособна при широком диапазоне питающих напряжение, вторая — в узком.

ATmega8L: 0 – 8 MHz @ 2.7 — 5.5V

ATmega8: 0 – 16 MHz @ 4.5 — 5.5V

Максимальная тактовая частота:

— Atmega8L: 0 – 8 МГц при напряжении питания 2,7 – 5,5 вольт

— Atmega8: 0 – 16 МГц при напряжении питания 4,5 – 5,5 вольт.

И что мы видим? А то, что модификация МК, работоспособная в широком диапазоне питающих напряжений, не может быть тактируема частотами выше 8 МГц. Следовательно, и ее вычислительные возможности будут ниже.

Power Consumption at 4 Mhz, 3V, 25°C

— Active: 3.6 mA

— Idle Mode: 1.0 mA

— Power-down Mode: 0.5 µA

Потребляемая мощность:

— при работе на частоте 4 МГц и напряжении питания 3 вольта потребляемый ток: 3,6 миллиампер,

— в различных режимах энергосбережения потребляемый ток: от 1 миллиампер до 0,5 микроампера

На следующей странице публикуется расположение выводов данного микроконтроллера при использовании разных типов корпусов:

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

Внимание!

Обратите внимание на такой факт: микросхема микроконтроллера может иметь (и имеет в данной модели) несколько выводов для подключения источника питания. Т.е., имеется несколько выводов для подключения «земли» — «общего провода», и несколько выводов для подачи положительного напряжения.

Изготовители микроконтроллеров рекомендуют подключать соответствующие выводы вместе, т.е., минус подавать на все выводы, помеченные как Gnd (Ground — Земля), плюс — на все выводы помеченные как Vcc.

При этом через одинаковые выводы МК не должны протекать токи, так как внутри корпуса МК они соединены тонкими проводниками! Т.е., при подключении нагрузки эти выводы не должны рассматриваться как «перемычки».

Листаем описание далее, видим главу «Overview» (Обзор).

В ней имеется раздел «Block Diagram» (Устройство). На рисунке показаны устройства, входящие в состав данного микроконтроллера.

Но самым важным для нас в настоящее время является блок «Oscillator Circuits/Clock Generation» (Схема генератора/Генератор тактовой частоты).

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

Да и не лишним будет заранее просчитать: успеет ли МК выполнить тот или иной фрагмент программы за отведенное для этого время.

В даташите ищем соответствующую главу: «System Clock and Clock Options» (Тактовый генератор и его параметры). В ней видим раздел «Clock Sources» (Источники тактового сигнала), в котором имеется таблица с перечнем видов тактовых сигналов.

В этом разделе указано, что данный МК имеет встроенный тактовый RC-генератор. В разделе «Default Clock Source» имеется указание о том, что МК продается уже настроенным для использования встроенного RC-генератора.

При этом тактовая частота МК — 1 МГц.

Из раздела «Calibrated Internal RC Oscillator» (Калиброванный RC-генератор) узнаем, что встроенный RC-генератор имеет температурный дрейф в пределах 7,3 — 8,1 МГц.

Может возникнуть вопрос: если частота встроенного тактового генератора 7,3 — 8,1 МГц, то как была получена частота 1 МГц? Дело в том, что тактовый сигнал попадает в схемы микроконтроллера через программируемый делитель частоты (Об это рассказано в разделе «System Clock Prescaler»).

В данном микроконтроллере он имеет несколько коэффициентов деления: 1, 2, 4 и 8. При выборе первого мы получим частоту самого тактового генератора, при включении последнего — в 8 раз меньше, т.е., 8/8=1 МГц.

С учетом вышесказанного получаем, что тактовая частота данного МК при включенном делителе с коэффициентом 8 будет в пределах от 7,3/8 = 0,9125 МГц (9125 КГц) до 8,1/8 = 1,0125 МГц.

Обратите внимание на один ну очень важный факт: стабильность частоты дана при температуре МК 25 градусов по шкале Цельсия. Вспомним, что внутренний генератор выполнен по RC схеме. А емкость конденсатора очень зависит от температуры!

Перед тем, как подать на микроконтроллер питающее напряжение, выполним правило, которое обязательно для всех цифровых микросхем: в непосредственной близости от выводов питания микросхемы должен быть керамический конденсатор емкостью 0,06 — 0,22 мкф. Обычно устанавливают конденсатор 0,1 мкф. Его часто называют блокировочным конденсатором.

В схему необходимо установить и электролитический конденсатор емкостью 4-10 мкф. Он также является блокировочным фильтром, но на менее высоких частотах. Такой конденсатор можно устанавливать один для нескольких микросхем. Обычно на 2-3 корпуса микросхем.

Дело в том, что микроконтроллер (как и другие цифровые микросхемы) состоит из транзисторных ячеек, которые в процессе работы постоянно переключаются из открытого состояния в закрытое, и наоборот. При этом изменяется потребляемая транзисторными ячейками энергия. В линии питания возникают кратковременные «провалы» напряжения.

Этих ячеек в микроконтроллере сотни тысяч (думаю, что сейчас уже миллионы!), поэтому по питающим проводам начинают гулять импульсные помехи с частотами от единиц до десятков тысяч Герц. Для предотвращения распространения этих помех по цепям схемы, да и самой микросхемы микроконтроллера, параллельно его выводам питания устанавливают такой блокировочный конденсатор.

При этом на каждую микросхему необходимо устанавливать индивидуальный конденсатор.

https://www.youtube.com/watch?v=78LmEiGTbSE

Конденсатор для постоянного тока является изолятором. Но при установке конденсатора в цепи с непостоянным током он делается сопротивлением. Чем выше частота, тем меньшее сопротивление оказывает конденсатор.

Следовательно, блокировочный конденсатор с малой емкостью пропускает через себя (шунтирует) высокочастотные сигналы (десятки и сотни Герц), а конденсатор с бОльшей емкостью — низкочастотные.

Об этом я писал еще в статье Конденсатор в цепи постоянного и переменного тока

Выводы:

— микроконтроллер AVR ATmega-8 при поставке с завода работает на тактовой частоте 0,91—1,1 МГц;

— напряжение питания должно быть в пределах 4,5 — 5,5 Вольт. Мы будем использовать микросхемы с питающим напряжением 5 Вольт, поэтому и МК будет питаться этим же напряжением. (Хотя работоспособность сохранится при напряжении питания 2,7 Вольт для обычных, не низковольтных моделей МК)

Источник: https://www.ruselectronic.com/chitaem-datashit-na-primere-atmega8/

Подключение внешней памяти к микроконтроллеру ATmega128. Часть 1. Аппаратная реализация

» Схемы » Интерфейсы · Применение микроконтроллеров

23-12-2010

Микроконтроллер AVR ATmega128 производства компании Atmel  имеет объем встроенной cтатической оперативной памяти с произвольным доступом  4 КБайт.

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

Например, если приложение имеет дело с большими объемами данных или управляет операционной системой реального времени, то данный объем SRAM очень быстро исчерпается.

Для решения этой проблемы можно использовать встроенный в микроконтроллер ATmega128 интерфейс внешней памяти, который позволяет расширить объем памяти SRAM до 64 КБайт.

Для экспериментов можно использовать любую отладочную плату на базе микроконтроллера ATmega128, желательно с установленным коннектором XRAM интерфейса. Кроме того, потребуется наличие на плате драйвера и порта RS-232 для наблюдения отладочной информации в терминальной программе на ПК, напрмер для этого можно применить микросхему MAX232 с соотвтетствующими внешними компонентами.

Для подключения дополнительной внешней памяти необходимо изготовить модуль расширения, который будет подключаться к отладочной плате. Модуль содержит установленную микросхему SRAM AS6C6264, производства компании Alliance Memory, микросхему для управления памятью 74HC573 (восьмиразрядный регистр-защелка) и коннектор интерфейса XRAM.

Подключение внешнего статического ОЗУ к AVR-микроконтроллеру

Характеристики интерфейса внешней памяти позволяюют использовать его не только для подключения к внешнему статическому ОЗУ или флэш-памяти, но и в качестве интерфейса с внешними периферийными устройствами, например, ЖК-дисплеями, АЦП и ЦАП. Его основными отличительными особенностями являются:

  • Возможность задания четырех различных по длительности состояний ожидания, в т.ч. без состояния ожидания.
  • Возможность установки различных состояний ожидания для разных секторов внешней памяти (размер сектора конфигурируется).
  • Возможность выбора количества задействованных разрядов в старшем адресном байте.
  • Устройство запоминания состояния шины для минимизации потребления тока (опционально).

Интерфейс XRAM характеризуется высоким быстродействием из-за чего фиксация адреса должна выполняться с осторожностью при частотах свыше 8 МГц при 4 В и 4 МГц при 2.7 В.

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

  • Длительность задержки на распространение сигнала с входа D на выход Q.
  • Время установки данных перед тем как G станет равным 0.
  • Время удержания данных (адреса) после установки низкого уровня на входе G.

Интерфейс XRAM микроконтроллера состоит из:

  • AD[0..7] (выводы порта А) – мультиплексированная младшая шина адреса/шина данных.
  • A[8..15] (выводы порта C) – cтаршая шина адреса (с конфигурируемым числом разрядов).
  • ALE (Вывод PG2) – cтроб адреса внешней памяти.
  • RD (вывод PG1) – инвертированный строб чтения из внешней памяти.
  • WR (вывод PG0) – инвертированный строб записи во внешнюю память.

Принципиальная схема модуля расширения памяти

Кликните для увеличения

AS6C6264 –микросхема КМОП статической оперативной памяти с произвольным доступом 65536 бит (8192 слова по 8 бит). Регистр-защелка используется для работы с мультиплексированной младшей шиной адреса и данных. Для доступа к ячейкам памяти нам необходимо указать 16-битный адрес к 8-битной ячейке и т.к. мы используем 8 КБайт, то использоваться будут только 13 адресных линий.

Автор применил кварцевый резонатор 7.3728 МГц, чтобы временные характеристики интерфейса, при работе с серией 74HC, были в норме и избежать включения дополнительных программных задержек.

Внешний вид модуля расширения

Загрузки

Принципиальная схема и печатная плата модуля расширения (формат Eagle) – скачать

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

scienceprog.com

Источник: https://www.rlocman.ru/shem/schematics.html?di=71093

Использование интерфейса USART микроконтроллеров AVR

Дата публикации: 25 июня 2011.

Рейтинг:  5 / 5

Известно, что при передаче данных могут произойти различные сбои. Модуль UART, реализованный в микроконтроллерах, способен при приеме обнаруживать ошибку формата и переполнение.

Для взаимодействия с программой в модуле предусмотрены прерывания при наступлении следующих событий: прием  завершен с адресом вектора $009 в таблице векторов прерываний,  регистр данных передатчика пуст с адресом вектора $00А, передача завершена с адресом вектора $00В.

Выводы микроконтроллера, используемые модулем UART, являются линиями порта PD. В качестве входа приемника (RXD) используют вывод РD0, а в качестве выхода передатчика (TXD) – вывод PD1.

Принимаемые и передаваемые данные (восемь разрядов) хранятся в регистре UDR. Физически регистр UDR состоит из двух отдельных регистров, один из которых используется для передачи данных, другой – для приема. При чтении регистра UDR выполняется обращение к регистру приемника, при записи – к регистру передатчика.

Регистры управления модулями USART на примере микроконтроллера ATmega8

Буферные регистры приемника и передатчика располагаются по одному адресу пространства ввода/вывода и обозначаются как регистр данных UDR(Universal Data Register). В этом регистре хранятся младшие 8 разрядов принимаемых и передаваемых данных.

При чтении выполняется обращение к буферному регистру UDR приемника, при записи — к буферному регистру передатчика.

В модулях USART буфер приемника является двухуровневым (FIFO буфер), изменение состояния которого происходит при любом обращении к регистру UDR.

В связи с этим не следует использовать регистр UDR в качестве операндов команд типа «чтение/модификация/запись» (SBI и CBI). Кроме того, следует быть очень аккуратными при использовании команд проверки SBIC и SBIS, поскольку они также изменяют состояние буфера приемника.

Для управления модулями USART используются три регистра: UCSRA , UCSRB и UCSRC.

Описание разрядов регистра UCSRA.

Разряд Название Описание
7 RXC Флаг завершения приема. Флаг устанавливается в «1» при наличии непрочитанных данных в буфере приемника (регистр данных UDR). Сбрасывается флаг аппаратно после опустошения буфера (в UART — после прочтения регистраданных). Если разряд RXCIE регистра UCSRB установлен, то при установке флага генерируется запрос на прерывание «прием завершен»
6 TXC Флаг завершения передачи. Флаг устанавливается в «1» после передачи всех разрядов посылки из сдвигового регистра передатчика, при условии, что в регистр данных UDR небыло загружено нового значения. Если разряд TXCIE регистра UCSRB (UCSRnB) установлен, то при установке флагагенерируется прерывание «передача завершена». Флаг сбрасывается аппаратно при выполнении подпрограммы обработки прерывания или программно, записью в него лог. 1
5 UDRE Флаг опустошения регистра данных. Данный флаг устанавливается в «1» при пустом буфере передатчика (после пересылки байта из регистра данных UDR в сдвиговый регистр передатчика). Установленный флаг означает, что врегистр данных можно загружать новое значение. Если разряд UDRIE регистра UCR (UCSRB) установлен, генерируется запрос на прерывание «регистр данных пуст». Флаг сбрасывается аппаратно, при записи в регистр данных
4 FE Флаг ошибки кадрирования. Флаг устанавливается в «1»при обнаружении ошибки кадрирования, т. е. если первыйстопбит принятой посылки равен «0». Флаг сбрасываетсяпри приеме стопбита, равного «1»
3 DOR Флаг переполнения. В USART флаг устанавливается в «1»,если в момент обнаружения нового стартбита в сдвиговомрегистре приемника находится последнее принятое слово, абуфер приемника полон (два значения). В UART флаг устанавливается в «1», если новый кадр будет помещен в сдвиговый регистр приемника до того, как из регистра данных будет считано предыдущее слово. Флаг сбрасывается припересылке принятых данных из сдвигового регистра приемника в буфер
2 PE Флаг ошибки контроля четности. Флаг устанавливается в«1», если в данных, находящихся в буфере приемника, выявлена ошибка контроля четности. При отключенном контроле четности этот разряд постоянно сброшен в «0»
1 U2X Удвоение скорости обмена. Если этот разряд установлен в«1», коэффициент деления предделителя контроллера скорости передачи уменьшается с 16 до 8, удваивая тем самымскорость асинхронного обмена по последовательному каналу. В USART разряд U2X используется только при асинхронном режиме работы. В синхронном режиме он должен быть сброшен
MPCM Режим мультипроцессорного обмена. Разряд MPCM используется в режиме мультипроцессорного обмена. Если онустановлен в «1», ведомый микроконтроллер ожидает приема кадра, содержащего адрес. Кадры, не содержащие адресаустройства, игнорируются

Описание разрядов регистра UCSRB.

Разряд Название Описание
7 RXCIE Разрешение прерывания по завершению приема. Если данныйразряд установлен в «1», то при установке флага RXC регистра UCSRA генерируется прерывание «прием завершен» (если флаг I регистра SREG установлен в «1»)
6 TXCIE Разрешение прерывания по завершению передачи. Если данный разряд установлен в «1», то при установке флага TXC регистра UCSRA генерируется прерывание «передачазавершена» (если флаг I регистра SREG установлен в «1»)
5 UDRIE Разрешение прерывания при очистке регистра данных UART.Если данный разряд установлен в «1», то при установке флагаUDRE в регистра UCSRA  генерируется прерывание «регистр данных пуст» (если флаг I регистра SREG установлен в «1»)
4 RXEN Разрешение приема. При установке этого разряда в «1» разрешается работа приемника USART/UART и переопределяется функционирование вывода RXD (RXDn). При сбросе разряда RXEN работа приемника запрещается, а его буфер сбрасывается. Значения флагов TXC, DOR/OR и FE при этом становятся недействительными
3 TXEN Разрешение передачи. При установке этого разряда в «1» разрешается работа передатчика UART и переопределяется функционирование вывода TXD. Если разряд сбрасывается в «0» во время передачи, выключение передатчика произойдет только после завершения передачи данных, находящихся в сдвиговом регистре и буфере передатчика
2 UCSZ2 Формат посылок. Этот разряд используется для задания размера слов данных, передаваемых по последовательному каналу. В модулях USART он используется совместно с разрядами UCSZ1:0 регистра UCSRC. В модулях UART, если разряд CHR9 установлен в «1», осуществляется передача и прием 9 разрядных данных, если сброшен — 8 разрядных
1 RXB8 8 й разряд принимаемых данных. При использовании 9 разрядных слов данных этот разряд содержит значение старшего разряда принятого слова. В случае USART содержимое этого разряда должно быть считано до прочтения регистра данных UDR
TXB8 8 й разряд передаваемых данных. При использовании 9 разрядных слов данных, содержимое этого разряда является старшим разрядом передаваемого слова. Требуемое значение должно быть занесено в этот разряд до загрузки байта данных в регистр UDR

Описание разрядов регистра UCSRC.

Разряд Название Описание
7 URSEL Выбор регистра. Этот разряд определяет, в какой из регистровмодуля производится запись. Если разряд установлен в «1»,обращение производится к регистру UCSRC. Если жеразряд сброшен в «0», обращение производится к регистру UBRRH.
6 UMSEL Режим работы USART. Если разряд сброшен в «0», модуль USART работает в асинхронном режиме. Если разряд установлен в «1», то модуль USART работает в синхронном режиме
5 UPM1 Режим работы схемы контроля и формирования четности. Этиразряды определяют функционирование схем контроля иформирования четности
4 UPM0
3 USBS Количество стопбитов. Этот разряд определяет количествостопбитов, посылаемых передатчиком. Если разряд сброшен в «0», передатчик посылает 1 стопбит, если установлен в «1», то 2 стопбита. Для приемника содержимое этого разряда безразлично
2 UCSZ1 Формат посылок. Совместно с разрядом UCSZ2 этиразряды определяют количество разрядов данных в посылках(размер слова)
1 UCSZ0
UCPOL Полярность тактового сигнала. Значение этого разряда определяет момент выдачи и считывания данных на выводах модуля. Разряд используется только при работе в синхронном режиме. При работе в асинхронном режиме он должен быть сброшен в «0»

Скорость приема/передачи USART

В асинхронном режиме, а также в синхронном режиме при работе в качестве ведущего, скорость приема и передачи данных задается контроллером скорости передачи, функционирующим как делитель системного тактового сигнала с программируемым коэффициентом деления. Коэффициент определяется содержимым регистра контроллера UBRR.

В блок приемника сформированный сигнал поступает сразу, а в блок передатчика — через дополнительный делитель, коэффициент деления которого (2, 8 или 16) зависит от режима работы модуля USART/UART.

Регистр UBRR является 12 разрядным и физически размещается в двух регистрах ввода/вывода UBRRH и UBRRL.

При работе в асинхронном режиме скорость обмена определяется не только содержимым регистра UBRR, но и состоянием разряда U2X регистра UCSRA .

Если этот разряд установлен в «1», коэффициент деления предделителя уменьшается в два раза, а скорость
обмена соответственно удваивается.

При работе в синхронном режиме этот разряд должен быть сброшен.

Cкорость обмена определяется следующими формулами, где

BAUD — скорость передачи в бодах, fCK — тактовая частота микроконтроллера, UBRR — содержимое регистра контроллера скорости передачи (0…4095):

асинхронный режим (обычный, U2Xn = «0»)
BAUD = fCK/16(UBRR + 1);

асинхронный режим (ускоренный, U2Xn = «1»)
BAUD = fCK/8(UBRR + 1);

синхронный режим ведущего
BAUD = fCK/2(UBRR + 1).

Ниже представлен пример тестовой программы для изучения протокола USART, где микроконтроллер Atmega8 обменивается информацией с терминалом, для наглядности к контроллеру подключен LCD 16X02 дисплей.

При нажатии на кнопки 1-3 в терминале высвечиваются соответствующие строки, также если выводить в терминал символы “a” или “b”, будет загораться или гаснуть светодиод, подключенный к порту PB0 контроллера. Любые символы выводимые в терминал будут также высвечиваться на LCD дисплее.

Для тестирования в “железе”, микроконтроллер подключается к компьютеру через микросхему преобразователя уровней MAX232, для обмена данными используется стандартная программа Hyper Terminal от Microsoft.

//*** Пример работы с USART интерфейсом микроконтроллеров AVR *** #include
#include #define BAUDRATE 9600 // Скорость обмена данными #define F_CPU 8000000UL // Рабочая частота контроллера unsigned char NUM = 0; unsigned char count = 0; unsigned char byte_receive = 0; unsigned char i = 1; // Функция задержки в мкс void _delay_us(unsigned char time_us) { register unsigned char i; for(i = 0; i < time_us; i++) { asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); } } // Функция задержки в мс void _delay_ms(unsigned int time_ms) { register unsigned int i; for(i = 0; i < time_ms; i++) { _delay_us(250); _delay_us(250); _delay_us(250); _delay_us(250); } } #define RS PD2 #define EN PD3 // Функция передачи команды void lcd_com(unsigned char p) { PORTD &= ~(1

Источник: https://radioparty.ru/prog-avr/program-c/307

Программирование AVR. Использование UART

Микроконтроллеры AVR, как и большинство современных контроллеров, имеют на своем борту аппаратный модуль UART, являющийся отличным решением для передачи данных. Именно про UART будет эта статья

Источник: https://microtechnics.ru/programmirovanie-avr-ispolzovanie-uart/

ATmega8535. Подключение графического индикатора WG12864B-YGH-VN. часть 1

Источник: http://mega-avr.ucoz.ru/publ/atmega8535_connect_display_wg12864b_and_microcontroller_part1/1-1-0-6

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}

Однажды решился разобраться, что же такое графический дисплей и с чем его едят. Юзая Интернет в поисках (описание, принципы работы и т.д.), наткнулся на статью на сайте www.radiokot.ru «Использование графического LCD WG12864A» (спасибо автору molchec за написанную информацию). Из данной статьи была взята небольшая часть кода по выводу текста.

Конечно, можно было бы тупо взять всю программную идею и не изобретать велосипед, но все, же я решил разобраться с этим графическим «зверем» с нуля, изучая от корки до корки PDF документацию, осмысляя всю сущность работы и реализации в программном коде (драйвере LCD).

Поэтому хочу в этой статье описать свой вариант использование графического дисплея WG12864B-YGH-VN подключенного к микроконтроллеру AVR.
 

Графический дисплей дает широкие возможности по выводу различной текстовой и графической информации (отсюда название типа индикатора).

Дисплей имеет 128 точек по горизонтали и 64 точки по вертикали. Весь экран разделён на два полуэкрана, соответственно имеет два управляющих контроллера (тип Neotec NT7108).

Линии управления E,DI,RW,RESET и шина данных DB7-DB0 являются общими для двух контроллеров, кроме линий CS1 и CS2, по которым выполняется выбор контроллера.

Если линии CS1 и CS2 не активны (логическая 1), то любые изменения на выше описанных линиях управления результата не дадут по отношению к дисплею.

Дисплей имеет 6 линий управления, 8 разрядную шину вводавывода данных и выводы питания.

Функциональные выводы:   • RESET  ( инверсный вход ) – сброс индикатора.   • DI      ( D – прямой вход, I – инверсный вход )   – выбор данные ( 1 )инструкции ( 0 ).   • RW     ( R – прямой вход, W – инверсный вход ) – выбор чтение ( 1 )запись ( 0 ).   • Е         стробирующий сигнал. ( L ( 0 )  H ( 1 ) ).   • CS1     выбор первого контроллера ( соотв. Полуэкран ). Низкий ( L ) уровень активный.   • CS2     выбор второго контроллера ( соотв. Полуэкран ). Низкий ( L ) уровень активный.   • DB7–DB0  8битная шина данных.

Остальные выводы:

  • Vdd вывод питания ( +5В ).   • Vcc общий ( корпус ).   • Vo вывод регулировки контрастности.    • Vee выход отрицательного напряжения.   • A анод питания подсветки.   • K катод питания подсветки.

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

В какой именно области экрана будут отображаться данные ( страница, столбец ), например – символ, определяется установленными значениями в счетчике Y адреса и регистре Х адреса.

После записи данных в RAM, Счетчик Y адреса увеличивает свое значение автоматически, поэтому достаточно указать определенное значение счетчика и далее записывать побайтно последовательность символов.

Память RAM контроллера NT7108 разбита на 8 страниц по 64 ячейки ( ячейка имеет размер в 1байт ). Общий размер памяти RAM одного контроллера 512байт (4096бит ).

Выбрав страницу ( 0 – 7 ) и установив значение счетчика Y адреса ( 0 – 63 ), можно писать символы. У данной модели дисплея отсутствует встроенная ROM память, содержащая набор символов для вывода на экран.

Поэтому двухмерный массив символов для вывода будет содержаться непосредственно во flash памяти микроконтроллера. Смысл вывода графики на экран дисплея, будь то текст или графические примитивы, да хоть « кракозабли », сводиться к отображению памяти RAM: что записано там, то и будет на экране, т.е.

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

Записьчтение данныхкоманд выполняется логическим управлением линий DI, RW, E. В таблице описаны инструкции для управления контроллером LCD:

 название команды   DI   RW   DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0 

 Включениевыключение дисплея 

 0

 0

 0

 0

 1

 1

 1

 1

1

D

 Установка счетчика Y адреса

 0

 0

 0

1

 Адрес ( 0 – 63 )

 Установка страницы ( регистр Х адреса ) 

 0  0  1  0  1  1  1  Адрес ( 0 – 7 )
 Стартовая линия дисплея  0  0  1  1  Адрес ( 0 – 63 )
 Чтение регистра статуса контроллера  0  busy  0  onoff  reset  0  0  0  0
 Запись данных в RAM  1  Данные в диспей поступают от микроконтроллера 
 Чтение данных из RAM  1  Данные от дисплея поступают в микроконтроллер 

                  Для фиксирования контроллером логического состояния линий DI, RW, DB0 – DB7, нужно на линии Е выполнить логический                                                     перепад: H -> L

Теперь разберемся подробнее с этими командами. Сложного ничего нет, главное уловить смысл функционирования.

 

Display onoff
( включениевыключение дисплея )

Управление отображением ЖК экрана. Логическое состояние бита D определяет, будет ли экран отображать информацию: 
  • D = 0 индикатор не отображает, 
  • D = 1 индикатор отображает.
На состояние RAM памяти не влияет.

Display Start Line
( стартовая линия дисплея )

Z адрес отображения информации на дисплее по строке. Запись числа в регистр приводит к смещению всего изображения по вертикали.

Если Z address++ ( инкремент ), то изображение перемещается сверху вниз. Если Z address– ( декремент ), то изображение перемещается снизу вверх.

Данные имеют диапазон 0x00 – 0x3F( 0 – 63 )

Set page ( X address )
( Выбор страницы. Х адрес )

Установка регистра Х адреса памяти RAM контроллера. Адрес определяет страницу ( 64 байта полного заполнения единицами ), в которую будет выполняться запись или чтение данных. Данные имеют диапазон 0x00 – 0x07 ( 0 – 7 ).

Set Y address
( Счетчик. Y адрес )

Установка счетчика Y адреса памяти RAM контроллера ( столбцы или 8-битные ячейки памяти ). С каждой записью или чтения данных, счетчик адреса инкрементирует свое значение на 1. Данные имеют диапазон 0x00 – 0x3F ( 0 – 63 ).

Status Read
( чтение регистра состояние контроллера LCD )

Содержит 1байт значение состояния контроллера, которое определяет, какая работа в данный момент выполняется дисплеем.

Busy ( Флаг занятости контроллера )

   • Флаг установлен в 1, если контроллер занят внутренней работой.    • Флаг установлен в 0, если контроллер освободился.

Onoff ( Флаг вклвыкл дисплея)

Показывает, отображается или неотображается информация на дисплее.    • Флаг установлен в 1, если экран дисплея в отключенном состояниии.    • Флаг установлен в 0, если экран дисплея во включенном состояниии.

Reset ( Сброс )

Показывает сброшен ли контроллер дисплея или находится в активном состоянии.    • Флаг установлен в 1, если контроллер дисплея в состоянии сброса.

   • Флаг установлен в 0, если контроллер дисплея в рабочем состоянии.

 

Для подключения дисплея, используется 14 линий вводавывода. Шина данных дисплея подключена к выводам порта С ( PORTC ), а линии управления к порту D ( PORTD ).

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

В моем случае, я использовал PORTA для работы с АЦП, PD0 ( RXD ) и PD1 ( TXD ) для связи с компьютером, поэтому схема подключения такая. Кварц ZQ1 – 11,059200Mгц

При первом подключении дисплея, можно проверить наличие подсветки экрана и подрегулировать контрастность. Контрастность подстраивается резистором R1.

О наличие контрастности свидетельствует появление всех точек на полном экране.

Характеристика по питанию:

   • Ток потребления индикатором ~2мА.

   • Потребление подсветкой ~310 – 315мА при номинале резистора R2 1.5Ом ( по схеме ).

На этом первую часть закончили и в следующей поговорим о программировании…