[an error occurred while processing this directive]
Работа с АЦП в PICP16C76
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Ajax 07 апреля 2006 г. 17:08

Добрый день. Прошу помощи. Пытаюсь разобраться с АЦП в микроконтроллере. Повторяю 1 в 1 алгоритм руководства и не работает. Если вдруг кто разбирается, посмотрите пожалуйста код.

#include ; Заголовки с объявлением стандартных констант
;=============================================================================== ================
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 ; Конец программы.

Коментариев через строчку навставлял, чтобы долго не думать "зачем я это сделал" :-) Банки переключаю часто чтобы в точности по алгоритму идти. Сама схема простая - Источник напряжения +5 подается через потенциометр на AN0. Соответственно на AN0 можно получать от 0 до +5В. Моделирую в Proteus.

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru