Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
- Название:Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
- Автор:
- Жанр:
- Издательство:Издательский дом «ДМК-пресс»
- Год:2007
- Город:Москва
- ISBN:5-9706-0034-2
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С краткое содержание
В книге последовательно рассматриваются все этапы создания встраиваемых систем на микроконтроллерах с применением современных технологий проектирования. Задумав эту книгу, авторы поставили перед собой задачу научить читателя искусству создания реальных устройств управления на однокристальных микроконтроллерах.
Издание содержит материал, охватывающий все вопросы проектирования, включает множество заданий для самостоятельной работы, примеры программирования, примеры аппаратных решений и эксперименты по исследованию работы различных подсистем микроконтроллеров.
Данная книга является прекрасным учебным пособием для студентов старших курсов технических университетов, которые предполагают связать свою профессиональную деятельность с проектированием и внедрением встраиваемых микропроцессорных систем. Книга также будет полезна разработчикам радиоэлектронной аппаратуры на микроконтроллерах.
Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
/* Контроллер должен быть сконфигурирован */
/* для работы в однокристальном режиме */
/* Дата создания: 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;
33 ldab #255
34 stab 0х2
35 ; CLI();
36 сli
37 L3: L4:
38 bra L3
39 X0:
40 ; while(1) {};
41 ; EXIT();
42 swi
43 ; }L2
44 .dbline 0
45 ; func end
46 rts
47 _TOIISR: :
48 void TOIISR(void)
49 ; {
50 ; TFLG2=0x80;
51 ldab #128
52 stab 0x8f
53 ; second + = 1;
54 ldab _second
55 clra
56 addd #1
57 stab _second
58 ; if(second = = 122)
59 ldab _second
60 cmpb #122
61 bne L7
62 ; {
63 ; PORTA = ~ PORTA;
64 ; vol
65 ldab 0
66 clra
67 coma
68 comb
69 stab 0
70 ; second = 0x00;
71 clr _second
72 ; }
73 L7:
74 ; }
75 L6:
76 .dbline 0
77 ; func end
78 rti
Итак, мы видим текст после обработки кросс-компилятором, который содержит инструкции команд на языке ассемблера микроконтроллера 68HC12 и директивы языка Ассемблер в составе интегрированной среды разработки ICC12. Директивы программы Ассемблер — это специальные команды, которые осуществляют управления процессом генерации кодов команд для МК при обработке приведенного выше текста программой Ассемблер. В среде ICC12 директивы выделяются точкой перед их именем. Например: .area data или .byte 0. Разберем текст представленного файла.
Читать дальшеИнтервал:
Закладка: