Вопрос с АЦП для 1886ВЕ2

Ответить
Фёдор
Сообщения: 28
Зарегистрирован: 2012-мар-14 13:36

Вопрос с АЦП для 1886ВЕ2

Сообщение Фёдор » 2012-авг-31 19:58

Товарищи!
Помогите разобраться.Решил написать программу с АЦП,взяв за основу програььу "DEMO" для EVAL8
и выкинув оттуда всё,что мне пока не требуется.
Кстати о программе.с одной стороны хооршо,что позволяет показать возможности МС,с другой стороны неподготовленному человеку очень непросто разобраться, что и как
В моей программе (с двоично-десятичным преобразованием и динамической индикацией) АЦП работает как-то странно
Выводится (при вращении потенциометра) только крайние значения (0 и 255)
Текст программы прилагаю


include <1886VE2M.INC>
; *******************************************************************************
;Это есть попытка отредактировать программу DEMO для работы
;в режиме АЦП и динамической индикации
; Назначение портов микроконтроллера:
; RA0 (вх.) не используется подключен к GND
; RA1 (вх.) подключен генератор 8МГц (для программирования)
; RA2,3 (вых.=0) не подключен
; RA4 (вх./вых.) последовательные данные (для программирования)
; RA5 (вх.) синхросигнал (для программирования)
; RB0,1 (вых.=0) не подключен
; RB4,5,6,7 (вых.=0) не подключен
; RC0-RC7 (вых.) сегменты (аноды) LED индикатора
; RD0-RD7 (вых.) разряды (катоды) LED индикатора
; RE0-RE3 (вх.) подключены 4 клавиши
; RF0-RF7 (вых.) подключена линейка светодиодов
; RG0 (вых.=0) не подключен
; RG1 (аналоговый вход) вход АЦП
; RG2,3,4,5 (вых.=0) не подключен
; RG6 (вход) вход последовательных данных приемника USART2
; RG7 (выход) выход последовательных данных передатчика USART2
; *******************************************************************************

PAUSE EQU 058H ; счетчик паузы (8 секунд) для отображения данных переданных из
DL_ADC EQU 061H ; буфер для младшего байта данных с АЦП
DH_ADC EQU 062H ; буфер для старшего байта данных с АЦП
des EQU 021H ; регистр десяток
sto EQU 022H ; регистр сотен
ed EQU 023H ; регистр единиц
ind EQU 024H ; регистр индикации
; ************************************************************************************

ORG 0000H

Start: BSF CPUSTA,GLINTD ; запрет всех прерываний
CLRF BSR,F ; установка SFR и GPR Bank 0
GOTO Start0



; *************************************************************************************
; Подпрограмма знакогенератора
; перекодирует коды 0-9, A, B, C, D, E, F в коды их изображения на семисегментном индикаторе
; *************************************************************************************
ZNGen: ANDLW 0FH
ADDWF PCL,F
RETLW 03FH ; "0"
RETLW 006H ; "1"
RETLW 05BH ; "2"
RETLW 04FH ; "3"
RETLW 066H ; "4"
RETLW 06DH ; "5"
RETLW 07DH ; "6"
RETLW 007H ; "7"
RETLW 07FH ; "8"
RETLW 06FH ; "9"
RETLW 077H ; "A"
RETLW 07CH ; "b"
RETLW 039H ; "C"
RETLW 05EH ; "d"
RETLW 079H ; "E"
RETLW 071H ; "F"

; *************************************************************************************
; Подпрограмма вычисления физического адреса разряда индикатора
; *************************************************************************************
; *************************************************************************************
; Прерывания от таймера TMR3 (частота прерываний 500 гц).
; *************************************************************************************
Start0:
;--------------------------------------------------------------
;ВНИМАНИЕ пошла часть связанная с работой АЦП
;--------------------------------------------------------------
; Подготовка АЦП к запуску.
MOVLB 05H ; установка SFR Bank 5
MOVLW 6AH ; задание Fosc/32, правое выравнивание результата,
MOVWF ADCON1 ; конфигурации порта АЦП, опорное напряжение AVdd и AVss
MOVLW 21H
MOVWF ADCON0 ; выбор рабочего канала и включение АЦП


; Дополнительная пауза ~20 мкс для заряда входной емкости АЦП.
MOVLW 26
MOVWF PAUSE
INT35: DECFSZ PAUSE,F
GOTO INT35
BSF ADCON0,GO; (установка бита ADCON0,GO_DONE) ЗАПУСК преобразования АЦП

; **************************************************************************************
; **************************************************************************************
; Начальная установка портов ввода/вывода, внутренних регистров и т.д.
CLRF PORTA,F ; сброс порта PORTA

MOVLB 01H ; * установка SFR Bank 1
CLRF DDRC,F ; PORTC - выходы
CLRF PORTC,F ; сброс порта PORTC-ИнформационныЯ взоды индикатора

CLRF DDRD,F ; PORTD - катодныЯ выходы индикатора
CLRF PORTD,F ; сброс порта PORTD
MOVLB 05H ; * установка SFR Bank 5
clrf DDRF;Все выводы Ф-на ВыхлдЪ
movlw b'10101010';проверка предположения на счёт инверсии ЛЕД-выходов
movwf PORTF
CLRF PORTG,F ; сброс порта PORTG
MOVLW 42H
MOVWF DDRG ; PORTG0,2,3,4,5,7 - выходы, PORTG1,6 - входы

;MOVLW 6AH ; Начальная установка АЦП и аналоговых входов
;MOVWF ADCON1 ; прогр.аналоговых входов (PORTF4,5,6 PORTG1,2,3)
;MOVLW 20H
;MOVWF ADCON0 ; начальное программирование АЦП (выключение)

;BCF CPUSTA,GLINTD ; () разрешение не замаскированных прерываний На всякий случай пропустим

M200 bsf ADCON0,GO/DONE; Проверка окончания преобразования АЦП, передача результатов в USART, вывод на экран.
;M200: BTFSS PIR2,ADIF ;проверка флага окончания преобразования АЦП (SFR Bank 4)
;GOTO M200
BCF PIR2, ADIF ; (,ADIF) сброс флага окончания преобразования АЦП
;По-видимому идёт речь о работе прерываний от АЦП и переключении режима ЧАСЫ-АЦП
MOVLB 05H ; установка SFR Bank 5
MOVPF ADRESL,DL_ADC ; пересылка младшего байта данных с АЦП в буферную ячейку
MOVPF ADRESH,DH_ADC ; пересылка старшего байта данных с АЦП в буферную ячейку
BCF ADCON0,ADON ; (ADCON0,ADON) выключение модуля АЦП

MOVFP DH_ADC,WREG ; вывод данных с АЦП на экран индикатора

call dvades
CALL ZNGen
movfp DL_ADC,WREG
swapf DL_ADC,W
call dvades
CALL ZNGen ; в шестнадцатеричном виде (например: AdC=3FFh) wapf DL_ADC,W

;///////////////////////////////////////////////////////////////////////////////////
;Начало вывода данных на индикатор
;//////////////////////////////////////////////////////////////////////////////////
movlb 01h;во банкЪ1
movwf PORTC;выдать данныя на индикатор
movlw 08h;включить первый идикатор
movwf PORTD
MOVLW 26
MOVWF PAUSE
INT36: DECFSZ PAUSE,F
goto INT36
;-------------------------------------------------------------------------
movfp des,WREG;предать данныя десяток
CALL ZNGen ; в шестнадцатеричном виде (например: AdC=3FFh)
movwf PORTC;передать данныя десяток на индикатор
movlw 04h;включить второй идикатор
movwf PORTD
MOVLW 26
MOVWF PAUSE
INT37: DECFSZ PAUSE,F
goto INT37
;-------------------------------------------------------------------------
movfp ed,WREG
CALL ZNGen ; в шестнадцатеричном виде (например: AdC=3FFh)
movwf PORTC;передать данные единиц на индикатор
movlw 02h;включить третий индикатор
movwf PORTD
MOVLW 26
MOVWF PAUSE
INT38: DECFSZ PAUSE,F
goto INT38
MOVFP DL_ADC,WREG ; вывод данных с АЦП на экран индикатора
movlb 05h;перейти в банкъ5
movwf PORTF;зажечь ЛЕД-индикаторы
call ADC;К ПП ADC
goto Start0
dvades
;******************************************************
;ПП ввода данных на 7-инд и преобразования 2-10
;******************************************************
clrf sto
clrf des
clrf ed
;movlw 79H;ВНИМАНИЕ-эта запись только для анализа
movwf ind
movlw 64H;записать 100 во ВРЕГЪ
;------------------------------------------------------
sub100
subwf ind,F;произвести вычитание
btfss ALUSTA,C;проверить флаг С
goto sub10
incf sto;прибавить в разряд 100-единицу
goto sub100;перейти к ПП десяток
movlw 0AH;поместить 10 во ВРЕГъ
;------------------------------------------------------
sub10
movlw 064H;восстановление регистра ИНДФ
addwf ind
movlw 0AH;запись 10
subb10
subwf ind,F;произвести вычитание
btfss ALUSTA,C;проверить флаг С
goto sub1
incf des;прибавить в разряд 10-единицу
goto subb10;перейти к ПП десяток
movlw 01H;запись "1" во ВРЕГъ
;------------------------------------------------------
sub1
movlw 0AH;восстановление регистра
addwf ind
movlw 01H;запись 1 в вычитататель
subb1
subwf ind,F;произвести вычитание
btfss ALUSTA,C;проверить флаг С
goto zng
incf ed;прибавить в разряд 10-единицу
goto subb1
zng
MOVFP sto,WREG ;переместить содержимое единиц во ВРЕГъ
return
ADC
;///////////////////////////////////////
;ПП вывод на индикатор символа "АДЦ="
;///////////////////////////////////////

MOVLW 077H;А
movlb 01H;во банкЪ1
movwf PORTC;Вывести на индикатор "А"
movlw 040H;включить четвёртый индикатор
movwf PORTD
call pause;вызвать задержку
MOVLW 05EH;Д
movwf PORTC;вывести данные на индикатор
movlw 20H;включить пятый индикатор
movwf PORTD
call pause
MOVLW 039H;С
movwf PORTC;вывести данные на индикаторы
movlw 010H;включить шестой индикатор
movwf PORTD
call pause
MOVLW 048H;=
movwf PORTC;вывести данныя на индикатор
movlw 01h
movwf PORTD
call pause
goto Start
;//////////////////////////////////////////////////////////////
pause;ввод задержки
;///////////////////////////////////////////////////////////////

MOVLW 26
MOVWF PAUSE
del
DECFSZ PAUSE,F
GOTO del
return

END

Вернуться в «8-разрядные микроконтроллеры серии 1886ВЕх»