Способы адресации памяти данных — КиберПедия 

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

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Способы адресации памяти данных

2019-12-21 329
Способы адресации памяти данных 0.00 из 5.00 0 оценок
Заказать работу

Организация памяти

Использование внешнего ОЗУ

Операти́вная па́мять (англ. Random Access Memory, RAM, память с произвольным доступом) или операти́вное запомина́ющее устро́йство (ОЗУ) — энергозависимая часть системы компьютерной памяти, в которой во время работы компьютера хранится выполняемый машинный код (программы), а также входные, выходные и промежуточные данные, обрабатываемые процессором.

Обмен данными между процессором и оперативной памятью производится:

· непосредственно;

· через сверхбыструю память 0-го уровня — регистры в АЛУ, либо при наличии аппаратного кэша процессора — через кэш.

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

Энергосберегающие режимы работы материнской платы компьютера позволяют переводить его в режим сна, что значительно сокращает уровень потребления компьютером электроэнергии. В режиме гибернации питание ОЗУ отключается. В этом случае для сохранения содержимого ОЗУ операционная система (ОС) перед отключением питания записывает содержимое ОЗУ на устройство постоянного хранения данных (как правило, жёсткий диск). Например, в ОС Windows XP содержимое памяти сохраняется в файл hiberfil.sys, в ОС семейства Unix — на специальный swap-раздел жёсткого диска.

В общем случае ОЗУ содержит программы и данные ОС и запущенные прикладные программы пользователя и данные этих программ, поэтому от объёма оперативной памяти зависит количество задач, которые одновременно может выполнять компьютер под управлением ОС.

Оперативное запоминающее устройство (ОЗУ) — техническое устройство, реализующее функции оперативной памяти. ОЗУ может изготавливаться как отдельный внешний модуль или располагаться на одном кристалле с процессором, например, в однокристальных ЭВМ или однокристальных микроконтроллерах.

ОЗУ большинства современных компьютеров представляет собой модули динамической памяти, содержащие полупроводниковые ИС ЗУ, организованные по принципу устройств с произвольным доступом. Память динамического типа дешевле, чем статического, и её плотность выше, что позволяет на той же площади кремниевого кристалла разместить больше ячеек памяти, но при этом её быстродействие ниже. Статическая память, наоборот, более быстрая память, но она и дороже. В связи с этим основную оперативную память строят на модулях динамической памяти, а память статического типа используется для построения кэш-памяти внутри микропроцессора.

Память динамического типа

Экономичный вид памяти. Для хранения разряда (бита или трита) используется схема, состоящая из одного конденсатора и одного транзистора (в некоторых вариантах два конденсатора). Такой вид памяти, во-первых, дешевле (один конденсатор и один транзистор на 1 бит дешевле нескольких транзисторов триггера), и, во-вторых, занимает меньшую площадь на кристалле (там, где в SRAM размещается один триггер, хранящий 1 бит, можно разместить несколько конденсаторов и транзисторов для хранения нескольких бит). Но DRAM имеет и недостатки. Во-первых, работает медленнее, поскольку, если в SRAM изменение управляющего напряжения на входе триггера сразу очень быстро изменяет его состояние, то для того, чтобы изменить состояние конденсатора, его нужно зарядить или разрядить. Перезаряд конденсатора гораздо более длителен (в 10 и более раз), чем переключение триггера, даже если ёмкость конденсатора очень мала. Второй существенный недостаток — конденсаторы со временем разряжаются. Причём разряжаются они тем быстрее, чем меньше их электрическая ёмкость и больше ток утечки, в основном, утечка через ключ.

