Автор: Пользователь скрыл имя, 13 Декабря 2012 в 09:08, курсовая работа
Цель курсовой работы – получение навыков программирования аппаратных комплексов, включающих взаимодействующие между собой различные 8- или 32-разрядные микроконтроллерные системы (МК-системы) и персональные компьютеры (РС), на языках Ассемблеров, С – для микроконтроллеров (МК) и языке С++ для РС с платформой Windows.
1. Постановка задачи 6
1.1. Стандартное задание 6
1.2. Индивидуальное задание 6
2. Техническое задание 7
3. Описание аппаратных и программных средств лабораторного комплекса 8
3.1. Структура аппаратных средств 8
3.1.1. Структурная схема лабораторного комплекса 8
3.1.2. Плата МК – системы 9
3.1.2.1. Конфигурируемые узлы МК C8051F064 11
3.1.2.2. Внешняя память XRAM 16
3.1.2.3. Входные усилители 17
3.1.2.4. Микросхема моста UART-USB 18
3.1.2.5. Сопряжение платы с PC 20
3.1.2.6. Питание платы 21
3.1.3. Требования к PC 21
3.1.4. ОСЦИГЕН 21
3.2. Перечень программных средств лабораторного комплекса 22
3.2.1. Средства программирования и отладки МК-системы 22
3.2.1.1. Интегрированная среда разработки фирмы SiLabs IDE 2.0 22
3.2.1.2. Ассемблер, компилятор и линкер интегрированной среды разработки Keil 23
3.2.2. Средства разработки Windows-приложений 24
3.2.2.1. Среда разработки 24
3.2.2.2. Библиотека WIN32 API функций 24
3.2.3. Приложения для ОСЦИГЕНа. 25
3.2.3.1. Драйвер конфигурируемого выносного блока 25
3.2.3.2. Windows-приложение OGView 25
3.2.4. Драйвер виртуального COM-порта фирмы SiLabs 26
4. Разработка программного комплекса для решения целевой задачи 26
4.1. Функциональная схема реализации функций запоминающего осциллографа 26
4.2. Состав и механизм взаимодействия приложений программного комплекса 27
4.2.1. Схема программного комплекса 27
4.2.2. Протокол обмена между PC-приложением и МК-приложением 27
4.2.3. Таблица допустимых команд 27
4.2.4. Размещение в памяти значений выборок сигнала со стороны МК и ПК 28
4.3. Разработка приложения для МК-системы 29
4.3.1. Обобщенная схема алгоритма 29
4.3.2. Обоснование выбора языка программирования и среды разработки 30
4.3.3. Описание файлов проекта приложения 30
4.3.3.1. Модули приложения 30
4.3.3.2. Модули, подключаемые на этапе линкования 30
4.3.4. Структура и организация программы 30
4.3.5. Схемы алгоритмов и описание функций приложения 30
4.3.5.1. Перечень функций приложения 30
4.3.5.2. Организация бесконечного цикла встроенного приложения 31
4.3.5.3. Отключение сторожевого таймера 31
4.3.5.4. Переключение с внутреннего генератора на внешний 32
4.3.5.5. Конфигурирование портов ввода/вывода 33
4.3.5.6. Конфигурирование аналого-цифровых преобразователей ADC 32
4.3.5.7. Конфигурирование интерфейса DMA 34
4.3.5.8. Инициализация последовательного интерфейса UART 35
4.3.5.9. Выбор и инициализация таймера для установки скорости обмена данными по последовательному каналу 36
4.3.5.10. Инициализация таймера для установки времени дискретизации входного сигнала 36
4.3.5.11. Выбор режимов работы внешней памяти XRAM и ее интерфейса 36
4.3.5.12. Инициализация прерываний 37
4.3.5.13. Формирование цифровых отсчетов и их сохранение во внешней памяти XRAM 37
4.3.5.14. Передача данных на PC 37
4.3.5.15. Прием данных с PC 37
4.3.5.16. Другие используемые функции 38
4.3.5.17. Конфигурирование узлов МК с учетом данных, пришедших с PC 38
4.4. Разработка Windows-приложения 39
4.4.1. Особенности использования среды разработки 39
4.4.2. Описание файлов проекта 39
4.4.3. Обобщенная схема алгоритма многопоточного приложения 40
4.4.4. Внешний вид и описание графического интерфейса, принципы построения программы 40
4.4.5. Описание структуры и организация программы 41
4.4.5.1. Назначение подключаемых файлов 41
4.4.5.2. Описание прототипов функций 41
4.4.5.3. Функция WinMain() 42
4.4.5.4. Функция главного окна 42
4.4.5.5. Организация дополнительных потоков, их назначение 43
4.4.5.6. Рабочие функции дополнительных потоков 43
4.4.5.7. Синхронизация потоков 43
4.4.5.8. Особенности обработки сообщений Windows в программе 43
4.4.5.9. Функция рисования графика восстановленного сигнала 45
4.4.5.10. Разметка осей графика 45
4.4.5.11. Использование контекстуальной памяти для рисования графика 45
4.4.6. Работа с COM-портом, описание WinAPI-функций и структур данных 46
4.4.6.1. Инициализация COM-порта, обоснование выбора режима (синхронный, асинхронный), объема буфера приема/передачи данных 46
4.4.6.2. Организация настроек COM¬-порта в графическом интерфейсе 48
4.4.6.3. Использование функций WaitCommEvent(), WaitForSingleObject(), WaitForMultiplyObject() 49
4.4.7. Работа оператора с приложением 49
4.4.7.1. Последовательность запуска приложения на МК и ПК в лаборатории 49
4.4.7.2. Примеры последовательности 49
4.4.7.3. Адаптация к сепктру входного сигнала 49
4.4.8. Описание протокола RS-232 49
5. Список используемых источников информации 87
6. Приложения 50
6.1. Исходные тексты модулей программы для МК 50
6.2. Фрагменты листингов файлов МК-приложения, полученные в результате трансляций: MAP-file и др 56
6.3. Исходные тексты файлов Windows-приложения 58
6.4. Алгоритмы 72
6.4.1. Обобщенный алгоритм программы для МК 72
6.4.2. Дополнительные алгоритмы программы для МК 73
6.4.2.1. Алгоритм процедуры отключения WDT 73
6.4.2.2. Алгоритм функции SYSCLK_Init 74
6.4.2.3. Алгоритм функции Port_Init 75
6.4.2.4. Алгоритм функции ADCInit 76
6.4.2.5. Алгоритм функции DMAInit 77
6.4.2.6. Алгоритм работы функции UART0_Init 79
6.4.2.7. Алгоритм функции Timer3_Init 80
6.4.2.8. Алгоритм функции main 81
6.4.2.9. Алгоритм функции Config 82
6.4.2.10. Алгоритм функции SendData 83
6.4.2.11. Алгоритм функции ReceiveData 84
6.4.3. Обобщенный алгоритм программы Windows-приложения 85
6.4.3.1. Алгоритм работы функции рисования графика 85
6.4.3.2. Алгоритм обработки сообщений 86
Бит 7: WEAKPUD - бит отключения слаботоковых подтяжек портов вводы/вывода
0 – слаботоковые подтяжки
1 - слаботоковые подтяжки
Бит 6: XBARE – бит включения матрицы
0 – матрица отключена, все выводы портов P0, P1, P2 и P3 настроены на вход
1 - матрица включена
Бит 5: зарезервирован. Читается как 0b. Запись не оказывает никакого влияния.
Бит 4: T4EXE – бит подключения входа T4EX
0 – T4EX не соединены с выводом порта
1 – T4EX соединен с выводом порта
Бит 3: T4E - бит подключения входа T4
0 – T4 не соединены с выводом порта
1 – T4 соединен с выводом порта
Бит 2: UART1E – бит подключения входов/выходов УАПП1
0 – входы/выходы УАПП1 не соединены с выводами порта
1 – TX1 и RX1 соединены с двумя выводами порта
Биты 1-0: зарезервированы
Конфигурирование портов ввода – вывода происходит в функции Port_Init().
Приоритетный декодер матрицы, или «матрица», распределяет и назначает выводы портов цифровым периферийным модулям МК, используя приоритеты. Матрица назначает выводы портов периферийным модулям, если соответствующие биты подключения в регистрах конфигурации матрицы XBR0, XBR1, XBR2 и XBR3 установлены в 1.
Для нашей задачи необходимо правильно установить биты в регистрах конфигурирования матрицы, чтобы связать (или наоборот) выводы портов с цифровыми периферийными модулями.
1. Для разрешения работы УАППа необходимо установить в ‘1’ 2-ый бит (UART0EN) регистра XBR0 (запись значения b00000100 или 0x04 в XBR0).
2. Также необходимо установить в '1' бит глобального разрешения цифрового коммутатора 6-ой бит (XBARE) регистра XBR2 (запись значения b01000000 или 0x40 в XBR2).
Следующий код функции Port_Init(void) иллюстрирует вышеописанную процедуру:
XBR0=0x04; // Enable UART0 on crossbar
XBR1=0x00;
XBR2=0x40; // Enable crossbar and weak pull-ups
Помимо этого необходимо запрограммировать работу выходных драйверов.
Регистр PхMDOUT:
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
Значение при сбросе: 00000000 |
Бит 7 |
Бит 6 |
Бит 5 |
Бит 4 |
Бит 3 |
Бит 2 |
Бит 1 |
Бит 0 |
Биты 7-0: PхMDOUT – биты настройки выходного драйвера порта х
0 – соответствующий вывод P0.n настроен как выход с открытым стоком
1 – соответствующий вывод P0.n
настроен как цифровой
По умолчанию после RESETа каждая линия порта ввода/вывода запрограммирована для работы в режиме OPEN_DRAIN. В нашей работе необходимо перепрограммировать выходные драйвера Port0 и Port1 на работу в режиме PUSH_PULL.
P0MDOUT=0xFF; // enable Port0 outputs as push-pull
P1MDOUT |= 0x40; // enable Port1 Pin 6 output as Push-Pull
Регистр ADC0CN:
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
Значение при сбросе: 00000000 |
AD0EN |
AD0TM |
AD0INT |
AD0BUSY |
AD0CM1 |
AD0CM0 |
AD0WINT |
- | |
Бит 7 |
Бит 6 |
Бит 5 |
Бит 4 |
Бит 3 |
Бит 2 |
Бит 1 |
Бит 0 |
Бит 7: AD0EN - бит включения АЦП0
0 – АЦП0 отключен, находится
в режиме пониженного
1 - АЦП0 включен, находится в активном режиме и готов к преобразованию
данных или калибровке
Бит 6: AD0TM – бит установки режима слежения АЦП0
0 – когда АЦП0 включен, слежение осуществляется всегда, за исключением
момента преобразования
1 - режим слежения определяется битами AD0CM1-0
Бит 5: AD0INT – флаг прерывания от АЦП0 (устанавливается при завершении преобразования). Этот флаг должен быть сброшен программно.
0 – АЦП0 не закончил
1 - АЦП0 закончил преобразование данных
Бит 4: AD0BUSY – бит занятости АЦП0
Чтение:
0 – преобразование данных
1 - идет процесс преобразования данных
Запись:
0 – не оказывает никакого влияния
1 - инициирует запуск
Биты 3-2: AD0CM1-0 – биты выбора режима запуска преобразования АЦП0
Если AD0TM = 0
00 – запуск преобразования
01 - запуск преобразования
10 - запуск преобразования
11 - запуск преобразования
Если AD0TM = 1
00 – слежение (выборка) начинается в момент установки в 1 бита AD0BUSY, после
истечения периода слежения начинается преобразование данных
01 - слежение (выборка) начинается при переполнении Таймера 3, после истечения
периода слежения начинается преобразование данных
10 – преобразование АЦП0
11 - слежение (выборка) начинается при переполнении Таймера 2, после истечения
периода слежения начинается преобразование данных
Бит 1: AD0WINT - флаг прерывания от детектора диапазона АЦП0 (сбрасывается программно)
0 – не зафиксировано
1 - зафиксировано соответствия
преобразованных данных
Бит 0: зарезервирован. Необходимо записать 0b.
Регистр REF0CN:
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
Значение при сбросе: 00000000 |
- |
- |
- |
- |
- |
- |
BIASE0 |
REFBE0 | |
Бит 7 |
Бит 6 |
Бит 5 |
Бит 4 |
Бит 3 |
Бит 2 |
Бит 1 |
Бит 0 |
Бит 7-2: зарезервированы, читаются как b000000, необходимо записать b000000.
Бит 1: BIASE0 – бит включения генератора напряжения смещения АЦП0 (если АЦП используется, то этот бит должен быть установлен в 1)
0 – внутренний генератор
1 - внутренний генератор
Бит 0: REFBE0 – бит включения внутреннего буферного усилителя АЦП0
0 - внутренний буферный усилитель АЦП0 отключен
1 - внутренний буферный усилитель АЦП0 включен
Конфигурирование АЦП происходит в функции ADC_Init() по следующему алгоритму:
Описанный алгоритм иллюстрирует следующий код:
ADC0CN = 0xC4; // ADC0 Enabled, Timer3 start-of-conversion
// track 16 SAR clocks before data conversion
// upon Timer3 OV. DMA will enable ADC as needed
REF0CN = 0x03; // ADC0: turn on bias generator and internal reference
for(i=0;i<10000;i++); // Wait for Vref to settle
ADC0CF = 0x00; // Setting Conversion Clock Period Bits
// (ADC0SC[3..0]=0000, Tcon= 21*SYSCLK)
//ADC mode (ADC0 / DIFF)
if (ADC_Mode == 's')
AMX0SL = 0x00; // Single-ended mode, ADC0
else if (ADC_Mode=='d')
{
AMX0SL = 0x40; // Differential mode
SFRPAGE = ADC1_PAGE; // Switch to ADC1 Page
ADC1CN = 0xC4; // ADC1 Enabled, Timer3 start-of-conversion
// track 16 SAR clocks before data conversion
// upon Timer3 OV. DMA will enable ADC as needed
REF1CN = 0x03; // ADC1: turn on bias generator and internal reference
for(i=0;i<10000;i++); // Wait for Vref to settle
ADC1CF = 0x00; // Setting Conversion Clock Period Bits
}
Конфигурирование интерфейса DMA происходит в функции DMA0_Init()по следующему алгоритму:
Описанный алгоритм иллюстрирует следующий код:
DMA0CN = 0x00; // Disable DMA interface
DMA0DA = XRAM_START_ADD; // Starting Point for XRAM addressing
DMA0CT = NUM_SAMPLES; // Get NUM_SAMPLES samples
DMA0IPT = 0x00; // Start writing at location 0
// Push instructions onto stack in order they will be executed
if (ADC_Mode == 's')
DMA0IDT = DMA0_GET_ADC0; // Retrieve data from ADC0
else DMA0IDT = DMA0_GET_DIFF;//Retrieve differential data from ADC0-ADC1
DMA0IDT = DMA0_END_OF_OP; // End of operations
DMA0BND = 0x00; // Begin instruction executions at address 0
DMA0CN = 0x20; // switch DMA0 to mode 1
Инициализация последовательного порта UART происходит в функции UART0_Init().
Инициализация последовательного порта UART проходит по следующему алгоритму:
Информация о работе Обработка аналоговых сигналов на основе МК C8051F064