; ******************
; * ФУНКЦИЯ: Аналого-цифровое преобразование n-го канала *
; * РЕСУРСЫ: Подпрограмма DELAY_17US, регистр TEMP *
; * ВХОД: Номер канала в W *
; * ВЫХОД: Оцифрованное 8-битное значение в W *
; ******************
GET_ANALOG
movwf TEMP ; Копируем номер канала в TEMP
bcf STATUS,С; Сдвигаем на три бита влево,
rlf TEMP,f
rlf TEMP,f
rlf TEMP,w; помещая результат в W
bcf ADCON0,CHS0; Обнуляем биты выбора канала
bcf ADCON0,CHS1
bcf ADCON0,CHS2
addwf ADCONO,f; Заносим номер канала в ADCON0 [5:3]
call DELAY_17US; Ждем 17 мкс для установления
bcf INTCON,GIE; Запрещаем все прерывания
bcf PIR1,ADIF; Предварительно сбрасываем флаг ADIF
bsf ADCON0,GO; Запускаем преобразование
sleep; Немного поспим
bsf INTCON,GIE; Разрешаем прерывания (если необходимо)
movf ADRESH,w; Считываем результат после пробуждения
return
В качестве заключительного примера давайте напишем на Си программу для микроконтроллера PIC16F874 (20 МГц), который должен работать как компаратор, наподобие устройства из Примера 11.2 (стр. 354). В данном случае мы будем сравнивать 8-битное слово
Функция compare () из Программы 14.3 предполагает, что микроконтроллер уже инициализирован следующим образом:
#include <16f874.h>
#byte P0RT_B = 0x06
#byte PORT_C = 0x07
#device ADC=8 /* Результат преобразования — 8-битное число */
/* Объявляем функцию, в которую в качестве параметра передается гистерезис (+1 или -1) и которая возвращает новое значение гистерезиса */
unsigned int compare(unsigned int delta);
void main(void)
{
unsigned int hysteresis = 0;
set_tris_c(0xF8);
setup_adc(ADC_CLOCK_DIV_32);
setup_adc_ports(RA0_RA1_RA3_ANALOG);
set_adc_channel(1);
Ниже приведены основные функции компилятора CCS для работы с модулем АЦП.
∙ setup_adc(ADC_CLOCK_DIV_32)
Эта функция загружает требуемое значение в биты ADCS1[1:0], определяющие источник тактового сигнала модуля; в данном случае используется деленный на 32 сигнал от тактового генератора процессора. Для выбора внутреннего
∙ setup_adc_ports(RA0_RA1_RA3_ANALOG)