Именно из-за того, что заряд конденсатора динамически уменьшается во времени, память на конденсаторах получила своё название DRAM — динамическая память. Поэтому, дабы не потерять содержимое памяти, заряд конденсаторов периодически восстанавливается («регенерируется») через определённое время, называемое циклом регенерации (обычно 2 мс). Для регенерации в современных микросхемах достаточно выполнить циклограмму «чтения» по всем строкам запоминающей матрицы. Процедуру регенерации выполняет процессор или контроллер памяти. Так как для регенерации памяти периодически приостанавливается обращение к памяти, это снижает среднюю скорость обмена с этим видом ОЗУ.

Память статического типа

ОЗУ, которое не надо регенерировать (обычно схемотехнически выполненное в виде массива триггеров), называют статической памятью с произвольным доступом или просто статической памятью. Достоинство этого вида памяти — скорость. Поскольку триггеры являются соединением нескольких логических вентилей, а время задержки на вентиль очень мало, то и переключение состояния триггера происходит очень быстро. Данный вид памяти не лишён недостатков. Во-первых, группа транзисторов, входящих в состав триггера, обходится дороже, чем ячейка динамической памяти, даже если они изготавливаются групповым методом миллионами на одной кремниевой подложке. Кроме того, группа транзисторов занимает гораздо больше площади на кристалле, чем ячейка динамической памяти, поскольку триггер состоит минимум из 2 вентилей (шести-восьми транзисторов), а ячейка динамической памяти — только из одного транзистора и одного конденсатора. Используется для организации сверхбыстродействующего ОЗУ, обмен информацией с которым критичен для производительности системы.

 

Порты ввода/вывода

1.    Регистры портов ввода/вывода.

Порты ввода/вывода (далее я буду писать сокращенно – ПВВ) – п редназначены для общения микроконтроллера с внешними устройствами. С их помощью мы передаем информацию другим устройствам и принимаем информацию от них. В зависимости от типа, микроконтроллер может иметь на своем борту от одного до семи ПВВ. Каждому порту ввода/вывода присвоено буквенное обозначение – A, B, C, D, E, F, G. Все порты в микроконтроллере равнозначные, восьмиразрядные (содержат восемь линий, они же выводы, они же разряды, они же биты) и двунаправленные – могут как передавать, так и принимать информацию. ПВВ в микроконтроллере обслуживают все его устройства, в том числе и периферийные. Поэтому, в зависимости от того какое устройство будет работать с портом он может принимать и передавать или цифровую информацию, или аналоговую.

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

В технической литературе и схемам ПВВ обозначаются следующим образом:
– “ Р ” – первая буква, означающая слово “порт”
– “ А ” (В, С, D, E, F, G) – вторая буква, обозначающая конкретный порт
– “ 0 ” (1, 2, 3, 4, 5, 6, 7) – третий символ – цифра, обозначающая конкретный вывод (регистр, бит) порта.
К примеру: “порт А” – РА, “пятый разряд порта А” – РА5.
Если в МК есть несколько портов, то не обязательно их имена могут идти по порядку – A, B, C. Может быть и так – В, С, D. Поэтому пугаться и судорожно искать где же порт А не надо.
Кроме того, хотя порты восьмиразрядные, выводов у порта не обязательно должно быть 8, может быть и меньше, к примеру 3 – PA0, PA1, PA2. В таком случае порт называют неполным, или урезанным.
Давайте посмотрим на конкретный МК – ATmega8:


Как видите, в этом МК порта с именем “А” нет (отсутствует как класс;). Порт РВ и порт PD – полные, имеют по восемь выводов. А порт С – неполный (ущемленный, нет места в корпусе МК для его вывода), в нем отсутствует восьмой разряд (реально, внутри корпуса МК, он есть, но работать мы с ним не можем).

Для управления портами в их электрической схеме имеется два переключателя, которыми мы можем “щелкать” программно, используя специальные регистры ввода/вывода. Такие переключатели имеются для каждого вывода, что означает возможность управлять любым выводом порта. К примеру, один вывод порта можно настроить на ввод информации, три разряда этого же порта на вывод, а оставшиеся вообще не настраивать, оставить их в “Z- состоянии”

 

