Группа компаний Симметрон
Комплексные поставки электронных компонентов
ЭК  »   Freescale  »   HCS08: руководство разработчика
Ассортимент, наличие и цены, поставщики
Заказать через Интернет
Паяльное и антистатическое оборудование, инструмент
Краткая история
Статьи и обзоры
Офисы, филиалы, представительства, магазины
Электронная почта
На первую страницу
Поиск: справка
 

Фирменный магазин

Микроника - радиодетали и инструменты

Весь ассортимент компании "Симметрон электронные компоненты" вы можете приобрести в розницу в фирменном магазине "Микроника".


 

6.1.1. Ввод/вывод под управлением программы

(Руководство разработчика по микроконтроллерам семейства HCS08)

При работе в режиме ввода/вывода под управлением программы все операции ввода/вывода совершаются посредством операций чтения и записи в регистры специальных функций портов. Режим ввода/вывода под управлением программы устанавливается для всех портов автоматически при выходе МК из состояния сброса.

В этом режиме наиболее часто используются два регистра управления портами: регистр данных PTxD и регистр направления передачи PTxDD. Первый используется для записи/чтения данных порта, второй — для определения, какая линия будет работать на ввод, а какая — на вывод. Три остальных регистра — регистр входного сопротивления порта PTxPE, регистр контроля нарастания напряжения на выводах порта PTxSE и регистр нагрузочной способности выводов порта PTxDS — используются реже, в основном в подпрограмме начальной установки конфигурации, которую принято называть подпрограммой инициализации.

6.1.1.1. Режим вывода

Рассмотрим задачу управления светодиодом, который подключен к линии PTA0 (например, на демонстрационной плате Spyder08). Для успешного управления светодиодом необходимо настроить линию PTA0 на вывод:

PTADD = 1;       // PTA0 настроена на вывод. Все остальные линии — на ввод

Хотя все должно работать правильно, необходимо сделать следующее замечание: после приведенной инициализации неиспользуемые линии порта PTA0 будут настроены на ввод, и это не очень хорошо. Линии ввода CMOS-логики работают как антенны, принимая окружающий шум, что вызывает протекание больших токов (при быстром переключении) и в самом плохом случае может привести к выходу интегральной схемы из строя. Поэтому неиспользуемые линии должны быть сконфигурированы одним из следующих способов:

  1. На вывод и оставлены неподключенными. Это основное решение, которое позволяет далее использовать эти линии.
  2. На ввод и подключены к напряжению VSS или VDD (предпочтительнее к VSS);
  3. На ввод, и программно активированы внутренние подтягивающие резисторы.

При использовании демонстрационной платы Spyder08 мы просто сконфигурируем все остальные линии на вывод. Для этого напишем:

PTADD = Ox1F;  // Линии с PTA0 по PTA4 настроены на вывод, PTA6 и PTA7 в
              // данной модели МК не существуют!

Также можно использовать символьное описание, приведенное в файле hcs08.h:

PTADD = BIT_4 | BIT_3 | BIT_2 | BIT_1 |  BIT_0;

Если МК располагается в 8-выводном корпусе, то линии PTA6 и PTA7 для этого МК не существуют. Если МК располагаются в 8- и 16-выводных корпусах, то линия PTA4 выполняет альтернативную функцию BKGD (для связи с BDM), а линия PTA5 — функцию внешнего сброса Reset. Для остальных моделей МК, которые располагаются в корпусах с большим числом выводов, линия PTA4 может работать только на вывод (если не выполняет функцию BKGD), а линия PTA5 — только на ввод (если не выполняет функцию Reset).

Если линии порта сконфигурированы на вывод, то их состоянием можно управлять с помощью регистра данных порта PTxD (x — латинская буква, вместо которой может быть подставлена любая буква, так что образуется полное имя порта, например PTAD, PTBD).

Так, для включения светодиода LD1 на демонстрационной плате Spyder08, необходимо установить нулевой бит порта PTAD в 1. Это можно сделать, например, операцией маскирования с помощью логических выражений:

Бит:76543210
Маска:00000001
hex:01

PTAD = PTAD | 0x01;    // Установить бит 0 порта PTA в 1 (установить PTA0)

Или:

PTAD = PTAD | BIT_0;   // Установить бит 0 порта PTA (установить PTA0)

Обычно используются сокращенные формы записи подобных операций:

PTAD |=BIT_0;  // Вместо PTAD = PTAD | BIT_0

Ниже показан результат выполнения этой операции. Предположим, что изначально значение порта PTAD было равно 0x30, или 00110000 в двоичной системе:

Бит:76543210
Состояние порта:00110000
Маска:00000001
Результат:00110001← Только бит 0 изменился!

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

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

PTAD_PTAD0 = 1;       // Установить бит PTAD0

Для обнуления состояния бита следует использовать другую логическую операцию — операцию И:

PTAD = PTAD & 0xFE;

Бит:76543210
Маска:11111110
hex:FE

Или:

PTAD = PTAD & ~0x01;  // Запись с использованием той же маски, что и для установки 
                     // бита 0
                     // Предварительно маска инвертируется

Или:

PTAD = PTAD |~BIT_0;

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

Ниже показан результат выполнения данной операции. Предположим, что значение порта PTAD до операции было равно 0x0F, или 00001111 в двоичной системе счисления:

Бит:76543210
Состояние порта:00001111
Маска:11111110
Результат:00001110← Только бит 0 изменился!

Обратите внимание на то, что после выполнения операции изменился только бит 0, все остальные биты не изменили свое состояние.

Применяя специальные обозначения из файла derivative.h, рассматриваемое действие можно записать следующим образом:

PTAD_PTADO = 0;       // Сбросить бит 0 порта PTA

Еще один пример программы «мигающий светодиод» для демонстрационной платы Spyder08:

Пример 6.1. Мигающий светодиод

// Демонстрационная плата Spyder08, мигающий светодиод
#include         /* Файл, позволяющий включить прерывания */
#include "derivative.h"   /* Файл с объявлениями регистров периферии */
#include "hcs08.h"        // Это наш файл с объявлениями!
void main(void) 
{
 unsigned int temp;
 SOPT1 = bBKGDPE;   /* Инициализация регистра SOPT1, разрешение линии BKGD для 
                    отладки*/
 PTADD = BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0; 
                              // Настройка линий с 0-й по 4-ю на вывод
 while (1)
 {
   PTAD |= BIT_0;                   // Светодиод включить
   for (temp=10000; temp; temp--);   // Программная задержка
   PTAD &= ~BIT_0;                   // Светодиод выключить
   for (temp=10000; temp; temp--);   // Программная задержка
 }
}

Для изменения состояний портов С и Е в МК серии QE можно использовать регистры SET/RESET/TOGGLE. Однако надо иметь в виду, что для изменения состояния только одной линии порта использование этих регистров не эффективно, поскольку регистры данных порта PTxD находятся на странице прямого доступа памяти, и изменение их состояния производится с помощью команд битового процессора BSET и BCLR.

Тем не менее, для изменения состояния сразу нескольких линий портов предпочтительнее использовать регистры SET/RESET/TOGGLE.

Предположим, что нам необходимо установить состояние линий PTC7 и PTC0 в 1. Используя стандартный способ изменения данных, мы бы написали:

PTCD  |= 0x81;  // Установить бит 7 и бит 0 порта PTC 
                          // (остальные линии не изменять)

При использовании специальных обозначений из файла hcs08.h:

PTCD  |= BIT_7 | BIT_0;    // Установить бит 7 и бит 0 порта PTC 
                          // (остальные линии не изменять)

Для МК серии QE та же операция может быть выполнена с помощью регистра PTCSET:

PTCSET = BIT_7 | BIT_0;   // Установить бит 7 и бит 0 порта PTC 
                          // (остальные линии не изменять)

