Использование модулей АЦП и ШИМ в микроконтроллерах PIC16

АЦП и ШИМ в PIC16
Микроконтроллеры PIC16 имеют на борту 10-ти разрядный модуль аналого-цифрового преобразователя (АЦП) последовательного приближения. Метод последовательного приближения предполагает получение результата за несколько измерений (сравнений), с постепенным увеличением точности в каждом последующем сравнении. Таким образом, преобразование выполняется за несколько машинных циклов. Естественно данный метод уступает параллельным АЦП по скорости преобразования, в которых результат получают за один такт (машинный цикл). Я не буду здесь углубляться в тонкости различных методов, необходимую информацию можно найти в сети.

На рисунке ниже представлена структурная схема аналогового входа АЦП:
Структурная схема АЦП
Здесь Rs – это внутреннее сопротивление источника напряжения, ANx – линия порта микроконтроллера, обладающая емкостью Cpin и током утечки Iu. Внутренние соединения микроконтроллера имеют сопротивление Ric. Переключатель SS имеющий сопротивление Rss, подключает линию порта ANx к конденсатору Chold модуля АЦП. Коммутация переключателя SS производится при выборе аналогового канала, каждому каналу соответствует свой переключатель. Сопротивление переключателя защелки зависит от напряжения питания, график зависимости показан на рисунке справа.

Процесс измерения напряжения выглядит следующим образом: при выборе аналогового канала происходит коммутация переключателя SS, тем самым конденсатор Chold подключается к соответствующей линии порта микроконтроллера и начинает заряжаться. После получения команды начинается процесс преобразования, на время которого конденсатор отключается от линии порта.

После выбора аналогового канала битами CHS(2:0) регистра ADCON0, необходимо организовать определенную паузу (Tacq) перед началом преобразования, для того чтобы конденсатор Chold успел зарядиться. В технической документации приводится расчет этого времени, который представлен ниже:
Временная задержка АЦП
В основном на время заряда влияет внутреннее сопротивление источника напряжения Rs, которое не должно превышать 10 кОм, для компенсации внутреннего тока утечки Iu, кроме этого влияние оказывает сопротивление переключателя защелки Rss и емкость самого конденсатора Chold, которая может различаться у различных моделей микроконтроллеров.

Время преобразования составляет 12Tad, где Tad это время получения одного бита, для корректного результата Tad не должно быть меньше 1,6 мкс. Время Tad в зависимости от частоты тактового генератора подбирается настройкой битов ADCS(2:0), в даташите на микроконтроллер для этого приводится таблица, где можно подобрать правильное значение. После окончания преобразования необходимо выдержать паузу не менее 2Tad перед началом нового преобразования, в течение этого времени конденсатор Chold не подключен к выбранной линии порта микроконтроллера. В принципе, если аналоговый канал не меняется и частота преобразований небольшая (время между преобразованиями больше чем Tacq+2Tad), можно и не рассчитывать временные задержки Tacq, 2Tad, и забыть о них.

Чтобы использовать линии порта микроконтроллера для АЦП, необходимо их настроить как аналоговые входы битами ANS(7:0) регистра ANSEL, при этом линия порта должна быть настроена на вход битами регистра TRIS. После этого выбирается требуемый аналоговый канал.

Результат преобразования (10 бит) сохраняется в регистрах ADRESH и ADRESL. Эти регистры представляют собой спаренный 16-ти разрядный регистр, запись результата может выполняться с правым или левым выравниваем, как показано на картинке ниже. Настройка выравнивания осуществляется с помощью бита ADFM регистра ADCON0.
Выравнивание результата АЦП
В качестве опорного напряжения может использоваться внешнее напряжение с вывода Vref, или внутреннее Vdd от источника питания, настройка осуществляется битом VCFG. Для увеличения точности результата опорное напряжение должно быть стабилизированным с минимальным уровнем пульсаций. При опорном напряжении Vref =5 В, получим дискретность 5В/1024=0,0049 В=4,9 мВ для 10-ти битного результата. Для получения 8-ми битного результата необходимо применить левое выравнивание и считывать только регистр ADRESH, в этом случае для Vref =5 В дискретность составит 5В/256=0,0195 В=9,5 мВ.