2. Конфигурирование портов ввода/вывода.

Как уже было отмечено, порты имеют всего две возможности по кон­фигурированию:

• задание направления передачи данных (вход или выход);

• подключение/отключение внутреннего подтягивающего резистора.

Направление передачи данных определяется содержимым регистра пе­редачи данных DDRx. Если разряд DDRxn этого регистра установлен в «1», соответствующий n-й вывод порта является выходом. Если же разряд DDRxn этого регистра сброшен в «0», соответствующий вывод порта явля­ется входом.

Управление подтягивающим резистором осуществляется с помо­щью регистра данных порта PORTx. Если разряд Рхп регистра PORTx уста­новлен в «1» и соответствующий вывод порта является входом, между этим выводом и проводом питания подключается подтягивающий резистор. Что­бы отключить подтягивающий резистор, необходимо либо сбросить соот­ветствующий разряд регистра PORTx, либо сделать вывод порта выходом.

В табл.12.1 приведены все возможные конфигурации выводов портов ввода/вывода. При рассмотрении таблицы рекомендуется еще раз обратить внимание на схе­му, представленную на рис.5.1.

Таблица 12.1

Влияние регистров DDRx и PORTx на конфигурацию выводов портов

DDRxn Pxn Функция вывода Резистор Примечание
    Вход Отключен Третье состояние (Z)
    Вход Подключен При подключении вывода к общему проводу он является источником тока
    Выход Отключен Выход установлен в «0»
    Выход Отключен Выход установлен в «1»

Примечания:

1) n = 7...0 — номер вывода (разряд порта).

2) Если вывод используется каким-либо периферийным ус­тройством микроконтроллера, то соответствующие этому выводу разряды регистров DDRx и PORTx, как правило, должны быть установлены в соот­ветствии с дополнительной функцией вывода. Однако некоторые перифе­рийные устройства при активизации самостоятельно переопределяют кон­фигурацию используемых выводов. Об этом упомянуто при описании конкретных периферийных устройств.

Таблица 12.2

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

Вывод Альт. функция Описание
PORTA    
PA0 ADC0 Вход АЦП, канал 0
PA1 ADC1 Вход АЦП, канал 1
PA2 ADC2 Вход АЦП, канал 2
PA3 ADC3 Вход АЦП, канал 3
PA4 ADC4 Вход АЦП, канал 4
PA5 ADC5 Вход АЦП, канал 5
PA6 ADC6 Вход АЦП, канал 6
PA7 ADC7 Вход АЦП, канал 7
PORTB    
PB0 T0 Счетный вход таймера-счетчика 0
PB1 T1 Счетный вход таймера-счетчика 1
PB2 AIN0 Прямой вход аналогового компаратора
PB3 AIN1 Инверсный вход аналогового компаратора
PB4 SS Вход выбора микросхемы для интерфейса SPI
PB5 MOSI Выход Master’а и вход Slave’а для SPI
PB6 MISO Вход Master’а и выход Slave’а для SPI
PB7 SCK Выход тактовых импульсов для SPI
PORTC    
PC0 -  
PC1 -  
PC2 -  
PC3 -  
PC4 -  
PC5 -  
PC6 TOSC1 Входы для подключения кварцевого резонатора при работе таймера-счетчика 2 в асинхронном режиме
PC7 TOSC2  
PORTD    
PD0 RXD Вход приемника UART
PD1 TXD Выход передатчика UART
PD2 INT0 Вход запроса внешнего прерывания 0
PD3 INT1 Вход запроса внешнего прерывания 1
PD4 OC1B Выход схемы сравнения В таймера-счетчика 1
PD5 OC1A Выход схемы сравнения А таймера-счетчика 1
PD6 ICP Вход на схему захвата таймера-счетчика 1
PD7 OC2 Выход схемы сравнения таймера-счетчика 2

 

Измерение напряжения и вывод на LCD дисплей

 

