- •Встраиваемые системы Проектирование приложений на микроконтроллерах семейства 68hc12/hcs12 с применением языка с с. Ф. Баррет
- •Предисловие
- •Структура книги
- •Учебные системы
- •Целевая аудитория
- •Благодарности
- •Глава 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. Прерывания
- •Немаскируемые прерывания
- •Маскируемые прерывания
- •Вопросы для самопроверки
- •3. Каково различие между прерываниями по входам
- •4. Как организовать подсистему прерывания с несколькими внешними запросами для мк семейства 68hc12/hcs12, используя лишь один вход внешнего прерывания
- •4.10.3. Вектора исключений
- •4.10.4. Система приоритетов для исключений
- •1. Внешний сброс по входу
- •5. Немаскируемое прерывание по входу
- •Вопросы для самопроверки
- •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. Регистры для управления счетчиком временной базы
- •Регистр управления модулем таймера
- •Регистр счетчика временной базы
- •Регистр масок таймера 2
- •4.14.4. Каналы захвата/сравнения
- •Режим входного захвата
- •Вопросы для самопроверки
- •Режим выходного сравнения
- •Канал 7 в режиме выходного сравнения
- •Регистры для управления каналами захвата/сравнения
- •Регистры управления таймером 3 и 4
- •Регистр масок таймера 1
- •Регистр масок таймера 2
- •Регистр флагов таймера 1
- •Регистр флагов таймера 2
- •Регистры данных каналов захвата/сравнения
- •Вопросы для самопроверки
- •Примеры работы с таймером
- •Измерение частоты и периода логического сигнала
- •Генерация импульсной последовательности
- •Генерация импульсной последовательности с использованием прерывания
- •4.14.5. Счетчик событий
- •Режимы работы счетчика
- •Регистры управления счетчиком событий
- •Регистр управления счетчиком событий
- •Регистр флагов счетчика событий
- •Регистр текущего состояния счетчика событий
- •Пример использования счетчика событий
- •4.15. Модуль меток реального времени
- •Пример использования модуля меток реального времени
- •4.16. Модуль таймера ect в составе мк мc68hc12be32 и hcs12
- •4.16.1. Небуферированные каналы входного захвата
- •4.16.2. Буферированные каналы входного захвата
- •4.16.3. Особенности счетчиков событий
- •4.16.4. Регистры управления модуля est
- •Регистр управления порядком перезаписи
- •Регистр управления режимом входного захвата
- •Регистр управления счетчиком задержки
- •Регистр управления 16-разрядным вычитающим счетчиком
- •Регистр коэффициента счета вычитающего счетчика
- •Регистр флагов вычитающего счетчика
- •4.17. Обмен информацией в последовательном коде: многофункциональный последовательный интерфейс
- •4.17.1. Термины последовательного обмена
- •Вопросы для самопроверки
- •4.18. Контроллер асинхронного обмена sci
- •Вопросы для самопроверки
- •4.18.1. Передатчик контроллера sci
- •4.18.2. Приемник контроллера sci
- •4.18.3. Регистры контроллера sci
- •Регистры скорости обмена sCxBdh и sCxBdl
- •Регистры управления sCxCr1 и sCxCr2
- •Регистры состояния sCxSr1 и sCxSr2
- •Регистры данных sCxDrh и sCxDrl
- •Вопросы для самопроверки
- •4.18.4. Алгоритмы программного обслуживания контроллера sci
- •4.18.5. Пример программирования контроллера sci
- •4.19. Синхронный последовательный интерфейс spi
- •4.19.1 Концепция интерфейса spiФункциональная схема обмена между двумя контроллерами spi
- •4.19.2. Алгоритмы работы контроллера spi
- •Вопросы для самопроверки
- •4.19.3. Регистры контроллера spi
- •Регистр скорости обмена sPxBr
- •Регистры управления sPxCr1 и sPxCr2
- •Регистр данных spCxDr
- •Регистр данных порта s
- •Регистр направления передачи порта s
- •Вопросы для самопроверки
- •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
- •Группа регистров управления
- •Регистры управления atdctl0 и atdctl1
- •Регистр управления atdctl2
- •Регистр управления atdctl3
- •Регистр управления atdctl4Формат регистра atdctl4
- •Регистр управления atdctl5
- •Вопросы для самопроверки
- •Регистр состояния atdstat
- •Регистр данных порта portad
- •Регистры результата adr0h…adr7h
- •Вопросы для самопроверки
- •Тестовый регистр atdtest
- •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
- •Регистр состояния atdstat0
- •Регистр состояния atdstat1
- •Регистр разрешения цифрового входа порта atddien
- •4.24. Подсистема широтно-импульсной модуляции
- •4.24.1. Структура модуля pwm
- •4.24.2. Режимы центрированной и фронтовой шим
- •4.24.3. Система тактирования
- •4.24.4. Регистры модуля pwm
- •Регистр конфигурации pwclk
- •Регистр конфигурации pwpol
- •Регистр разрешения работы каналов pwen
- •Регистр дополнительного делителя pwpres
- •Регистры делителей pwscnt0/pwscnt1 и pwscal0/pwscal0
- •Регистры счетчика каналов pwcnTx
- •Регистры периода каналов pwpeRx
- •Регистры коэффициента заполнения каналов pwdtYxФормат регистров коэффициента заполнения pwdtYx
- •Регистры коэффициента заполнения каналов pwdtYx
- •Регистр управления pwctl
- •Регистр специальных режимов pwtst
- •Регистры работы с портом p
- •4.24.5. Примеры программирования модуля pwm
- •Инициализация модуля pwm, пример 1
- •Инициализация модуля pwm, пример 2
- •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
- •Подсистема прерывания контроллера 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. Вопросы и задания Основные
- •Более сложные
- •Исследовательские
7.6.6. Обсуждение проекта
В последнее время среди различных систем обнаружения вторжения наибольший интерес проявляется к системе обнаружения атак на туннелирование HTTP. Основной причиной такого внимания служит широкое распространение трафика HTTP в Internet. Большинство брандмейстеров не выполняет обширных проверок, чтобы проверить все атаки на туннелирование HTTP. Такие проверки весьма трудоемки, поскольку трафик HTTP составляет наибольшую часть приходящего и уходящего трафика для любой большой организации.
Микроконтроллерная система может взять на себя часть функций системы обнаружения вторжения, связанных с атаками на туннелирование HTTP. Система использует свойства сессии, чтобы проверить данные трафика Internet, которые составляют сессию Internet — программные связи между двумя компьютерами для передачи данных. Хорошим примером сессии является набор адреса сети в браузере. Ваш компьютер запрашивает сессию у ведущего компьютера, который содержит страницу сети, которая вам необходима. Как только вы закрываете веб-сайт и переходите к другому сайту, вы закрываете одну сессию и запускаете другую.
7.6.7. Программный код
//********************************************************************
// Файл: micro.с
// Функция программы: Устанавливает шесть IDS оценок членства и создает
// оценку опасности вторжения
// Авторы: Даниэль Пак, Барри Муллинз, Стив Барретт
// Дата создания: 17 июня 2004
// Установки: Program=0x1000, Data=0x3000, Stack=0x4000
//********************************************************************
#include <stdio.h>
#include "hcs12dp256.h"
//********************************************************************
//функции поддержки
//====================================================================
// _HC12Setup: выключить сторожевой таймер COP
//====================================================================
void _HC12Setup(void) {
COPCTL = 0x00; // выключить сторожевой таймер COP
}
//********************************************************************
//delay: подпрограмма задержки
//********************************************************************
void delay(void) { //подпрограмма задержки
volatile unsigned n, m;
m = 10;
do {
n = 0;
do {
n--;
} while(n);
m--;
} while(m);
}
//********************************************************************
// status_wait: время ожидания подпрограмма установки связи с ЖКД
//********************************************************************
void status_wait(void) { //время ожидания подпрограмма установки связи с ЖК дисплеем
char temp = 0x00;
DDRA = 0x00;
PORTB = 0xF9;
while ((temp & 0x03) != 0x03) {
PORTB = 0xFF;
temp = PORTA;
PORTB = 0xF9;
}
PORTB = 0xFF;
DDRA = 0xFF;
}
//********************************************************************
// command: пересылка команд на ЖК дисплей
//********************************************************************
void command(unsigned char n) { // пересылка команд на ЖК дисплей
status_wait();
PORTA = n;
PORTB = 0xFF;
PORTB = PORTB & 0xFA;
PORTB = 0xFF;
}
//********************************************************************
//********************************************************************
//data: пересылка данных на ЖК дисплей
//********************************************************************
void data(unsigned char n) { // пересылка данных на ЖК дисплей
status_wait();
PORTA = n;
PORTB = PORTB & 0xF2;
PORTB = 0xFF;
}
//********************************************************************
// LCD_char: функция пересылки символа на ЖК дисплей
//********************************************************************
void LCD_char(unsigned char n) {
// функция пересылки символа на ЖК дисплей
data(n - 0x20);
command(0xC0);
}
//********************************************************************
// newline: пересылка новой строки на ЖК дисплей
//********************************************************************
void newline(void) {
// пересылка новой строки на ЖК дисплей
int i;
for (i=0; i<16; i++) LCD_char(' ');
}
//********************************************************************
// LCD_output: пересылка последовательности символов на ЖК дисплей
//********************************************************************
void LCD_output(char s[]) {
// пересылка последовательности символов на ЖК дисплей
int n = 0;
while (s[n] != '\0') {
LCD_char(s[n]);
++n;
}
}
//********************************************************************
// Reset_cursor: возврат курсора
//********************************************************************
void Reset_cursor(void) { // возврат курсора
data(0x00);
data(0x10);
command(0x24);
}
//********************************************************************
//Clearscreen: очистка экрана ЖКД
//********************************************************************
void Clearscreen(void) { // очистка экрана ЖКД
int i,j;
Reset_cursor();
for (i=0; i<16; i++) for(j=0; j<16; j++) LCD_char(' ');
Reset_cursor();
}
//********************************************************************
// Initlcd: инициализация ЖКД
//********************************************************************
void Initlcd(void) { // инициализация ЖКД
PORTB = 0xEF; //принудительный сброс
delay();
PORTB = 0xFF; //все линии команд на высоком уровне
status_wait();
command(0x80); // установить режим текста
data(0x00); // установить младший байт адреса текста (L)
data(0x10); // установить младший байт адреса текста (H)
command(0x40); //установить адрес команды текста
data(0x10); //установить область текста
data(0x00);
command(0x41);
command(0x94); //включить текстовый дисплей
command(0xA7); //курсор 8×8 позиций
Clearscreen();
Reset_cursor();
}
//********************************************************************
// InitMes: начальное сообщение
//********************************************************************
void InitMes(void) { // начальное сообщение
unsigned char k;
for(k=0; k<3; k++) newline();
LCD_output(" Portable HTTP");
newline();
LCD_output(" TAD System.");
newline();
LCD_output(" version 1.0");
}
//********************************************************************
// numdisplay: отображение чисел на ЖК дисплее
//********************************************************************
void numdisplay(char s) { //отображение чисел на ЖК дисплее
char k;
newline();
k = s;
s = s>>4;
if (s > 0x08) data(s + 0x17);
else data(s + 0x10);
command(0xC0);
k = k & 0x0F;
if (k > 0x08) data(k + 0x17);
else data(k + 0x10);
command(0xC0);
}
//********************************************************************
// Секция данных - инициализация табличных данных
//********************************************************************
#pragma abs_address 0x3000
char BeP[12] = {0x00, 0x70, 0x00, 0x10,
0x40, 0xC0, 0x10, 0x10,
0x90, 0xFF, 0x10, 0x00};
char KeM[12] = {0x00, 0x70, 0x00, 0x10,
0x40, 0xC0, 0x10, 0x10,
0x90, 0xFF, 0x10, 0x00};
char OT[5] = {0x40, 0x60, 0x80, 0xA0, 0xC0};
char IMV[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
char OMV[5] = {0x00, 0x00, 0x00, 0x00, 0x00};
// правило
char rules[45] = {0x00,0x03,0xFE,0x06, 0xFE,
0x00, 0x04, 0xFE, 0x07, 0xFE,
0x00, 0x05, 0xFE, 0x08, 0xFE,
0x01, 0x03, 0xFE, 0x07, 0xFE,
0x01, 0x04, 0xFE, 0x08, 0xFE,
0x01, 0x05, 0xFE, 0x09, 0xFE,
0x02, 0x03, 0xFE, 0x08, 0xFE,
0x02, 0x04, 0xFE, 0x09, 0xFE,
0x02, 0x05, 0xFE, 0x0A, 0xFF};
char result[3] = (0x00, 0x00, 0x00};
#pragma end_abs_address
//********************************************************************
//Основная программа
//********************************************************************
void main(void) {
int index;
char temp = 0x00;
/* определение интерактивного туннелирования */
asm("LDX #$3000");
asm("LDY #$301D");
asm("LDAA $4000"); //оценка профиля поведения
asm("MEM");
asm("MEM");
asm("MEM"); //фаззификация
asm("LDAA $4001"); //оценка членства ключевых слов
asm("MEM");
asm("MEM");
asm("MEM"); //фаззификация
asm("LDY #$301D");
asm("LDX #$3028");
asm("LDAA #$FF"); //инициализация минимума и бита V
asm("REV"); //применение правил фаззификации
asm("LDX #$3018"); //дефаззификация
asm("LDY #$3023");
asm("LDAB #$05");
asm("WAV");
asm("EDIV");
asm("TFR Y,D");
asm("STAB $3055"); //сохранение результата
PORTB = 0xff;
DDRB = 0xff;
delay2();
PORTB = 0x7F; //проверка платы с использованием ЖКД
delay2();
PORTB = 0xFF;
/*Определение туннелирования скриптов*/
asm("LDX #$3000");
asm("LDY #$301D");
asm("LDAA $4002"); //оценка профиля поведения
asm("MEM");
asm("MEM");
asm("MEM"); //фаззификация
asm("LDAA #$PF"); //оценка членства ключевых слов
asm("MEM");
asm("MEM");
asm("MEM"); //фаззификация
asm("LDY #$301D");
asm("$3028");
asm("$4003"); //инициализация минимума и бита V
asm("REV"); //применение правил фаззификации
asm("LDX #$3018"); //дефаззификация
asm("LDY #$3023");
asm("LDAB #$05");
asm("WAV");
asm("EDIV");
asm("TFR Y,D");
asm("STAB $3056"); //сохранение результата
PORTB = 0xff;
DDRB = 0xff;
delay2();
PORTB = 0x7F; //проверка платы с использованием ЖКД
delay2();
PORTB = 0xFF;
/*Проверка внедрения потоков*/
asm("LDX #$3000");
asm("LDY #$301D");
asm("LDAA $4004"); //оценка профиля поведения
asm("MEM");
asm("MEM");
asm("MEM"); //фаззификация
asm("LDAA $4005"); //оценка членства для ключевых слов
asm("MEM");
asm("MEM");
asm("MEM"); //фаззификация
asm("LDY #$301D");
asm("LDX #$3028");
asm("LDAA $4003"); //инициализация минимума и бита V
asm("REV"); //применение правил фаззификации
asm("LDX #$3018"); //дефаззификация
asm("LDY #$3023");
asm("LDAB #$05");
asm("WAV");
asm("EDIV");
asm("TFR Y,D");
asm("STAB $3057"); //сохранение результата
PORTB = 0xff;
DDRB = 0xff;
delay2();
PORTB = 0x7F; //проверка платы с использованием ЖКД
delay2();
PORTB = 0xFF;
//Конфигурация ЖКД
DDRA = 0xFF;
PORTB = 0xFF,
Initlcd(); //Инициализация ЖКД
InitMes(); //Инициализация сообщений
delay2();
Clearscreen(); //Очистить экран ЖКД
Reset_cursor; //Возврат курсора ЖКД
newline(); //Создать новую строку на ЖКД
newline();
LCD_Output("IA: ");
numdisplay(result[0]);
if (result[0] > 0xA0) //Вывести на дисплей предупреждение
LCD_output(" High Alert");
else if (result[0] > 0x60) LCD_output(" Med Alert");
else LCD_output(" Low Alert");
newline();
LCD_output("SA: ");
numdisplay(result[1]);
if (result[0] > 0xA0) LCD_output(" High Alert");
else if (result[1] > 0x60) LCD_output(" Med Alert");
else LCD_output(" Low Alert");
newline();
LCD_output{"S: ");
numdisplay(result[2]);
if (result[2] > 0xA0) LCD_output(" High Alert");
else if (result[0] > 0x60) LCD_output(" Med Alert");
else LCD_output(" Low Alert");
}
//====================================================================