Включение модуля АЦП производится битом ADON регистра ADCON0, запуск преобразования осуществляется установкой бита GO/-DONE регистра ADCON0, который аппаратно сбрасывается после окончания преобразования, то есть проверкой этого бита можно определить конец преобразования.

Перейдем к рассмотрению 10-ти разрядного ШИМ (широтно-импульсная модуляция) в микроконтроллерах PIC16. ШИМ осуществляется посредством модуля CCP, который настраивается в регистре CCP1CON, и содержит 16-ти разрядный регистр CCPR1, состоящий из двух регистров CCPR1H и CCPR1L. Сигнал от модуля в режиме ШИМ передается на вывод CCP1 микроконтроллера, который должен быть настроен на выход. Для реализации ШИМ используется таймер TMR2, период ШИМ задается в регистре PR2, старшие 8 бит длительности импульса задаются в регистре CCPR1L , младшие 2 бита в регистре CCP1CON(5:4). Ниже представлена структурная схема модуля ШИМ:
Структурная схема ШИМ
Когда значение таймера TMR2 в процессе инкремента сравнивается с числом в регистре PR2, происходит обнуление TMR2, одновременно с этим устанавливается высокий логический уровень на выводе CCP1 (если длительность импульса в регистрах CCPR1L и CCP1CON равна нулю, высокий логический уровень не устанавливается). Также в этот момент происходит загрузка значения длительности импульса из регистров CCPR1L, CCP1CON в регистр CCPR1H и внутреннюю двухразрядную защелку, которые образуют буфер ШИМ.

Буферизация необходима для возможности записи нового значения длительности импульса в регистры CCPR1L, CCP1CON, без искажения предыдущего значения. Биты в регистре CCPR1L и CCP1CON(5:4) могут быть изменены в любое время, но значение в регистре CCPR1H не изменяется, пока не произойдет совпадение значений TMR2 и PR2. В ШИМ режиме регистр CCPR1H доступен только для чтения.

Таймер TMR2 и внутренний двухразрядный счетчик образуют условный 10-ти разрядный счетчик, при этом если TMR2 инкрементируется в каждом машинном цикле с частотой Fosc/4 (при коэффициенте предделителя 1:1), то внутренний двухразрядный счетчик тактируется за каждый период тактового генератора с частотой Fosc, тем самым получается условный 10-ти разрядный счетчик. Когда значение CCPR1H и внутренней двухразрядной защелки сравнивается со значением TMR2 и внутреннего двухразрядного счетчика, на выводе CCP1 устанавливается низкий логический уровень. Ниже можно увидеть временную диаграмму одного периода ШИМ:
Временная диаграмма периода ШИМ
Период ШИМ можно рассчитать по следующей формуле из даташита:

Tшим=(PR2+1) ×4×Tosc×(коэффициент предделителя TMR2)

По мне лучше переписать данное уравнение в более удобную форму:

Fшим=Fosc/(4×(PR2+1)×(коэффициент предделителя TMR2))

Подставляя частоту тактового генератора, например, в килогерцах, получим результирующую частоту ШИМ в тех же единицах, так как остальные параметры безразмерные. В даташите также приведена таблица с рассчитанными значениями частоты и разрешения ШИМ для частоты тактового генератора в 20 МГц:
Таблица настройки ШИМ
Удобнее всего начинать расчет параметров ШИМ, выбрав требуемое разрешение, исходя из которого, можно рассчитать три возможных комбинации значения частоты ШИМ и выбрать наиболее подходящее.

Выполним несколько расчетов для частоты тактового генератора в 4 МГц. Значение разрешения ШИМ примем равным 8 бит, для получения наибольших частот ШИМ для заданной частоты тактового генератора, значение длительности импульса необходимо загружать в регистры CCPR1L и CCP1CON с “правым выравниванием”. То есть старшие 6 бит длительности импульса загружаем в биты (5:0) регистра CCPR1L (в 6-й и 7-й бит CCPR1L записываем нули), а младшие 2 бита длительности импульса в регистр CCP1CON(5:4) как показано на рисунке ниже:
Схема загрузки скважности ШИМ
При этом числовое значение для регистра PR2, определяющее период ШИМ, составит 0x3F=63. Посчитаем частоту ШИМ при коэффициенте предделителя TMR2 равного (1:1):

Fшим=4000 кГц/(4×(63+1)×1)=15,625 кГц

Для коэффициента предделителя TMR2 (1:4):

Fшим=4000 кГц/(4×(63+1)×4)=3,9 кГц

При коэффициенте (1:16) получим: Fшим=976 Гц.

Используя “левое выравнивание” можно получить наименьшие значения частот ШИМ для заданной частоты тактового генератора, при этом значение длительности импульса загружается только в регистр CCPR1L (в 5-й и 4-й бит CCP1CON записываем нули), как показано на рисунке ниже:
Схема установки скважности ШИМ
Числовое значение для регистра PR2 составит 0xFF=255, для коэффициентов предделителя TMR2 (1:1; 1:4; 1:16) получим частоты ШИМ 3,9 кГц; 976 Гц; 244 Гц. Подбор частоты путем различного “выравнивания” возможен, если только разрешение ШИМ меньше 10 бит. Таким образом, выбрав требуемое разрешение и варьируя частотой тактового генератора, коэффициентом предделителя TMR2, применяя различное “выравнивание”, можно подбирать различные частоты для ШИМ.

Теперь рассмотрим практическое применение модулей АЦП и ШИМ на основе 8-ми выводного микроконтроллера PIC12F683. Будем регулировать яркость светодиода мощностью в один ватт при помощи переменного резистора, схема представлена ниже:
Применение АЦП и ШИМ, схема
Как видно из схемы, измерение напряжения производится на среднем выводе переменного резистора, линия микроконтроллера GP0/AN0 используется в качестве аналогового входа модуля АЦП. Напряжение на среднем выводе переменного резистора варьируется от 0 до 5В, для АЦП используется внутреннее опорное напряжение от источника питания Vdd, то есть 5В. Разрешение АЦП и ШИМ я настроил на 8 бит, это значение очень часто применяется в конструкциях. Полученный после преобразования байт передается в модуль ШИМ, сигнал от которого с вывода GP2/CCP1 передается на затвор полевого транзистора, который коммутирует светодиод.

Код программы представлен ниже, в принципе необходимо только настроить АЦП и ШИМ, а дальше все просто:

Вначале идет настройка внутреннего тактового генератора микроконтроллера на 4 МГц, запись нулей в выходные защелки, отключение компараторов. Далее настраиваем линию GP2/CCP1 на выход, чтобы использовать ее для ШИМ, остальные линии на вход, в том числе и GP0/AN0 для АЦП, эти настройки производятся в регистре TRISIO, который расположен в 1-ом банке.

Следующим шагом будет настройка модуля АЦП. В регистре ANSEL (находится в 1-ом банке) устанавливаем время преобразования одного бита Tad равное 4 мкс (Fosc/16), для частоты тактового генератора в 4 МГц из таблицы в даташите микроконтроллера доступно два значения: 2 мкс (Fosc/8) и 4 мкс (Fosc/16). В этом же регистре настраиваем линию GP0/AN0 как аналоговый вход для правильного функционирования АЦП, остальные линии как цифровые входы. Затем следует настройка регистра ADCON0, где устанавливаем левое выравнивание результата преобразования для регистров ADRESH, ADRESL. Для 8-ми битного результата считывать будем только регистр ADRESH. Здесь же выбираем внутренний источник опорного напряжения Vdd, при этом модуль АЦП не включаем, и преобразование не запускаем. На этом настройку модуля можно считать завершенной.

Далее настраиваем ШИМ, первым делом устанавливаем период в регистре PR2 (находится в 1-ом банке). Будем использовать 8-ми битный ШИМ с загрузкой длительности импульса с “левым выравниванием”, то есть только в регистр CCPR1L, соответственно в PR2 записываем 0xFF=255. После этого устанавливаем длительность импульса равной нулю, чтобы после запуска ШИМ вывод GP2/CCP1 оставался в низком логическом уровне, в принципе этого можно и не делать. Неиспользуемые в данном случае младшие биты (5:4) длительности импульса в регистре CCP1CON должны быть сброшены, иначе получим некорректный результат. В регистре T2CON устанавливаем коэффициент предделителя TMR2 равным (1:16), и запускаем таймер. Частота ШИМ составит 244 Гц, чего вполне достаточно, для исключения мерцания светодиода. В регистре CCP1CON включаем режим ШИМ, при этом следим чтобы биты (5:4) были сброшены, как было сказано выше. Вот и все, ШИМ настроен и запущен.

Далее идет рабочая программа: включаем модуль АЦП, затем запускаем преобразование установкой бита GO/-DONE, кстати, включение модуля и запуск преобразования должны выполняться разными командами, о чем говориться в даташите. Путем цикличной проверки бита GO/-DONE, определяем конец преобразования. Копируем результат преобразования из регистра ADRESH в регистр длительности импульса CCPR1L. Уходим на паузу в 100 мс, после чего переходим на метку begin, для выполнения нового цикла, в принципе все просто.

Ниже представлен видеоролик демонстрирующий работу модулей АЦП и ШИМ. Здесь в вышеприведенную схему я дополнительно добавил цифровое табло на драйвере MC14489AP, для отображения результата измерения модуля АЦП.

Макетная плата
Прошивка МК и исходник+модель Proteus 7.7

У этой записи 25 комментариев

  1. Доброго времени суток. Насколько я понял, что вращая потенциометр от минимума до максимума изменяется значение PR 2 от 0 до 255 и при этом изменяется напряжение на выводе GP 2 ?

    1. Нет, не правильно, изменяется значение регистра CCPR1L, то есть скважность сигнала и соответственно напряжение на выводе GP2, при изменении значения регистра PR2 будет меняться частота ШИМ сигнала.

  2. А возможен вариант при котором значение регистра CCPR1L изменялось с помощью 2х кнопок ?

    1. конечно возможен, это несложно

  3. Благодарю за консультацию. Написание программ для контроллеров для меня темный лес но попробую разобраться что к чему

    1. 2 кнопками в 10 000 раз проще! вы разберётесь за 2 дня

  4. Доброго дня!

    Подскажите, что поменять в прошивке что бы управление было наоборот?
    То есть, что бы при увеличении напряжения на входе, шим на выходе уменьшал яркость светодиода.
    Не судите меня строго, только начинаю разбираться с микроконтроллерами.

    1. Достаточно инвертировать данные измеренные с помощью АЦП, перед загрузкой в регистры ШИМ.

      Вместо строчки:
      movf ADRESH,W
      вставьте:
      comf ADRESH,W

  5. Добрый день! Помогите, пожалуйста, разобраться. Есть 8 диодов, хочу, чтобы они по очереди медленно загорались и медленно потухали. Знаю, что можно сделать это с помощью ШИМ, НО ни как не пойму в какое место кода я должна вставить шим? Если я делаю его один раз в начале, то контроллер отрабатывает шим, а потом приступает к диодам.
    Вот собственно код:
    movlw b’00000000′
    movwf PORTB
    call zad2
    movlw b’10000000′
    movwf PORTB
    call zad2
    movlw b’11000000′
    movwf PORTB
    call zad2
    movlw b’11100000′
    movwf PORTB
    call zad2
    movlw b’11110000′
    movwf PORTB
    call zad2
    movlw b’11111000′
    movwf PORTB
    call zad2
    movlw b’11111100′
    movwf PORTB
    call zad2
    movlw b’11111110′
    movwf PORTB
    call zad2
    movlw b’11111111′
    movwf PORTB
    call zad2
    zad2 movlw .38
    movwf Reg_1
    movlw .245
    movwf Reg_2
    decfsz Reg_1,F
    goto $-1
    decfsz Reg_2,F
    goto $-3
    nop
    return

    1. У микроконтроллера только один выход ШИМ, то есть можно плавно регулировать яркость только одного светодиода, а не 8-ми. То что вы хотите осуществить можно сделать с помощью программного ШИМ на 8 каналов, реализованного в подпрограмме обработки прерываний.

      1. Спасибо огромное! Попробую

  6. Расскажите, пожалуйста, об алгоритмах измерения переменного напряжения, в т.ч. среднеквадратичного. Или такие расчёты на асме тяжело сделать, а лучше на си?

  7. Добрый день!
    Можно ли такое нарисовать в 12F675?

    1. Можно, но в 12F675 нет модуля ШИМ, придется делать программный ШИМ

  8. У меня много 675х и ни одного 683 🙁
    Что убрать с проги что бы удалить управление индикацией? Ведь нет схемы управления индикаторами а следовательно в проге это лишнее и что явно тормозит работу ШИМ. Какие там индикаторы используются которые управляются всего по 3 проводам? Если не сложно добавьте в программу что бы при поступлении лог 1 на свободный порт ШИМ выходил на максимальное заполнение. Хочу всё приладить к схеме управления электродвигателем микросверлильного станка.
    Заранее спасибо!

    1. На работу ШИМ индикация никак не влияет, В PIC12F683 используется аппаратный ШИМ! он работает сам по себе, независимо от основной программы. Чтобы выпилить индикацию надо удалить подпрограммы vivod, send, и все ссылки на них, а также убрать код начиная с метки osnova и до bsf ADCON0,ADON. Но это все для PIC12F683.

      В 675 нет модуля аппаратного ШИМ, там нужно делать программный ШИМ, добавлять подпрограмму обработки прерываний. На данный момент я занят, пока не могу помочь.

      1. В наличии имеется 16F874/
        Хочу его немного помучить – поэкспериментировать.
        Требуется организовать трехканальный ШИМ с собственно скважностью по каждому из каналов.
        Как запустить аппаратный двухканальный примерно представляю.
        Вопрос:
        Если третий канал писать программно, насколько это будет тормозить всю остальную работу контроллера?
        а может стоит все три канала сделать программно по прерыванию от таймера?

        1. Все зависит от частоты программного ШИМ, чем больше частота, тем меньше остается времени для основной программы, но на работу аппаратного ШИМ это никак не повлияет, только на основную программу. И еще частоту программного ШИМ не получится сделать большой как у аппаратного ШИМ, максимум единицы килогерц. Если основная программа не требует много времени, можно и 3-х канальный программный сделать.

    2. Могу заняться на платной основе.

  9. Добрый день, переделал ваш код на 8мгрц и 10 разрядный ацп. Но при уменьшении числа 255 установка предделителя TMR2 (1:1) По даташиту при установки частоты на 8мгрц / 19.61кгрц потенциометр не может регулировать от 0-5 вольт полностью выходит так скважность стает больше периода.
    Как с этим бороться?
    сам код
    ;Основная программа

    Start bsf STATUS,RP0
    movlw b’01110001′ ;установка тактовой частоты микроконтроллера
    movwf OSCCON ;в 4 МГц, внутренний тактовый генератор
    bcf STATUS,RP0 ;
    ;
    movlw b’00100000′ ;запись нулей в выходные защелки
    movwf GPIO ;
    ;
    movlw 0x07 ;выключение компараторов
    movwf CMCON0 ;
    ;
    bsf STATUS,RP0 ;
    movlw b’11111011′ ;настройка линии GP2 на выход для модуля ШИМ,
    movwf TRISIO ;остальные линии на вход
    movlw b’01010001′ ;установка времени преобразования для АЦП
    movwf ANSEL ;Tad = 4мкс (Fosc/16), настройка линии
    bcf STATUS,RP0 ;GP0(AN0) как аналоговый вход для АЦП, остальные
    ;линии цифровые входы

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;настройка модуля АЦП

    movlw b’00000001′ ;Установка левого выравнивания результата АЦП,
    movwf ADCON0 ;внутренний источник опорного напряжения от Vdd,
    ;выбор аналогового канала AN0, преобразование
    ;не запущено, модуль АЦП выключен

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;настройка модуля ШИМ

    bsf STATUS,RP0 ;
    movlw .255 ;запись числа 255 в регистр периода ШИМ
    movwf PR2 ;
    bcf STATUS,RP0 ;
    ;
    movlw .0 ;запись нулей в регистры длительности импульса
    movwf CCPR1L ;ШИМ, CCPR1L и CCP1CON(5:4)
    bcf CCP1CON,4 ;
    bcf CCP1CON,5 ;
    ;
    movlw b’00000100′ ;установка предделителя TMR2 (1:16)
    movwf T2CON ;включение таймера TMR2
    ;
    movlw b’00001100′ ;включение CCP1 модуля в режим ШИМ
    movwf CCP1CON ;при этом ранее сброшенные младшие биты (5:4)
    ;длительности импульса ШИМ не меняем

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;Рабочая программа

    bsf ADCON0,ADON ;включение модуля АЦП
    begin bsf ADCON0,GO_DONE ;установка бита GO_DONE регистра ADCON0 для
    ;запуска преобразования АЦП
    ;
    prov btfsc ADCON0,GO_DONE ;опрос бита GO_DONE
    goto prov ;бит GO_DONE не равен 0, преобразование не
    ;закончено, переход на метку prov
    ;
    movf ADRESH,W ;бит GO_DONE равен 0, преобразование закончено,
    movwf CCPR1L ;копирование значения регистра ADRESH в регистр
    ;CCPR1L, то есть результат преобразования
    ;загружаем в регистр длительности импульса ШИМ
    ;
    bcf CCP1CON,5
    bcf CCP1CON,4
    bsf STATUS,RP0
    btfss ADRESL,7
    goto a1
    bcf STATUS,RP0
    bsf CCP1CON,5
    bsf STATUS,RP0
    a1 btfss ADRESL,6
    goto a2
    bcf STATUS,RP0
    bsf CCP1CON,4
    a2 bcf STATUS,RP0
    call pause ;вызов подпрограммы паузы

    goto begin ;переход на метку begin, для повторного
    ;запуска преобразования

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;пауза 200 мс

    pause movlw .130 ;подпрограмма паузы 200 мс
    movwf Sec1 ;
    p2 movlw .255 ;
    movwf Sec ;
    p1 decfsz Sec,F ;
    goto p1 ;
    decfsz Sec1,F ;
    goto p2 ;
    return ;выход из подпрограммы
    ;
    end

    1. При увеличении частоты уменьшается разрядность ШИМ, для тактовой частоты контроллера 8МГц, и частоты ШИМ 19,6 Кгц, разрядность составит 8 бит, а вы загружаете 10-битное значение от АЦП, длительность импульса превышает период импульсов, вот и происходит срыв.

      Если вам нужна частота ШИМ в 19,6 кГц и разрядность в 10 бит, то повышайте частоту тактового генератора микроконтроллера до 20МГц.

      Разрешение ШИМ

      1. Переделал участок кода на частоту 31.248 movlw .63 , Теперь могу регулировать с 0-5 вольт но потерял шаг при регулировке 0.05 вольт c потенциометра. На вашем примере с movlw .255 с частотой моей 8 мгрц / 8 бит ацп такой шаг и реакция при кручении потенциометра есть.
        Есть одна особенность, после переделки кода я привязан жестко к периоду при его изменений допустим ниже 31кгрц я теряю скважность при регулировки от 0-5 на частоте 7кгрц скважность уже больше 40% не будет и если выше частота снова происходит срыв. Как я понимаю нужно писать код на ассамблере систему масштабирования чтобы на разную частоту засунуть скважность от 0 до 5 вольт я правильно понимаю? Хотя помогите вернуть шаг 0.05 вольт при кручении.

        ;Рабочая программа

        bsf ADCON0,ADON ;включение модуля АЦП
        ;call Pause_14 ; пауза для зарядки Hold
        begin bsf ADCON0,GO_DONE ;установка бита GO_DONE регистра ADCON0 для
        ;запуска преобразования АЦП
        ;
        prov btfsc ADCON0,GO_DONE ;опрос бита GO_DONE
        goto prov ;бит GO_DONE не равен 0, преобразование не
        ;закончено, переход на метку prov
        ;

        ;
        bcf CCP1CON,5
        bcf CCP1CON,4
        bsf STATUS,RP0
        btfss ADRESL,1
        goto a1
        bcf STATUS,RP0
        bsf CCP1CON,5
        bsf STATUS,RP0
        a1 btfss ADRESL,0
        goto a2
        bcf STATUS,RP0
        bsf CCP1CON,4
        a2 bcf STATUS,RP0
        rrf ADRESH,1
        rrf ADRESH,1
        bcf ADRESH,7
        bcf ADRESH,6
        movf ADRESH,W ;бит GO_DONE равен 0, преобразование закончено,
        movwf CCPR1L ;копирование значения регистра ADRESH в регистр
        ;CCPR1L, то есть результат преобразования
        ;загружаем в регистр длительности импульса ШИМ
        call pause ;вызов подпрограммы паузы

        goto begin ;переход на метку begin, для повторного
        ;запуска преобразования

  10. для 8 битного преобразования АЦП , 5/256=0.0195. Пишите 9.5 мВ

  11. Скажите плз может ли Picit 2 программировать 12f683 ?
    Николай. gen22asa@mail.ru

Имя (обязательно)Email (обязательно)Веб-сайт

Добавить комментарий