Рассмотрим пример, в котором необходимо ввести от 2-х независимых датчиков аналоговые сигналы постоянного тока (U1 и U2), выполнить сравнение их между собой и по результатам сравнения осуществить:
1) в случае, если U1<=U2 управление передается фрагменту программы с адресом А1 и устанавливается в "1" признак (флаг) FO;
2) в случае, если U1>U2 управление передается на фрагмент программы с адресом А2, признак FO устанавливается в "0", формируются дискретные управляющие сигналы изменяющиеся от "0" до "1".
Для решения данной задачи, если нет каких-либо ограничений, более целесообразно использовать МК PIC16C71, так как этот микроконтроллер имеет встроенный 4-х канальный АЦП. Для ввода двух сравниваемых напряжений используются два аналоговых канала (линии AIN0 и AIN1 порта А). Переключение каналов производится с помощью изменения битов CHS0 и CHS1 в регистре ADCON0, который предназначен для управления АЦП.
Структура регистра ADCON (Адрес 08h в памяти данных) следующая:
7 0
ADCS1 | ADCS0 | CHS1 | CHS0 | GO/DONE | ADIF | ADON |
ADON - Включение АЦП:
· ADON = 0: АЦП не работает и не потребляет тока;
· ADON = 1: АЦП работает и занял линии ввода
/вывода.
ADIF - Флаг прерывания по окончанию преобразования:
· устанавливается аппаратно, когда преобразование закончено;
· сбрасывается программно.
GO:/DONE -Запуск АЦП (начало преобразования):
· устанавливается программно;
· сбрасывается аппаратно, когда преобразование закончено.
CHS1,CHS0 - Выбор аналогового канала:
· CHS1,CHS0 = 00: канал 0 (AIN0);
· 01: канал 1 (AIN1);
· 10: канал 2 (AIN2);
· 11: канал 3 (AIN3).
ADCS1,ADCS0 - Выбор частоты преобразования:.
· ADCS0,ADCS0 = 00: fosc/2;
· 01: fosc/8;
· 10: fosc/32;
· 11: fRC (частота от собственного
RC генератора).
Сформированный сигнал управления выдается через вывод RB1 порта В. Для сравнения двух восьмиразрядных кодов, представляющих собой результаты преобразования сигналов U1 и U2 можно воспользоваться стандартной процедурой СОМР, рассмотренной ранее.
С целью повышения точности и стабильности работы АЦП в данном случае более целесообразно использовать кварцевый ХТ генератор.
На основании исходного задания и предыдущих рассуждений можно предложить функциональную схему и алгоритм рабочей программы МКУ (см. рис. 8.1 и рис. 8.2 соответственно).
Рис. 8.1. Функциональная схема устройства.
Текст программы в соответствии с данным алгоритмом приведен ниже:
;Текст программы
LIST p=16c71, r=HEX
TITLE "Z8"
; Секция заголовка
; Описание регистров, битов и переменных
STATUS EQU 03H ; Регистр STATUS
PORTB EQU 06H ; Регистр порта В
ADCON0 EQU 08H ; Регистр управления АЦП
ADRES EQU 09H ; Регистр результата АЦП
; преобразования
INTCON EQU 0BH ; Регистр управления прерыва
; ниями
OPTREG EQU 81H ; Регистр OPTION
TRISB EQU 86H ; Регистр конфигурации порта В
ADCON1 EQU 88H ; Регистр конфигурации АЦП
RP0 EQU 5H ; Бит переключения страниц в
; регистре STATUS
C EQU 2H ; Флаг переноса/заема в регистре
; STATUS
Рис. 8.2. Алгоритм программы.
F0 EQU 0CH ; Просто флаг
; Рабочая секция
ORG 0 ; Начальный адрес после сброса
GOTO BEG ; Переход на начало программы
ORG 100 ; Начальный адрес программы
; (следующая команда будет
; расположена по адресу 100H)
BEG
; Инициализация микроконтроллера
BSF STATUS,RP0 ; Включить первую страницу ПД
BCF OPTREG,7 ; Отключить активную нагрузку
; от выводов порта В
BCF TRISB,0 ; Установить бит 0 порта В на
; вывод
CLRF ADCON1 ; Установить входы порта А как
; аналоговые, опорное
; напряжение для АЦП равно Vdd
BCF STATUS,RP0 ; Включить нулевую страницу ПД
MOVLW B '11000000' ; Разрешить прерывания только
MOVWF INTCON ; от АЦП (все остальные прерыва-
; ния запрещены !)
MOVLW 0C1H ; Синхронизация АЦП от
; собственного генератора.
MOVWF ADCON0 ; Разрешить работу АЦП
;
; Ввод и преобразование сигналов U1 и U2
BCF ADCON0,3 ; Установить входной канал AIN0
BSF ADCON0,2 ; Начать процесс преобразования
; сигнала U1
LOOP2 BTFSS ADCON0,2 ; Ждать окончания преобразова-
; ния сигнала U1
GOTO LOOP2
MOVF ADRES,0 ; Результат преобразования
; сигнала U1 записать в W
BCF ADCON0,1 ; Сбросить флаг окончания пре-
; образования ADIFв регистре
; ADCON0
BSF ADCON0,3 ; Установить входной канал AIN1
BSF ADCON0,2 ; Начать процесс преобразования
; сигнала U2
LOOP3 BTFSC ADCON0,2 ; Ждать окончания
; преобразования сигнала U2
GOTO LOOP3
BCF ADCON0,1 ; Сбросить флаг окончания пре-
; образования ADIF в регистре
; ADCON0
; Процедура сравнения U1 и U2
SUBWF ADRES,0 ; U2-U1
BTFSS STATUS, C ; Проверка состояния флага пере-
GOTO A1 ; носа/заема С.Если C=1
; (U1<=U2),то переход на фраг-
; мент программы с адресом А1
; Установка флага F0 в"0"
BCF F0, 0
; Вывод управляющих сигналов
BSF PORTB,0 ; Установить бит 0 порта В
GOTO A2 ; Переход на фрагмент програм-
; мы с адресом А2
; Установка флага F0 в "1"
A1 BSF F0, 0
GOTO BEG
A2 GOTO BEG
END