MAIN clrf CHANNEL
; Используется в качестве счетчика каналовMAIN_LOOP
movf CHANNEL,w
; Берем номер каналаandlw b’00000111’
; Обнуляем старшие 5 битmovwf PORTD
; Копируем в порт Dcall GET_ANALOG
; Оцифровываем, результат возвращается в Wmovwf PORTB
; Копируем его в порт Вincf CHANNEL,f
; Переходим к следующему каналуgoto MAIN_LOOP
; и так без конца; ********************************
; * ФУНКЦИЯ: Аналого-цифровое преобразование 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 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 проходам в секунду.