В данном параграфе мы рассмотрим пример преобразования исходного файла с программой на Си компилятором ICC12 к файлу с исполняемым кодом. Этот процесс был описан в разделе 3.13.1. Следует заметить, что данный пример демонстрирует отнюдь не все особенности механизма действия компилятора. Для получения более полных сведений следует обратиться к техническому описанию компилятора. Мы же постараемся сконцентрировать внимание читателя на ключевых моментах преобразования кодов. Эти знания необходимы Вам для того, чтобы начать работу с 68HC12, программируя их на Си.
В представленном примере прикладная программа управляет светодиодами, подключенными к выходам порта PORTA микроконтроллера 68HC12B32. Периодически, по первому сигналу переполнения таймера светодиоды зажигаются, а последующему сигналу переполнения таймера эти светодиоды гасятся. Аппаратные средства, используемые для отладки этой задачи, представлены на рис. 3.11.
Рис. 3.11. Схема подключения светодиодов к микроконтроллеру 68HC912B32
/************************************************************/
/* Название: Sample.c */
/* Описание: Эта программа производит включение */
/* и выключение светодиодов с интервалом */
/* времени 1 с. Используется МК 68НС12ВЗ2 */
/* Файл заголовка header содержит адреса всех */
/* портов и регистров специальных функций */
/* Контроллер должен быть сконфигурирован */
/* для работы в однокристальном режиме */
/* Дата создания: May 15, 2004 */
/* Авторы: Daniel Pack and Steve Barrett */
/************************************************************/
1 #include <68НС12ВЗ2.h>
2 /*****************************************************/
3 void TOIISR(void);
4 /*****************************************************/
5 #pragma interrupt_handler TOIISR() /* Объявление подпрограммы
6 прерывания по переполнению таймера*/
7 #pragma abs_address:0x0B1E /*задать адрес подпрограммы прерывания ISR */
8 void (* Timer_Overflow_interrupt_vector[])()={TOIISR}
9 #pragma end_abs_address
10 unsigned char second = 0x00;
11 void main (void)
12 {
13 TSCR=0x80; /*включить таймер*/
14 TMSK2=0x80; /*разрешить прерывания по таймеру*/
15 TFLG2=0x80; /*очистить флаг TOIF*/
16 DDRA=0xFF; /* настроить порт Port A на вывод*/
17 CLI(); /*разрешить прерывания*/
19 EXIT()
20 }
21
22 void TOIISR(void) /*подпрограмма прерывания*/
23 {
24 TFLG2=0x80; /*очистить флаг TOIF*/
25 second += 1; /*увеличить на 1 программный счетчик с именем second*/
26 if (second == 122)
27 {
28 PORTA = !PORTA; /*инвертировать порт PORT A*/
29 second = 0x00; /*обнулить программный счетчик*/
30 }
31 }
Обратите внимание! Каждая программа должна обязательно иметь заголовок, в котором прописаны: название программы, краткое описание реализуемого алгоритма, авторы и дата создания программы. Файл заголовка 68HC12B32.h содержит определения регистров специальных функций МК B32 и макроопределения для препроцессора компилятора. Номера строк в приведенном тексте программы при вводе исходного текста в редакторе интегрированной среды ICC12 не должны присутствовать. Это наше дополнение для удобства восприятия материала.
Разберем назначение отдельных элементов программы. В первой строке записана директива препроцессора компилятора #include, которая предписывает присоединить к программе заголовочный файл с именем 68НС12ВЗ2.h. Содержимое этого файла мы рассмотрим ниже. Строка 3 содержит объявление функции TOIISR как подпрограммы прерывания по переполнению таймера. Строки с пятой по девятую содержат директивы, которые назначают ячейку памяти с адресом 0x0B1E для размещения в ней адреса начала подпрограммы прерывания TOIISR. В строке 10 осуществляется определение и инициализация глобальной переменной с именем second, которая будет использоваться в качестве программного счетчика. Строки с одиннадцатой по двадцатую содержат текст основной программы, в которой происходит инициализация подсистемы таймера. Таймер запускается на счет, разрешаются прерывания по его переполнению. Обратите внимание, в строке 17 вызывается макрос разрешения прерывания, который был определен в заголовочном файле. Строка 18 содержит конструкцию бесконечного цикла, который обеспечивает выполнение пустых команд микроконтроллером, пока не поступит запрос на прерывание от таймера. В строке 19 записан макрос программного прерывания EXIT(), который также определен в заголовочной файле. В строке 22 начинается подпрограмма прерывания по таймеру. В ней сбрасывается флаг переполнения таймера (строка 24), а затем инкрементируется программный счетчик second (строка 25). Заметим, что период счета 16 разрядного счетчика таймера микроконтроллера 68HC12 при частоте шины 8 МГц составляет 8,19 мс. Поэтому для отсчета 1 с требуется 122 периода переполнения этого таймера. В строке 26 записана конструкция условия if. Выражения строк 28 и 29 будут исполняться, только если счетчик second достиг значения 122. Тогда код на линиях PORTA будет инвертирован, а содержимое программного счетчика обнулено.
Обратимся теперь к разъяснению содержимого заголовочного файла. Мы не будем приводить его текст целиком, а приведем лишь те строки, которые необходимы для рассматриваемой в основном примере программы:
1 #define _IO_BASE 0
2 #define _P(off) *(unsigned char volatile*) (_IO_BASE + off)
3 #define TSCR _Р(0х86)
4 #define TMSK2 _Р(0х8D)
5 #define TFLG2 _P(0x8F)
6 #define DDRA _Р(0х02)
7 #define PORTA _Р(0х00)
8 #define CLI() asm("cli\n")
9 #define EXIT() asm("swi\n")
Две первые строки приведенного фрагмента заголовочного файла используются для определения макроса _P с аргументом off. Обратите внимание на символ указателя в макросе. Все следующие выражения в строках с 3 по 7 определяют численные значения для символьных обозначений регистров специальных функций МК. Эти численные значения — адреса регистров в соответствии с картой памяти МК. Любое упоминание имен регистров в тексте программы связано с выполнением операций чтения или записи в эти регистры по их физическим адресам. Этим объясняется необходимость применения указателя в определении макроса _P(off). Две последние строки 8 и 9 являются примерами определения макросов.
Вернемся к примеру управления светодиодами. После обработки программой компилятора исходного текста программы Sample.c будет получен следующий текст программы на языке ассемблера.
1 .module interrupt.c
2 .area memory(abs)
3 .org 0xb1e
4 _Timer_Overflow_interrupt_vector::
5 .word _TOIISR
6 .area data
7 _second::
8 .blkb 1
9 .area idata
10 .byte 0
11 .area data
12 .area text _main::
14 ; void TOIISR(void);
15 ; #pragma interrupt_handler TOIISR() ;
16 ; #pragma abs_address:0x0B1E
17 ; void (*Timer_Overflow_interrupt_vector[]) ()={TOIISR};
18 ; #pragma end_abs_address ;
19 ; unsigned char second=0x00;
20 ;
21 ;void main(void)
22 ;{
23 ; TSCR=0x80;
24 ldab #128
25 stab 0х86
26 ; ТМSК2=0х80;
27 ldab #128
28 stab 0x8d
29 ; TFLG2=0x80;
30 ldab #128
31 stab 0x8f
32 ; DDRA=0xFF;
Оглавление
-
ПРЕДИСЛОВИЕ
-
Структура книги
-
Учебные системы
-
Целевая аудитория
-
Благодарности
-
Глава 1 ПЕРВОЕ ЗНАКОМСТВО СО ВСТРАИВАЕМЫМИ СИСТЕМАМИ
-
1.1. Что такое встраиваемая система?
-
1.2. Особенности встраиваемых систем
-
1.2.1. Работа в реальном времени
-
1.2.2. Миниатюризация размеров и процесс тестирования
-
1.2.3. Минимизация энергии потребления
-
1.2.4. Интерфейс пользователя и интерфейс сопряжения с объектом
-
1.2.5. Многозадачность
-
1.2.6. Минимизация стоимости
-
1.2.7. Ограничение объема памяти
-
1.2.8. Программно–аппаратный дуализм
-
1.3. Введение в микроконтроллеры семейства 68HC12 и HCS12
-
1.4 Микроконтроллеры HCS12
-
1.4.1. Семейство HCS12
-
1.4.2. Обозначения МК
-
1.4.3. Модельный ряд HCS12
-
1.5. Заключение по главе 1
-
1.6. Вопросы и задания
-
Глава 2 ПРОГРАММИРОВАНИЕ ВСТРАИВАЕМЫХ СИСТЕМ И СТРУКТУРНОЕ ПРОЕКТИРОВАНИЕ
-
2.1. Почему мы программируем микроконтроллеры на Си?
-
2.2. Преимущества программирования на языке ассемблер
-
2.3. Преимущества языков высокого уровня
-
2.3.1. Выбираем язык высокого уровня для программирования встраиваемых систем
-
2.3.2. Краткая история языка Си
-
2.4. Оптимальная стратегия — программирование на Си и на ассемблере
-
2.5. Структурное проектирование
-
2.5.1. Основные положения метода структурного проектирования
-
2.5.2. Документирование программ
-
2.5.3. Как язык Си соотносится со структурным проектированием
-
2.6. Рабочие тетради
-
2.6.1. Порядок ведения записей
-
2.6.2. Содержание записей
-
2.7. Блок схемы алгоритмов
-
2.8. Пример применения
-
2.9. Заключение по главе 2
-
2.10 Что ещ е почитать?
-
2.11 Вопросы и задания
-
Глава 3 ОСНОВЫ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ НА СИ
-
3.1. Введение в программирование на Си
-
3.1.1. Глобальные и локальные переменные
-
3.2. Типы данных в Си
-
3.3. Операторы языка Си
-
3.4. Функции
-
3.4.1. Что такое функция?
-
3.4.2. Основная программа
-
3.4.3. Прототипы функций
-
3.4.4. Описание функций
-
3.4.5. Вызов функций, передача параметров, возврат полученных значений
-
3.5. Файлы заголовков
-
3.6. Директивы компилятора
-
3.6.1. Директивы условной компиляции
-
3.7. Конструкции программирования
-
3.8. Операторы для организации программных циклов
-
3.8.1. Оператор FOR
-
3.8.2. Оператор WHILE
-
3.8.3. Оператор DO-WHILE
-
3.9. Операторы принятия решения
-
3.9.1. Оператор IF
-
3.9.2. Оператор IF-ELSE
-
3.9.3. Оператор IF-ELSE IF-ELSE
-
3.9.4. Оператор SWITCH
-
3.10. Массивы
-
3.11. Указатели
-
3.12. Структуры
-
3.13. Процесс программирования и отладки микропроцессорной системы
-
3.13.1. Технология создания программного кода
-
3.13.2. Режим отладки BDM
-
3.13.3. Аппаратные и программные средства отладчика P & E от компании PEMICRO
-
3.13.4. Эмуляторы
-
3.13.5. Логические анализаторы
-
3.14. Особенности компилятора и ассемблера
-
***
-
3.15. Заключение по главе 3
-
3.16. Что еще почитать?
-
3.17. Вопросы и задания
-
Глава 4 МИКРОКОНТРОЛЛЕРЫ 68HC12 И HCS12: АРХИТЕКТУРА И ПРОГРАММИРОВАНИЕ
-
4.1. Аппаратные средства микроконтроллеров семейства 68HC12
-
***
-
4.2. Аппаратные средства МК семейства HCS12
-
4.3. Режимы работы МК семейства 68HC12/HCS12
-
4.3.1. Рабочие режимы
-
4.3.2. Режимы работы отладочной платы M68EVB912B32
-
4.4. Назначение выводов МК
-
4.5. Регистры специальных функций МК
-
4.5.1. Виртуальный адрес блока регистров
-
4.6. Порты ввода/вывода
-
4.6.1. Спецификация портов ввода/вывода
-
4.7. Подсистема памяти МК B32
-
4.7.1. Карта памяти МК B32
-
4.7.2. Изменение адресов в карте памяти МК
-
4.8. Подсистема памяти МК DP256
-
4.9. Состояния сброса и прерывания МК
-
4.9.1. Реакция МК на внешние события
-
4.10. Состояния сброса и прерывания в МК 68HC12
-
4.10.1. Состояние сброса МК
-
4.10.2. Прерывания
-
4.10.3. Вектора исключений
-
4.10.4. Система приоритетов для исключений
-
4.10.5. Регистры подсистемы прерывания
-
4.11. Процесс перехода к подпрограмме прерывания
-
4.12. Оформление подпрограммы прерывания на Си
-
4.13. Система тактирования
-
4.13.1.Система тактирования отладочной платы MC68HC912B32EVB
-
4.14. Подсистема реального времени — модуль таймера
-
4.14.1. Структура модуля таймера
-
4.14.2. Счетчик временной базы
-
4.14.3. Регистры для управления счетчиком временной базы
-
4.14.4. Каналы захвата/сравнения
-
4.14.5. Счетчик событий
-
4.15. Модуль меток реального времени
-
4.16. Модуль таймера ECT в составе МК МC68HC12BE32 и HCS12
-
4.16.1. Небуферированные каналы входного захвата
-
4.16.2. Буферированные каналы входного захвата
-
4.16.3. Особенности счетчиков событий
-
4.16.4. Регистры управления модуля EST
-
4.17. Обмен информацией в последовательном коде: многофункциональный последовательный интерфейс
-
4.17.1. Термины последовательного обмена
-
4.18. Контроллер асинхронного обмена SCI
-
4.18.1. Передатчик контроллера SCI
-
4.18.2. Приемник контроллера SCI
-
4.18.3. Регистры контроллера SCI
-
4.18.4. Алгоритмы программного об служивания контроллера SCI
-
4.18.5. Пример программирования контроллера SCI
-
4.19. Синхронный последовательный интерфейс SPI
-
4.19.1 Концепция интерфейса SPIФункциональная схема обмена между двумя контроллерами SPI
-
4.19.2. Алгоритмы работы контроллера SPI
-
4.19.3. Регистры контроллера SPI
-
4.19.4. Алгоритмы программного обслуживания контроллера SPI
-
4.19.5 Периферийные ИС с интерфейсом SPI
-
4.20. Введение в теорию аналого-цифрового преобразования
-
4.20.1. Частота дискретизации сигнала
-
4.20.2. Представление аналоговой величины в цифровом коде
-
4.20.3.Квантование по уровню и разрешающая способность
-
4.20.4 Скорость потока данных оцифровки
-
4.21. Принцип действия АЦП
-
4.21.1. АЦП последовательного приближения
-
4.22. Подсистема аналого-цифрового преобразования МК 68HC12
-
4.22.1 Структура и порядок функционирования
-
4.22.2. Регистры управления модуля ATD
-
4.22.3. Пример программирования модуля ATD
-
4.22.4. Обслуживание прерываний от модуля ATD
-
4.23. Особенности модуля ATD в составе МК семейства HCS12
-
4.23.1. Выбор разрядности АЦП
-
4.23.2. Представление результата измерения
-
4.23.3. Запуск измерительной последовательности от внешнего сигнала
-
4.23.4. Программируемое число преобразований в измерительной последовательности
-
4.23.5. Увеличение числа аналоговых входов
-
4.23.6. Регистры модуля ATD HCS12
-
4.24. Подсистема широтно-импульсной модуляции
-
4.24.1. Структура модуля PWM
-
4.24.2. Режимы центрированной и фронтовой ШИМ
-
4.24.3. Система тактирования
-
4.24.4. Регистры модуля PWM
-
4.24.5. Примеры программирования модуля PWM
-
4.25. Ограничение энергии потребления
-
4.25.1. Как остановить МК 68HC12
-
4.25.2. Как вывести МК 68HC12 из состояния пониженного энергопотребления
-
4.26. Советы по использованию платы отладки MC68EVB912B32
-
4.27. Заключение по главе 4
-
4.28. Что еще почитать?
-
4.29. Вопросы и задания
-
Глава 5 ОСНОВЫ СОПРЯЖЕНИЯ МК С УСТРОЙСТВАМИ ВВОДА/ВЫВОДА
-
5.1. Электрические характеристики МК 68HC12
-
5.1.1. Нагрузочные характеристики
-
5.1.2. Что произойдет, если Вы должным образом не учтете электрические характеристики периферийных ИС?
-
5.1.3. Входные и выходные характеристики логических элементов
-
5.2. Устройства дискретного ввода: кнопки, переключатели, клавиатуры
-
5.2.1. Кнопки и переключатели
-
5.2.2. DIP переключатели
-
5.2.3. Клавиатуры
-
5.3. Устройства индикации: светодиоды, семисегментные индикаторы, индикаторы логического выхода с тремя состояниями
-
5.3.1. Светодиоды
-
5.3.2. Семисегментные индикаторы
-
5.3.3. Индикаторы для логического выхода с тремя состояниями
-
5.4. Программное обслуживание дискретных входов и выходов
-
5.5. Подавление механического дребезга контактов переключателей
-
5.5.1. Аппаратная защита от механического дребезга контактов
-
5.5.2. Программная защита от механического дребезга контактов
-
5.5.3. Пример программной защиты
-
5.6. Жидкокристаллические индикаторы
-
5.6.1. Краткие сведения о жидкокристаллических индикаторах
-
5.6.2. Сопряжение МК с символьным ЖК индикатором
-
5.6.3 Сопряжение МК с графическим ЖК дисплеем
-
5.7. Управление электрическим двигателем
-
5.7.1. Силовые полупроводниковые ключи
-
5.7.2. Оптоэлектронная потенциальная развязка
-
5.7.3. Инвертор напряжения
-
5.8. Кодовый замок
-
5.8.1. Схема подключения периферийных устройств
-
5.8.2. Программа управления
-
5.9. Интерфейс МК с аналоговыми датчиками
-
5.10. Интерфейс RS-232
-
5.11. Заключение по главе 5
-
5.12. Что еще почитать?
-
5.13. Вопросы и задания
-
Глава 6 ДОБРО ПОЖАЛОВАТЬ В РЕАЛЬНЫЙ МИР!
-
6.1. Ужасные истории об ошибках проектирования
-
6.1.1. Случай квадратичного генератора
-
6.1.2. Случай таймера для лазерного излучения
-
6.2. Правила обращения с микросхемой 68НС12 и рекомендации по проектированию
-
6.2.1. Рекомендации по обращению со CMOS
-
6.2.2. Рекомендации по проектированию на CMOS
-
6.3. Исследование помех
-
6.3.1. Что такое помехи
-
6.3.2. Электромагнитная совместимость
-
6.3.3. Спецификации системы помех — не будем крепки задним умом!
-
6.3.4. Методы снижения помех
-
6.4. Защитное программирование
-
6.5. Методики испытаний на наличие помех
-
6.5.1. Обнаружение помех
-
6.5.2. Испытание на чувствительность к помехам
-
6.5.3. Испытания на электромагнитную совместимость
-
6.6. Управление энергопотреблением
-
6.6.1. Параметры потребляемой мощности для микроконтроллера 68HC12
-
6.6.2. Типы батарей
-
6.6.3. Емкость батарей
-
6.6.4. Стабилизация напряжения
-
6.6.5. Схемы супервизора для микропроцессора
-
6.6.6. Меры энергосбережения
-
6.7. Заключение по главе 6
-
6.8. Что еще прочитать?
-
6.9. Вопросы и задания
-
Глава 7 ПРИМЕРЫ ВСТРОЕННЫХ СИСТЕМ УПРАВЛЕНИЯ
-
7.1. Система привода робота, движущегося вдоль стенок лабиринта
-
7.1.1. Описание проекта
-
7.1.2. Подсистемы 68HC12, используемые в проекте
-
7.1.3. Компоненты системы
-
7.1.4. Структура программы и блок-схема алгоритма
-
7.1.5. Программный код
-
7.2. Лазерный проектор
-
7.2.1. Описание проекта
-
7.2.2. Подсистемы 68HC12 используемые в проекте
-
7.2.3. Описание некоторых компонентов системы
-
7.2.4. Аппаратные средства
-
7.2.5. Структура программы и блок-схема алгоритма
-
7.2.6. Программный код
-
7.2.7. Испытания устройства
-
7.2.8. Заключительные испытания системы управления
-
7.3. Цифровой вольтметр
-
7.3.1. Описание проекта
-
7.3.2. Системы 68HC12 используемые в проекте
-
7.3.3. Расчет интерфейса модуля ATD
-
7.3.4. Структура программы и блок-схема алгор итма
-
7.3.5. Программа управления
-
7.3.6. Измерение неэлектрических величин
-
7.4. Стабилизация скорости вращения двигателя с использованием оптического тахометра
-
7.4.1. Описание проекта
-
7.4.2. Немного теории
-
7.4.3. Анализ
-
7.4.4. Структура программы и блок-схема алгоритма
-
7.4.5. Программный код
-
7.4.6. Испытания
-
7.5. Парящий робот
-
7.5.1. Описание проекта
-
7.5.2. Системы HCS12 используемые в проекте
-
7.5.3. Теоретическое обсуждение
-
7.5.4. Структура программы и блок-схема алгоритма
-
7.5.5. Программный код
-
7.5.6. Некоторые комментарии
-
7.6. Система защиты компьютера, основанная на нечеткой логике
-
7.6.1. Описание проекта
-
7.6.2. Использование системы HCS12
-
7.6.3. Основы теории
-
7.6.4. Структура программы и блок-схема алгоритма
-
7.6.5. Описание системы
-
7.6.6. Обсуждение проекта
-
7.6.7. Программный код
-
7.6.8. Некоторые комментарии
-
7.7. Электронная версия игры в «15»
-
7.7.1. Описание проекта
-
7.7.2. Системы HCS12 используемые в проекте
-
7.7.3. Основы теории
-
7.7.4. Схемное решение, структура программы и блок-схема алгоритма
-
7.7.5. О компонентах системы
-
7.7.6. Программный код
-
7.7.7. Некоторые комментарии
-
7.8. Программирование резидентного Flash ПЗУ микроконтроллера B32 в составе платы отладки MC68HC912B32EVB
-
7.9. Заключение по главе 7
-
7.10. Что еще прочитать?
-
7.11. Вопросы и задания
-
Глава 8 ОПЕРАЦИОННЫЕ СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ
-
8.1. Рассказ: официант — «живая» операционная система реального времени
-
8.2. Что является целью ОСРВ?
-
8.3. Обзор концепций
-
8.3.1. Требования к динамическому распределению RAM
-
8.3.2. Динамическое распределение памяти
-
8.3.3. Структуры данных
-
8.4. Основные понятия
-
8.4.1. Что такое задача?
-
8.4.2. Управление задачами
-
8.4.3. Компоненты многозадачных систем
-
8.5. Типы операционных систем реального времени
-
8.5.1. Системы с циклическим опросом
-
8.5.2. Циклический опрос с прерываниями
-
8.5.3. Карусельные системы
-
8.5.4. Смешанные системы
-
8.5.5. Системы с управлением по прерыванию
-
8.5.6. Кооперативная многозадачность
-
8.5.7. Многозадачные системы с преимущественным приоритетом
-
8.6. Проблемы ОСРВ
-
8.6.1. Конкуренция
-
8.6.2. Повторная входимость
-
8.6.3. Межзадачные связи
-
8.6.4. Безопасность, проверка и безотказная работа
-
8.6.5. Главный вопрос
-
8.7. Выполнение операционной системы реального времени
-
8.8. Пример применения: ОСРВ циклического опроса
-
8.8.1. Краткий обзор проекта
-
8.8.2. Пример кода
-
8.8.3. Испытание контроллера усилителя
-
8.9. Другая прикладная программа: цикл опроса с прерываниями
-
8.10. Сложное прикладное устройство: имитатор ОСРВ
-
8.10.1. Краткий обзор проекта
-
8.10.2. Типовой код
-
8.11.Заключение по главе 8
-
8.12. Что еще почитать?
-
8.13. Вопросы и задания
-
Глава 9 РАСПРЕДЕЛЕННЫЕ СЕТИ С ИНТЕРФЕЙСОМ msCAN
-
9.1. Компьютерные сети
-
9.2. Промышленные сети
-
9.3. Сети с протоколом CAN
-
9.3.1. Протокол CAN
-
9.3.2. Модуль контроллера последовательного обмена msCAN12
-
9.3.3. Проблемы синхронизации
-
9.3.4. Конфигурирование модуля msCAN12 для работы в сети
-
9.4. Различия между контроллерами msCAN в составе 68HC12 и HCS12
-
9.5. Пример программирования контроллера msCAN Схема включения аппаратных средств для двух отладочных плат Axiom
-
9.6. Контроллер последовательного обмена BDLC
-
9.7. Заключение по главе 9
-
9.8. Что еще почитать?
-
9.9. Вопросы и задания
-
Примечания