1.    Конфигурирование ADC в контролере.

ADC (Analog-to-Digital Converter, в переводе на русский АЦП или аналого-цифровой преобразователь) — это периферия, которая преобразует электрический сигнал на её входе в цифровой код. Затем данный код мы уже используем для обработки или для отображения тем или иным образом данной электрической величины. Это очень распространённая периферия или технология. АЦП активно используется в звукозаписи, измерительной технике, видеозаписи и во многих других случаях. Поэтому нам обойти данную вещь стороной никак не получится, тем более АЦП поддерживается аппаратно в контроллерах PIC16.

Как вообще работает цифровое преобразование?

Берётся опорное напряжение и сравнивается с измеряемым. Соответственно, опорное напряжение всегда должно быть больше измеряемого. Если это не так, то нужно будет применять делители напряжения.

Изобразим схематично процесс измерения

Отрезок — это диапазон измерений. Он находится между нулём и опорным напряжением. А стрелка — это измеряемое напряжение.

Данный отрезок делится пополам, и АЦП оценивает, в какой половине находится приложенное напряжение

Если оно находится в стороне нуля, то в самый старший бит результата записывается 0, а если в стороне максимального напряжения, то единица. У нас будет единица. Затем та половина отрезка, на которой находится измеряемое напряжение делится ещё пополам, и АЦП опять измеряет, в какой половинке уже данного отрезка у нас находится измеряемое напряжение

Оценка идёт по тому же принципу — в какой стороне отрезок. В нашем случае будет 0. И этот ноль записывается в следующий более младший бит.

Затем та четвертинка опять делится пополам и АЦП опять оценивает, где находится отрезок

И АЦП так и продолжает такой процесс до тех пор, пока не кончатся ячейки для битов. То есть если мы используем 10-битный режим, то. соответственно, и будет 10 подобных измерений и заполнятся 10 бит величины. Чем больше бит, тем точнее результат, но уже потребуется на это больше времени и более серьёзный и точный АЦП. Имея данный результат, нам несложно будет посчитать величину измеренного напряжения. Мы знаем. что если у нас АЦП 10-битный, то данный результат у нас лежит в промежутке от 0 до 1023 (0xFFFF), получается всего у нас 1023 отрезка. И мы затем наш результат делим на 1024 (количество отрезков плюс 1) и умножаем на величину опорного напряжения.

Теперь посмотрим, как устроен модуль ADC в контроллере PIC16 (нажмите на картинку для увеличения изображения)

Измеряемый сигнал поступает на коммутатор входов, управляемый с помощью битов CHS2:CHS0, в A/D конвертер, в котором преобразовывается в цифровой код. Также в конвертер подаётся опорное напряжение, которое также может поступать из различных источников, что управляется тоже определёнными битами регистров настроек, с которым и сравнивается поступивший сигнал.

A/D-конвертер работает следующим образом. Сигнал, который поступил в него через коммутатор, заряжает внутренний конденсатор C HOLD. Затем модуль преобразует напряжение, удерживаемое на конденсаторе в соответствующий 10-разрядный цифровой код методом, описанным выше (данный метод называется методом последовательного приближения).

Время, необходимое для преобразования напряжения в цифровой код, поэтому складывается из времени заряда конденсатора и времени собственно преобразования. Расчёт этого времени — задача не совсем тривиальная. Подробно об этом рассказано в технической документации. Нам данное время рассчитывать незачем, так как момент окончания преобразования мы будем обнаруживать по состоянию определённого бита, с которым мы познакомимся немного ниже. Тем не менее иногда возникает необходимость досрочного прекращения преобразования, например для того, чтобы обеспечить большую скорость преобразования за счёт уменьшения точности АЦП. Тогда до следующего запуска преобразования необходимо выдержать определённую паузу.

 

2. Подключение библиотеки LCD дисплея.

Жидкокристаллический дисплей (Liquid Crystal Display) LCD 1602 является хорошим выбором для вывода строк символов в различных проектах. Он стоит недорого, есть различные модификации с разными цветами подсветки, вы можете легко скачать готовые библиотеки для скетчей Ардуино. Но самым главным недостатком этого экрана является тот факт, что дисплей имеет 16 цифровых выводов, из которых обязательными являются минимум 6. Поэтому использование этого LCD экрана без i2c добавляет серьезные ограничения для плат Arduino Uno или Nano. Если контактов не хватает, то вам придется покупать плату Arduino Mega или же сэкономить контакты, в том числе за счет подключения дисплея через i2c.

ля взаимодействие Arduino c LCD 1602 по шине I2C вам потребуются как минимум две библиотеки:

· Библиотека Wire.h для работы с I2C уже имеется в стандартной программе Arduino IDE.

· Библиотека LiquidCrystal_I2C.h, которая включает в себя большое разнообразие команд для управления монитором по шине I2C и позволяет сделать скетч проще и короче. Нужно дополнительно установить библиотеку После подключения дисплея нужно дополнительно установить библиотеку LiquidCrystal_I2C.h

Скачать библиотеку для работы с экраном I2C LiquidCrystal_I2C.

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

#include <Wire.h>

#include <LiquidCrystal_I2C.h> // Подключение библиотеки

//#include <LiquidCrystal_PCF8574.h> // Подключение альтернативной библиотеки

 

LiquidCrystal_I2C lcd(0x27,16,2); // Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой

//LiquidCrystal_PCF8574 lcd(0x27); // Вариант для библиотеки PCF8574

 

void setup()

{

lcd.init();                 // Инициализация дисплея 

lcd.backlight();            // Подключение подсветки

lcd.setCursor(0,0);         // Установка курсора в начало первой строки

lcd.print("Hello");  // Набор текста на первой строке

lcd.setCursor(0,1);         // Установка курсора в начало второй строки

lcd.print("ArduinoMaster");  // Набор текста на второй строке

}

void loop()

{

}

 

Описание функций и методов библиотеки LiquidCrystal_I2C:

· home() и clear() – первая функция позволяет вернуть курсор в начало экрана, вторая тоже, но при этом удаляет все, что было на мониторе до этого.

· write(ch) – позволяет вывести одиночный символ ch на экран.

· cursor() и noCursor() – показывает/скрывает курсор на экране.

· blink() и noBlink() – курсор мигает/не мигает (если до этого было включено его отображение).

· display() и noDisplay() – позволяет подключить/отключить дисплей.

· scrollDisplayLeft() и scrollDisplayRight() – прокручивает экран на один знак влево/вправо.

· autoscroll() и noAutoscroll() – позволяет включить/выключить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.

· leftToRight() и rightToLeft() – Установка направление выводимого текста – слева направо или справа налево.

· createChar(ch, bitmap) – создает символ с кодом ch (0 – 7), используя массив битовых масок bitmap для создания черных и белых точек.

 

 

7-сегментные индикаторы и с динамической индикацией

 

1. Динамическая индикация.

Динамическая индикация широко применяется для отображения различной информации, например температуры, напряжения, времени или просто количества срабатывания каких-либо устройств или датчиков. Динамическая индикация на базе семисегментных индикаторов отлично согласуется в совместной работе с микроконтроллерами. Однако в литературе по программированию микроконтроллеров AVR данный вопрос рассмотрен очень поверхностно и далеко не в каждой книге, посвященной соответствующей тематике. Поэтому более подробно рассмотрим, как подключить семисегментный индикатор с динамической индикацией к микроконтроллеру, в данном случае – к ATmega8, но аналогия сохраняется для МК AVR любой серии.

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

Как видно из рисунков, каждый разряд, называемый digit, имеет свой отдельный общий в пределах разряда вывод. Поскольку рассматривается 4-х разрядная динамическая индикация, то таких выводы четыре – digit1, digit2, digit3, digit4.

Распиновка выводов 4-х разрядного семисегментного индикатора приведена на рисунке ниже. В данном случае показан вид сверху, то есть индикатор не нужно переворачивать вверх ногами.

Как работает динамическая индикация

Теперь рассмотрим, как работает динамическая индикация с общим катодом. Например, нам необходимо отобразить число 1987. Для этого следует в первый момент времени подать высокий потенциал на аноды сегментов, образующих единицу – b и c, а на общий катод первого разряда подать низкий потенциал. Общие катоды оставшихся трех разрядов – digit2, digit3 и digit4 остаются не подключенными.

 


Во второй момент времени получают питания сегменты, образующие цифру 9, общий катод второго разряда подключается к минусу, а digit1 теряет питание; digit2, digit3, как и раннее – остаются не подключенными.

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

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

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

Схема подключения динамической индикации к микроконтроллеру ATmega8

Сегменты динамической индикации будем подключать через токоограничивающие резисторыноминалом 330 Ом к выводам порта D микроконтроллера ATmega8. Выводы, отвечающие digit1, digit2, digit3, digit4 подсоединим через транзисторы n-p-n тип, например BC547 или 2n2222 к выводам порта B.

Если применять динамическую индикацию с общим анодом, тогда понадобятся биполярные транзисторы p-n-p типа, например BC557, эмиттеры которых нужно подсоединить к плюсу «+» источника питания, а коллекторы – к минусу «-» также через подтягивающий резистор 10 кОм.

 

2. 7-сегментные индикаторы, способы подключения.

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

 

Рис. 1. Подключение одного индикатора

 

Сегменты индикатора подключены непосредственно каждый к своему выходу порта PB микроконтроллера. Общий анод всех сегментов подключается к источнику питания. На схеме показан вариант питания индикатора от того же источника +5В, от которого питается сам микроконтроллер. Для уменьшения нагрузки на стабилизатор напряжения можно запитать индикатор до стабилизатора. Для того, что бы высветить на индикаторе ту либо иную цифру микроконтроллер просто программирует все выводы порта PB на выход а затем по мере необходимости выводит в порт код, соответствующий выбранному символу. При этом каждый разряд порта отвечает за свой сегмент индикатора. Если в соответствующий разряд выводится логическая единица, то сегмент остается погашенным. Если в разряд выводится логический ноль, то соответствующий сегмент зажигается. Остается подобрать коды таким образом, что бы засветившиеся разряды высветили нужный нам символ.

 

Для большинства случаев одного разряда индикатора явно не хватает. Подключать же несколько разрядов, каждый к своим выводам явно не получится. Даже самый большой микроконтроллер AVR имеет всего четыре полных порта ввода вывода. Поэтому единственным способом подключения многоразрядных семи сегментных индикаторов к микроконтроллеру является матричный способ. Этот способ очень похож на матричное подключение кнопок клавиатуры, о котором подробно написано в статье "Подключение кнопок". На рисунке 2 показан один из вариантов подключения дисплея из двух семисегментных индикаторов.

 

Рис. 2. Подключение дисплея

 

Приведенная схема рассчитана на световые семи сегментные индикаторы небольшой мощности с током потребления не больше 40 мА. Для более мощных индикаторов нужно применять транзисторные ключи. Обратите внимание, что каждый из выходов порта PB микроконтроллера подключен к одноименным сегментам обоих индикаторов. Так вывод PB0 через резистор R1 подключен к выводу сегмента A индикатора HL1 и индикатора HL2. Выход PB1 через резистор R2 подключен к сегментам B обоих индикаторов и так далее. Выбор одного из индикаторов осуществляется посредством двух старших разрядов порта PD. Общий анод индикатора HL1 подключен к выводу PD6, а общий анод индикатора HL2 к выводу PD5. Такая схема включения называется матрицей. Выводы порта PB можно рассматривать, как восемь горизонтальных линий, а два выхода порта PD, как вертикальные линии матрицы. В точках пересечения каждой линии включен один светодиодный сегмент.

 

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

 

Для реализации режима динамической индикации процессор должен организовать постоянный цикл. Обычно для этого используют встроенный таймер. Таймер настраивается таким образом, что бы выдавать прерывание с определенной частотой, выбранной для динамической индикации. Каждый раз, при вызове прерывания контроллер выдает изображение символа в новый разряд индикатора. Для этого в порт PB контроллер выставляет код, соответствующий нужному символу, а в соответствующий разряд порта PD (PD5 или PD6) выставляет логическую единицу. В тот разряд, который должен быть потушен, подается логический ноль. На этом обработка прерывания заканчивается, контроллер переходит к выполнению основной программы, а выставленные на выводы порта сигналы так и остаются до следующего прерывания. И все это время в соответствующем разряде индицируется нужный символ. Когда возникает следующее прерывание, в порты выводятся сигналы, которые выводят на индикацию изображение другого разряда индикатора.

 

На рисунке 2 приведена схема, содержащая всего два разряда индикации. Точно так же можно подключить три, четыре и более разрядов. В случае применения микроконтроллера ATtiny2313 максимальное количество разрядов - 7. Так как порт PD этого контроллера имеет всего семь выводов. В этом случае в процессе индикации только на один из разрядов порта PD подается логическая единица, а на все остальные логический ноль.

 

Нужно заметить, что в данной схеме выводы PD5 и PD6, к которым подключены общие аноды индикаторов находится под самой большой нагрузкой. Ток протекающий через каждый из них зависит от индицируемого символа и в том случае, когда зажигаются сразу все сегменты в восемь раз больше, чем ток одного сегмента. Такой ток легко может превысить максимально допустимый ток для одного выхода. Однако, во-первых, этот ток носит импульсный характер и среднее значение тока гораздо меньше. А во-вторых, практика показывает, что микроконтроллеры AVR имеют значительный запас по мощности и свободно выдерживают такие нагрузки.

 

Все вышесказанное относится к индикатором с общим анодом. Что бы зажечь такие индикаторы на общий провод следует подавать плюс источника питания, а на выводы сегментов – минус (соединять с общим проводом). Но бывают другие индикаторы, построенные по схеме с общим катодом. Рассмотрим, как использовать этот тип индикаторов. Схему на рис 1 придется немного переделать. Переделка сведется лишь к тому, что общий анод индикатора нужно отключить от источника +5В и подключить на общий провод. Немного изменится и алгоритм работы. Теперь для того, что бы зажечь сегмент на него нужно подать логическую единицу, а что бы потушить - логический ноль. Схему на рис. 2 переделывать не нужно. Изменится лишь алгоритм. Просто фаза всех сигналов должна поменяться. Там, где раньше мы подавали ноль, теперь нужно подать единицу и наоборот.

 

Матричная клавиатура

 

1.    Матричная клавиатура 4x4.

Вы наверняка уже создавали на Arduino проекты, где необходим пользовательский ввод информации. Для этого очень часто используются кнопки, причем для подключения каждой кнопки требуется 1 порт Arduino. Если требуется использовать много кнопок, то это непозволительная роскошь, а иногда просто невозможно. Один из вариантов экономии входов Arduino при подключении кнопок – использование матричных клавиатур, например матричной клавиатуры 4x4 (рис. 1).

Рисунок 1. Матричная клавиатура 4х4

На плате матричной клавиатуры находится 16 кнопок, которые расположены в матрице 4х4 по схеме на рис. 2. От платы клавиатуры уходит шлейф на 8 проводов с разъёмом famale и шагом 2,54 мм.

Рисунок 2. Схема соединений матричной клавиатуры 4х4

Принцип работы клавиатуры следующий. Попеременно подаем сигнал низкого уровня на один из контактов 1-4. Если кнопка нажата, то по наличию сигнала низкого уровня на контактах 5-8 определяем нажатую кнопку из ряда 1-4. Например, подаем LOW на вход 2 (на 1,3,4 – сигнал HIGH). Если на контакте 6 сигнал LOW, значит нажата вторая кнопка из второго ряда – "5".

Подключение к плате Arduino

Для подключения клавиатуры к плате Arduino будут задействованы 8 контактов. Схема подключения показана на рис. 3.

Рисунок 3. Схема соединений для подключения матричной клавиатуры 4х4 к плате Arduino

Загрузим на плату Arduino скетч из листинга 1, который выводит в последовательный порт нажатую клавишу.

2. Использование входов/выходов для чтения клавиатуры.

Цифровые сигналы

В отличие от аналоговых сигналов, которые могут принимать любое значение в пределах диапазона, цифровые сигналы имеют только два отдельных значения: высокий (HIGH, 1) и низкий (LOW, 0) уровни. Вы можете использовать цифровые сигналы в ситуациях, где вход или выход будет принимать одно из этих двух значений. Например, одним из случаев, когда вы можете использовать цифровой сигнал, это включение и выключение светодиода.

Функции

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

  • pinMode()
  • digitalRead()
  • digitalWrite()

pinMode (pin_number, mode)

Поскольку цифровые I/O выводы Arduino могут использоваться в качестве и входа, и выхода, вы должны сначала настроить выводы, которые вы собираетесь использовать для цифрового ввода/вывода, с помощью данной функции. pin_number – это номер вывода, который вы хотите настроить. Режим, mode, может принимать одно из трех значений: INPUT, OUTPUT или INPUT_PULLUP. Когда mode устанавливается в значение INPUT_PULLUP, к выводу подключается внутренний подтягивающий резистор 20 кОм, чтобы привести уровень на выводе к значению HIGH, если к нему ничего не подключено.

digitalWrite(pin_number,value)

Данная функция записывает цифровое значение в вывод. pin задает, в какой вывод на плате Arduino будет записано цифровое значение, а value – это цифровое значение, в которое будет установлен вывод. value может принимать только значения HIGHи LOW.

digitalRead(pin_number)

Данная функция считывает цифровое значение из вывода. pin – это номер цифрового I/O вывода, который вы собираетесь прочитать. Данная функция возвращает одной из двух значений: HIGH или LOW

Необходимые комплектующие

· 1 x светодиод;

· 1 x резистор 220 Ом;

· 1 x Arduino UNO;

· 1 x макетная плата;

· 2 x перемычка.

Схема соединений

На рисунке выше показано, как подключить светодиод и резистор 220 Ом к Arduino. Как показано, светодиод подключен к цифровому I/O выводу 8 платы Arduino через резистор. Резистор контролирует ток через светодиод. Программа ниже сначала настраивает вывод 8 на выход, затем устанавливает цифровой I/O вывод в состояние высокого уровня HIGH на 1000 мс, затем в состояние низкого уровня LOW на следующие 1000 мс.

Прерывания

1. Таблица векторов прерываний.

Таблица векторов прерываний (англ. Interrupt Descriptor Table, IDT) используется в архитектуре x86 и служит для определения корректного ответа на прерыванияи исключения.

В микропроцессорах Intel 8086/80186 таблица векторов прерываний расположена в первом килобайте памяти начиная с адреса 0000:0000 и содержит 256 векторов прерываний в формате сегмент:смещение. Начиная с процессора 80286, адрес в физической памяти и размер таблицы прерываний определяется 48-битнымрегистром IDTR.

В IDT используются следующие типы прерываний: аппаратные прерывания, программные прерывания и прерывания, зарезервированные процессором, называемые исключениями (первые 32) на случай возникновен


Поделиться с друзьями:

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.151 с.