Хотя приведенные записи программного кода очень похожи, следует понимать, что в первом случае будет выполнена последовательность команд ассемблера, реализующая сначала чтение регистра данных порта в аккумулятор, затем побитовое логическое ИЛИ с маской, затем запись нового значения в регистр PTCD. Вторая запись будет преобразована в иную последовательность команд ассемблера, и установка соответствующих битов будет выполнена на аппаратном уровне, Все операции с использованием регистров типа SET, CLEAR и TOGGLE выполняются аппаратными средствами, логические операции программа не выполняет!

Рассмотрим еще один похожий пример, но с использованием регистра типа TOGGLE. Для изменения состояния линии на противоположное принято использовать операцию побитового Исключающего ИЛИ. В следующем примере показано, как инвертировать состояние линий PTC0 и PTC7. Обратите внимание, что мы используем ту же маску, что и в операции логического ИЛИ:

PTCD = PTCD ^ 0x81;       // Установить биты 0 и 7 порта PTC, 
                        // состояния всех остальных битов не изменяются

После компиляции этой строки генерируется следующий ассемблерный код:

LDA PTCD      /* Загрузить содержимое порта PTCD в аккумулятор А 
              (3 периода BUSCLK) */
EOR #0x81     /* Установить значение 7-го и 0-го битов аккумулятора А
              (2 периода BUSCLK) */
STA PTCD      /* Записать содержимое аккумулятора А на порт PTCD
               (3 периода BUSCLK) */

Это стандартная операция чтения/модификации/записи: сначала данные записываются в аккумулятор АСС, затем изменяются, а результат записывается в регистр-источник. Общее время выполнения операции составляет 8 периодов частоты BUSCLK или 400 нс при частоте 20 МГц. Если использовать регистр TOGGLE, та же операция будет выполняться следующей образом:

PTCTOG = 0x81;

Cгенерированный код ассемблера в данном случае:

LDA #0x81   // Загрузить в аккумулятора А маску операции (2 периода BUSCLK)
STA PTCTOG  // Записать аккумулятор А в регистр PTCTOG   (4 периода BUSCLK)

Видно, что время выполнения операции уменьшилось с 8 тактов до 6 и стало равным 300 нс при частоте шины 20 МГц. Регистр PTCTOG находится в странице памяти прямого доступа, чтобы время обращения к нему было минимальным.

6.1.1.2. Режим ввода

Для настройки линии порта на ввод необходимо сбросить в 0 соответствующий бит регистра направления передачи порта PTxDD. После этого, прочитав регистр данных порта PTxD, можно узнать состояние всех линий порта. Если линия настроена на вывод, то будет прочитано последнее записанное в соответствующем бите регистра данных значение. Для линий, настроенных на ввод, будет прочитано текущее состояние соответствующего вывода МК.

Если МК по напряжению питания принадлежит к группе VDD = 3.0...5.0 В, то логической 1 соответствует напряжение, превышающее 0.7×VDD, а логическому 0 — напряжение не свыше 0.35×VDD. Для МК с напряжением питания 1.8...3.3 В логической 1 соответствует напряжение, превышающее 0.7×VDD, если напряжение питания VDD находится в диапазоне от 2.3 до 3.3 В, и 0.85×VDD, если напряжение питания VDD составляет 1.8...2.3 В. Напряжение логического 0 для этой группы МК не должно превышать 0.35×VDD, если VDD = 2.3...3.3 В, и 0.3×VDD, если VDD = 1.8...2.3 В.

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

pin_state = PTAD | 0x04;

Или:

pin_state = PTAD | BIT_2;

Или:

pin_state = PTAD_PTAD2;

Типичная схема подключения переключателя или кнопки к порту МК показана на Рис. 6.1а. Пока ключ разомкнут, потенциал логической 1 обеспечивает резистор R1. Если ключ замкнут, то напряжение на выводе МК становится равным потенциалу общего вывода, что соответствует логическому 0 при чтении порта. Во время переключения ключа на линии будет генерироваться дребезг. Конденсатор C1 уменьшает шумы дребезга при переключении.

Внешний резистор R1 в МК HCS08 можно заменить внутренним подтягивающим резистором. Также можно применить программную защиту от дребезга, что позволяет не подключать внешний конденсатор C1. Схемное решение упрощается (Рис. 6.1б).

Рис. 6.1. Типичные схемы подключения переключателя или кнопки к линии порта МК: а — без использования внутреннего подтягивающего резистора; б — с использованием подтягивающего резистора и с программной защитой от дребезга.

В соответствии с техническим описанием МК семейства HCS08 внутренние подтягивающие резисторы обладают сопротивлением от 17.5 кОм до 52.5 кОм!

Для подключения внутреннего подтягивающего резистора следует записать 1 в соответствующий бит регистра PTxPE. Например, для подключения подтягивающего резистора линии PTA2, необходимо записать:

PTAPE = 0x04; // Подключение подтягивающего резистора PTA2

Или:

PTAPE = BIT_2;

Применим полученные знания о линиях ввода/вывода, изменив программу мигающего диода. Превратим его в управляемый мигающий диод. На Рис. 6.2 показана упрощенная схема подключения периферийных компонентов к МК, для которой справедлив программный код Примера 6.2.

Рис. 6.2. Упрощенная схема для демонстрационной платы DEMO9S08QG8.

Пример 6.2. Управляемый мигающий светодиод для DEMO9S08QG8

// Демонстрационная плата DEMO9S08QG8, управляемый мигающий светодиод
#include               /* for EnableInterrupts macro */
#include "derivative.h"         /* include peripheral declarations */
// Две строки выше генерируются средой CodeWarrior автоматически, перевод 
// комментариев к ним смотрите в Примере 6.1
#include "hcs08.h"              // Это наш файл с объявлениями!
void main(void) 
{
 unsigned int temp;
 unsigned char blinking=0;  // Переменная для управления режимом светодиода
 SOPT1 = bBKGDPE; // Настройка регистра SOPT1
 PTADD = 0;       // Настройка всех линий порта PTA на ввод
 PTBDD = 0xFE;    // PTB0 на ввод, а остальные линии порта PTB — на вывод
 PTBD = 0xC0;     // Выключить светодиоды и записать нулевые значения на
                  // вывод PTB
 PTAPE = BIT_2;   // Включение подтягивающего резистора PTA2
 while (1)
 {
   if (blinking)
   {
     PTBD_PTBD6 = 0;                   // Включить светодиод
     for (temp=3000; temp; temp--);    // Программная задержка
     PTBD_PTBD6 = 1;                   // Выключить светодиод
     for (temp=30000; temp; temp--);   // Программная задержка
   }
   if (!PTAD_PTAD2)  // Если кнопка SWI1 нажата,
   {
     // подождать, пока она будет отключена
     while (!PTAD_PTAD2) for (temp=100; temp; temp--);
     blinking = !blinking;   // Изменить состояние переменной режима светодиода
   }
 }
}

Кнопки и переключатели часто используются в качестве источника внешнего прерывания микроконтроллера. Более подробно этот вопрос будет рассмотрен в разделе 6.2.

 

 

 Электронные компоненты Freescale >>>
 Подробнее о компании Freescale >>>

Написать вебмастеру 3/67(+9)/9(+1)/4189//170 1998-2014 СИММЕТРОН


English
 




Приглашаем в новый раздел Wi-Fi модули и чипсеты Redpine Signals


Приглашаем в новый раздел Технологические материалы Electrolube (UK)



Обновлен раздел Наборы инструментов Pro'sKit


Приглашаем в новый раздел соединителей Hirose


На сайте компании Omron открылся раздел "Симметрона". Это англоязычный каталог, где представлен весь ассортимент продукции Omron, доступный через нас в России.

Wurth выпустил рекомендации по защите устройств с интерфейсом USB 2.0 на русском языке. Поддерживается складская программа.





У производителя специализированных компонентов и подсистем E2V открылся русскоязычный сайт.

На сайте Infineon размещена книга Полупроводниковая электроника на русском языке.