Форум: "Прочее";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
ВнизРабота с АЦП в PICP16C76 Найти похожие ветки
← →
Ajax © (2006-04-07 16:58) [0]Добрый день. Прошу помощи. Пытаюсь разобраться с АЦП в микроконтроллере. Повторяю 1 в 1 алгоритм руководства и не работает. Если вдруг кто разбирается, посмотрите пожалуйста код.
#include <P16C76.INC> ; Заголовки с объявлением стандартных констант
;=============================================================================== ================
cblock 0x20 ; Директива позволяющая описывать регистры блоком констант
lc1 ; Счетчик для задержки
lc2 ; Счетчик для задержки
flag ; Установка флагов преобразования
endc ; Директива конец описания блока констант
adover equ 0 ; Флаг окончания преобразования
;=============================================================================== ================
org 0 ; Начать выполнение программы с адреса 0 PC
goto Start ; с подпрограммы Start.
org 4
goto IntHld ; Вектор прерывания
;=============================================================================== ================
; Пауза примерно на 64*W мкс
Wait
movwf lc2
_w1 movlw 0xFF
movwf lc1
_w2 nop
decfsz lc1,f
goto _w2
decfsz lc2,f
goto _w1
return
;=============================================================================== ================
Start
clrw
movwf PORTC
bsf STATUS,RP0 ; Выбор банка 1
movwf TRISC ; Все защелки работают на выход
;выбрать аналоговые входы, источник опорного напряжения, цифровые входы/выходы (ADCON1)
bsf STATUS,RP0 ; Выбор банка 1
movlw b"00000000" ; Все каналы как аналоговые входы
movwf ADCON1
;выбрать входной канал АЦП, источник импульсов преобразования, включить модуль АЦП (ADCON0)
bcf STATUS,RP0 ; Выбор банка 0
movlw b"11000001" ; внутренний RC генератор модуля АЦП и канал 0, (AN0)
movwf ADCON0
;Настроить прерывание от модуля АЦП
bcf PIR1,ADIF ; Сбросить флаг наличия прерывания от АЦП
bsf STATUS,RP0 ; Выбор банка 1
bsf PIE1,ADIE ; Разрешить прерывания от АЦП
bcf STATUS,RP0 ; Выбор банка 0
bsf INTCON,PEIE ; Разрешить периферийные прерывания
bsf INTCON,GIE ; Разрешить прерывания в системе
Update
bcf flag,adover ; Сброс программного флага завершения преобразования
;Выдержать паузу, необходимую для зарядки конденсатора C HOLD
movlw 0xFF
call Wait
;Начать аналого-цифровое преобразование
bsf ADCON0,GO ; Старт преобразования
Loop
btfsc flag,adover ; Преобразование завершено?
goto Update ; Если да, начать новое преобразование.
goto Loop ; Если нет, ожидать окончание преобразования
IntHld
btfss PIR1,ADIF ; Прерывание от АЦП?
retfie ; Если нет, возврат
clrw
movf ADRES,W ; Чтение результата
movwf PORTC ; Запись в PortC
movlw 0xFF
call Wait
bsf flag,adover ; Установка программного флага завершения преобразования
bcf PIR1,ADIF
retfie
;=============================================================================== ================
end ; Конец программы.
← →
Ajax © (2006-04-07 17:01) [1]Коментариев через строчку навставлял, чтобы долго не думать "зачем я это сделал" :-) Банки переключаю часто чтобы в точности по алгоритму идти. Сама схема простая - Источник напряжения +5 подается через потенциометр на AN0. Соответственно на AN0 можно получать от 0 до +5В. Моделирую в Proteus.
← →
Jeer © (2006-04-07 17:04) [2]telesys .ru форум
← →
Symbios © (2006-04-07 17:12) [3]А ты уверен, что в данной модели есть модуль АЦП. В той же 16 серии не все модели имеют аналоговые входы. Пример pic16f84a. Откуда алгоритм взял?
← →
Ajax © (2006-04-07 17:36) [4]>[2] Jeer © (07.04.06 17:04)
Запостил на Телесистемы, но мне здесь как-то роднее :-)
>[3] Symbios © (07.04.06 17:12)
Наличие АЦП определил по даташиту. Алгоритм из мануала с сайта microchip.ru:
Рекомендованная последовательность действий для работы с АЦП:
1. Настроить модуль АЦП.
- выбрать аналоговые входы, источник опорного напряжения, цифровые входы/выходы (ADCON1)
- выбрать входной канал АЦП (ADCON0)
- выбрать источник импульсов преобразования (ADCON0)
- включить модуль АЦП (ADCON0)
2. Настроить прерывание от модуля АЦП (если необходимо)
- сбросить бит ADIF (флаг окончания преобразования)
- установить бит ADIE (маска прерывания от АЦП)
- установить бит GIE (разрешение прерываний в МК)
3. Пауза, необходимая для зарядки конденсатора CHOLD.
4. Начать аналого-цифровое преобразование
- установить GO/DONE бит (ADCON0)
5. Ожидать, окончания преобразования
- ждать, пока бит GO/DONE не будет сброшен ИЛИ
- ожидать прерывание по окончании преобразования
6. Считать результат преобразования из регистра ADRES, сбросить бит ADIF, если это необходимо.
7. Для следующего преобразования необходимо выполнить шаги начиная с пункта 1 или 2. Время
преобразования одного бита определяется как время TAD. Минимальное время ожидания перед
следующим преобразованием должно быть 2TAD.
На именно таком алгоритме не настаиваю, если есть другие варианты, то согласен на любой :-)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c