Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
6-1137397801
Pazitron_Brain
2006-01-16 10:50
2006.04.30
Как организовать чат с использованием TClientSocket и TServerSock


4-1139480715
van_der_alex
2006-02-09 13:25
2006.04.30
отследить ЧТЕНИЕ определенного файла


1-1143104050
Нулевой
2006-03-23 11:54
2006.04.30
Не получается загрузить иконку размером 48х48 !


2-1145028230
elfebet
2006-04-14 19:23
2006.04.30
как при помощи IdHTTP запустить браузер по умолчанию?


2-1144940158
тим
2006-04-13 18:55
2006.04.30
real &amp; integer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский