Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
- Название:Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
- Автор:
- Жанр:
- Издательство:Издательский дом «ДМК-пресс»
- Год:2007
- Город:Москва
- ISBN:5-9706-0034-2
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С краткое содержание
В книге последовательно рассматриваются все этапы создания встраиваемых систем на микроконтроллерах с применением современных технологий проектирования. Задумав эту книгу, авторы поставили перед собой задачу научить читателя искусству создания реальных устройств управления на однокристальных микроконтроллерах.
Издание содержит материал, охватывающий все вопросы проектирования, включает множество заданий для самостоятельной работы, примеры программирования, примеры аппаратных решений и эксперименты по исследованию работы различных подсистем микроконтроллеров.
Данная книга является прекрасным учебным пособием для студентов старших курсов технических университетов, которые предполагают связать свою профессиональную деятельность с проектированием и внедрением встраиваемых микропроцессорных систем. Книга также будет полезна разработчикам радиоэлектронной аппаратуры на микроконтроллерах.
Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// **********************************************************************
//initialize_PA: инициализация модуля аккумулятора импульсов МК 68HC12
// **********************************************************************
void initialize_PA(void) {
TIOS = 0x00; //Конфигурировать канал 7 для работы счетчика импульсов
TCTL1 = 0x00; //кодера - 3 оператора
OC7M = 0x00;
TSCR = 0x80; //Установить бит разрешения таймера
PACTL = 0x70; //Разрешить работу PA, режим счета событий, событие
// по фронту импульса,
}
Объединим теперь эту программу с программой для RTI, чтобы подсчитать число импульсов кодера, появившихся за интервал прерывания. Получив, этот результат, преобразуем его в число об/мин и выведем полученное значение на ЖК индикатор.
// **********************************************************************
//имя файла: motor.с
//автор: Steve Barrett and Daniel Pack
//дата создания: Mar 10, 2003
//последняя редакция: Mar 25, 2004
// **********************************************************************
// включенные файлы *****************************************************
#include <912b32.h>
#pragma interrupt_handler RTI_isr //объявить подпрограмму прерывания по RTI
// функции-прототипы ****************************************************
void initialize_ports(void); //инициализировать порты
void RTI_isr(void); //подпрограмма обслуживания прерываний RTI
void initialize_RTI(void); // инициализировать систему RTI
void initialize_PA(void); //инициализировать аккумулятор импульсов (PA)
void initialize_LCD(void); // инициализировать ЖК индикатор
void display_count_LCD(unsigned int); //вывод текущего содержимого аккумулятора PA
// на ЖК индикатор
void putchars(unsigned char); //функция поддержки ЖКИ - вывести символ
void putcommands(unsigned char);// функция поддержки ЖКИ вывести команду
void delay_5ms(void); //задержка 5 мс
void delay_100us(void); //задержка 100 мкс
unsigned int old_count; //последнее значение, записанное в (PA)
int RTI_int_count =0; //используется для подсчета RTI прерываний
//главная программа****************************************************
void main(void) {
asm(" .area vectors(abs) \n" //inline assembly statement
".org 0xFFF0\n" //инициализация вектора прерываний RTI
".word _RTI_isr\n"
" .org 0xFFF8\n" // инициализация вектора reset для 68HC12 B32
" .word 0x8000, 0x8000, 0x8000, 0x8000\n"
" .text");
void initialize_ports(void); // инициализация портов
initialize_LCD(); //инициализация ЖКИ
initialize_RTI(); //инициализация модуля RTI
initialize_PA(); //инициализация аккумулятора импульсов
asm("cli"); //разрешение глобального маскирования
//прерываний
while(1) //продолжение цикла до следующего прерывания
{
;
}
}
//********************************************************************
//********************************************************************
//initialize_ports: определяет направление передачи портов
//********************************************************************
void initialize_ports(void) {
DDRP = 0xFF; // порт PORTP устанавливается как выходной для ШИМ
DDRT = 0x00; // PORTT устанавливается как входной, вывод PORTT[7]
// в качестве входа аккумулятора импульсов PA
DDRB = 0xFF; // PORTB устанавливается как выходной - порт
// данных для ЖКД
DDRDLC = 0xFF; // PORT DLC устанавливается как выходной - сигналы
// управления для ЖКИ
}
//********************************************************************
//RTI_isr: подпрограмма прерывания по RTI
//********************************************************************
void RTI_isr(void) {
unsigned int new_count;
unsigned int pulse_count;
float max_count = 65535.0;
new_count = PACNT; //передается текущее число импульсов, записанное в PA
if (new_count > old_count) //определяется приращение числа импульсов
pulse_count = new_count - old_count;
else pulse_count = (unsigned int)(max_count-(float)(old_count = new_count));
RTI_int_count = RTI_int_count + 1;// изменяется показание счетчика
//RTI-прерываний
if (RTI_int_count == 10) // изменяется показание ЖКД через
// каждые 10 прерываний
{
display_count_LCD(pulse_count); //изменяется ЖКИ
RTI_int_count = 0; //сбрасывается счетчик прерываний RTI
}
old_count = new_count;
RTIFLG = 0x80; //сбрасывается RTI
}
// ********************************************************************
// initialize_RTI:конфигурирует регистры, связанные с RTI
// - регистр RTICTL
// -- разрешает работу модуля RTI установкой бита RTIE
// -- период RTI в 32.768 мс
// - сбрасывает бит RTIF в регистре флагов (RTIFLG)
// ********************************************************************
void initialize_RTI(void) {
RTICTL = 0x86; // устанавливается период RTI на 32.768 мс
RTIFLG = 0x80; //сбрасывается флаг RTIF
}
// ********************************************************************
//initialize_PA: инициализация модуля аккумулятора импульсов
// ********************************************************************
void initialize_PA(void) {
TIOS = 0x00; // Конфигурирует канал 7 для работы
TCTL1 = 0x00; // счетчика импульсов оптического кодера
OC7M = 0x00;
TSCR = 0x80; // устанавливает бит разрешения работы таймера
PACTL = 0x70; // разрешает работу РА, режим счета событий,
// по фронту импульса,
}
/********************************************************************/
/* initialize_LCD: инициализации ЖКИ */
/* передает на ЖКИ стартовую последовательность команд управления */
/* - PORTDLC[3]: линия управления RS ЖКИ */
/* - PORTDLC[2]: линия управления E для ЖКИ */
/* - PORTB: двунаправленная магистраль данных для ЖКИ */
/********************************************************************/
void initialize_LCD(void) {
delay_5ms();
delay_5ms();
delay_5ms(); /*ожидание в течение 15 мс перед включением ЖКИ */
putcommands(0x38); /*разрядность данных интерфейса 8 бит */
delay_5ms(); /*задержка */
putcommands(0x38); /*интерфейс в 8 бит */
delay_100us(); /*задержка */
putcommands(0x38); /* разрядность данных интерфейса 8 бит */
putcommands(0x38); /* интерфейс в 8 бит */
putcommands(0x0C); /*включение дисплея */
putcommands(0x01); /*очистка дисплея */
putcommands(0x06); /*установка режима инкремента адреса */
putcommands(0x00);
putcommands(0x00);
putcommands(0xC0); /*курсор на линию 2 знакоместо 1 */
putchars('R'); /* вывести "PRM" - скорость */
/*в об/мин на строку 2 ЖКИ */
putchars('P');
putchars('M');
}
/********************************************************************/
/*putchars: функция посылает ASCII код для вывода на ЖКИ */
/********************************************************************/
void putchars(unsigned char c) {
PORTB = c; /*вывести на порт PORTB код символа */
PORTDLC = PORTDLC|0x08; /*установить RS в 1 для передачи данных */
PORTDLC = PORTDLC|0x04; /*установить E в 1 */
PORTDLC = 0x00; /* установить E и RS в 0 */
delay_100us(); delay_100us();
}
/********************************************************************/
Интервал:
Закладка: