MAIN clrf CHANNEL; Используется в качестве счетчика каналов
MAIN_LOOP
movf CHANNEL,w; Берем номер канала
andlw b’00000111’; Обнуляем старшие 5 бит
movwf PORTD; Копируем в порт D
call GET_ANALOG; Оцифровываем, результат возвращается в W
movwf PORTB; Копируем его в порт В
incf CHANNEL,f; Переходим к следующему каналу
goto MAIN_LOOP; и так без конца
; ********************************
; * ФУНКЦИЯ: Аналого-цифровое преобразование 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 ADCONO,CHS2
addwf ADCONO,f; Заносим номер канала в ADCON0 [5:3]
call DELAY_17US; Ждем 17 мкс для установления
bsf ADCON0,GO; Запускаем преобразование
GET_ANALOG_LOOP
btfsc ADCONO,GO; Проверим завершение преобразования
goto GET_ANALOG_LOOP
movf ADRESH,w; Считываем результат после сброса бита
GO/NOT_DONE
return
; ********************************
; * ФУНКЦИЯ: Формирует 17-мкс задержку при частоте 20 МГц (85 циклов) *
; * РЕСУРСЫ: Нет *
; * ВХОД: Нет *
; * ВЫХОД: W обнуляется *
; ********************************
DELAY_17US
movlw d’20’; Параметр задержки
DELAY_17US_LOOP
addlw -1; Декрементируем
btfss STATUS,Z; до нуля
goto DELAY_17US_LOOP
return
Собственно считывание данных осуществляется в подпрограмме GET_ANALOG, при вызове которой в младших трех битах рабочего регистра передается номер требуемого канала. Это значение копируется во временный регистр TEMP, содержимое которого затем сдвигается на три бита влево, чтобы переданный номер канала оказался в позиции битов CHS
После установки требуемого номера канала вызывается подпрограмма задержки для формирования паузы, необходимой для установления (стабилизации работы) ключа. Поскольку нам достаточно 8-битного разрешения, для заряда конденсаторов с погрешностью до 0.25 % финального (установившегося) значения достаточно задержки всего 6
В общем каждое преобразование занимает около 13 х 16 ~= 21 мкс, таким образом, на оцифровку одного канала затрачивается 17 + 21 = 38 мкс. Соответственно, оцифровка всех восьми каналов (один проход) занимает 38 х 8 ~= 300 мкс, что дает нам скорость, примерно равную 3300 проходам в секунду.