; ******************
; * ФУНКЦИЯ: Аналого-цифровое преобразование n-го канала *
; * РЕСУРСЫ: Подпрограмма DELAY_17US, регистр TEMP *
; * ВХОД: Номер канала в W *
; * ВЫХОД: Оцифрованное 8-битное значение в W *
; ******************
GET_ANALOG
movwf TEMP
; Копируем номер канала в TEMPbcf STATUS,С
; Сдвигаем на три бита влево,rlf TEMP,f
rlf TEMP,f
rlf TEMP,w
; помещая результат в Wbcf ADCON0,CHS0
; Обнуляем биты выбора каналаbcf ADCON0,CHS1
bcf ADCON0,CHS2
addwf ADCONO,f
; Заносим номер канала в ADCON0 [5:3]call DELAY_17US
; Ждем 17 мкс для установленияbcf INTCON,GIE
; Запрещаем все прерыванияbcf PIR1,ADIF
; Предварительно сбрасываем флаг ADIFbsf 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)